2 # pylint: disable=import-outside-toplevel
4 """Test tinc peer invitations."""
6 from testlib import check, util
7 from testlib.log import log
8 from testlib.test import Test
11 def run_invite_test(ctx: Test, start_before_invite: bool) -> None:
12 """Run tests. If start_before_invite is True,
13 tincd is started *before* creating invitation, and vice versa.
15 foo, bar = ctx.node(), ctx.node()
27 if start_before_invite:
30 log.info("create invitation")
31 foo_invite, _ = foo.cmd("invite", bar.name)
33 foo_invite = foo_invite.strip()
35 if not start_before_invite:
37 foo_invite = foo_invite.replace(":0/", f":{port}/")
39 log.info("join second node with %s", foo_invite)
40 bar.cmd("join", foo_invite)
41 bar.cmd("set", "Port", "0")
43 if not start_before_invite:
44 log.info("%s thinks %s is using port 0, updating", bar, foo)
45 bar.cmd("set", f"{foo}.Port", str(port))
47 log.info("compare configs")
48 check.files_eq(foo.sub("hosts", foo.name), bar.sub("hosts", foo.name))
50 log.info("compare keys")
52 prefix = "Ed25519PublicKey"
53 foo_key = util.find_line(foo.sub("hosts", bar.name), prefix)
54 bar_key = util.find_line(bar.sub("hosts", bar.name), prefix)
55 check.equals(foo_key, bar_key)
57 log.info("checking Mode")
58 bar_mode, _ = bar.cmd("get", "Mode")
59 check.equals("switch", bar_mode.strip())
61 log.info("checking Broadcast")
62 bar_bcast, _ = bar.cmd("get", "Broadcast")
63 check.equals("no", bar_bcast.strip())
65 log.info("checking ConnectTo")
66 bar_conn, _ = bar.cmd("get", "ConnectTo")
67 check.equals(foo.name, bar_conn.strip())
69 log.info("configuring %s", bar.name)
70 bar.cmd("set", "DeviceType", "dummy")
72 log.info("adding scripts")
73 foo.add_script(bar.script_up)
74 bar.add_script(foo.script_up)
76 log.info("starting %s", bar.name)
79 log.info("waiting for nodes to come up")
80 foo[bar.script_up].wait()
81 bar[foo.script_up].wait()
83 log.info("checking required nodes")
88 with Test("offline mode") as context:
89 run_invite_test(context, start_before_invite=False)
91 with Test("online mode") as context:
92 run_invite_test(context, start_before_invite=True)