Add tests for some device & address variables
[tinc] / test / integration / cmd_net.py
1 #!/usr/bin/env python3
2
3 """Test network control commands."""
4
5 from testlib import check, cmd
6 from testlib.log import log
7 from testlib.proc import Tinc
8 from testlib.test import Test
9
10
11 def init(ctx: Test) -> Tinc:
12     """Initialize a node."""
13     return ctx.node(init="set AutoConnect no")
14
15
16 def test_network(foo: Tinc) -> None:
17     """Test command 'network'."""
18
19     _, err = foo.cmd("network", "foo", "bar", code=1)
20     check.is_in("Too many arguments", err)
21
22     _, err = foo.cmd("network", "foo./", code=1)
23     check.is_in("Invalid character in netname", err)
24
25     _, err = foo.cmd("network", "foo.<")
26     check.is_in("unsafe character in netname", err)
27
28
29 def run_tests(foo: Tinc, bar: Tinc) -> None:
30     """Run tests."""
31
32     log.info("start nodes")
33     foo.start()
34     bar.start()
35     check.nodes(foo, 1)
36
37     log.info("test failing commands")
38     _, err = foo.cmd("connect", code=1)
39     check.is_in("Invalid number of arguments", err)
40
41     _, err = foo.cmd("connect", "foo", "bar", code=1)
42     check.is_in("Invalid number of arguments", err)
43
44     _, err = foo.cmd("connect", f"{bar}@", code=1)
45     check.is_in("Invalid name for node", err)
46
47     log.info("connect nodes")
48     foo.add_script(bar.script_up)
49     cmd.exchange(foo, bar)
50
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)
55
56     log.info("connect nodes")
57     foo.cmd("add", "ConnectTo", bar.name)
58     foo.cmd("retry")
59     foo[bar.script_up].wait()
60     check.nodes(foo, 2)
61
62     log.info("disconnect nodes")
63     foo.add_script(bar.script_down)
64     foo.cmd("disconnect", bar.name)
65     foo[bar.script_down].wait()
66     check.nodes(foo, 1)
67
68     log.info("second disconnect must fail")
69     _, err = foo.cmd("disconnect", bar.name, code=1)
70     check.is_in("Could not disconnect", err)
71
72     log.info("retry connections")
73     foo.cmd("retry")
74     foo[bar.script_up].wait()
75     check.nodes(foo, 2)
76
77     log.info("purge old connections")
78     bar.cmd("stop")
79     foo[bar.script_down].wait()
80     foo.cmd("purge")
81
82     for command, result in ("nodes", 1), ("edges", 0), ("subnets", 4):
83         out, _ = foo.cmd("dump", command)
84         check.lines(out, result)
85
86     test_network(foo)
87
88
89 with Test("run network tests") as context:
90     run_tests(init(context), init(context))