3 """Test network control commands."""
5 from testlib import check, cmd
6 from testlib.log import log
7 from testlib.proc import Tinc
8 from testlib.test import Test
11 def init(ctx: Test) -> Tinc:
12 """Initialize a node."""
13 return ctx.node(init="set AutoConnect no")
16 def test_network(foo: Tinc) -> None:
17 """Test command 'network'."""
19 _, err = foo.cmd("network", "foo", "bar", code=1)
20 check.is_in("Too many arguments", err)
22 _, err = foo.cmd("network", "foo./", code=1)
23 check.is_in("Invalid character in netname", err)
25 _, err = foo.cmd("network", "foo.<")
26 check.is_in("unsafe character in netname", err)
29 def run_tests(foo: Tinc, bar: Tinc) -> None:
32 log.info("start nodes")
37 log.info("test failing commands")
38 _, err = foo.cmd("connect", code=1)
39 check.is_in("Invalid number of arguments", err)
41 _, err = foo.cmd("connect", "foo", "bar", code=1)
42 check.is_in("Invalid number of arguments", err)
44 _, err = foo.cmd("connect", f"{bar}@", code=1)
45 check.is_in("Invalid name for node", err)
47 log.info("connect nodes")
48 foo.add_script(bar.script_up)
49 cmd.exchange(foo, bar)
51 # Implement REQ_CONNECT and update this
52 log.info("test connect")
53 _, err = foo.cmd("connect", bar.name, code=1)
54 check.is_in("Could not connect to", err)
56 log.info("connect nodes")
57 foo.cmd("add", "ConnectTo", bar.name)
59 foo[bar.script_up].wait()
62 log.info("disconnect nodes")
63 foo.add_script(bar.script_down)
64 foo.cmd("disconnect", bar.name)
65 foo[bar.script_down].wait()
68 log.info("second disconnect must fail")
69 _, err = foo.cmd("disconnect", bar.name, code=1)
70 check.is_in("Could not disconnect", err)
72 log.info("retry connections")
74 foo[bar.script_up].wait()
77 log.info("purge old connections")
79 foo[bar.script_down].wait()
82 for command, result in ("nodes", 1), ("edges", 0), ("subnets", 4):
83 out, _ = foo.cmd("dump", command)
84 check.lines(out, result)
89 with Test("run network tests") as context:
90 run_tests(init(context), init(context))