d773839ed4854c715d141d14977242d31b794e1b
[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
14     node = ctx.node()
15     stdin = f"""
16         init {node}
17         set Port 0
18         set Address localhost
19         set DeviceType dummy
20         set AutoConnect no
21     """
22     node.cmd(stdin=stdin)
23     return node
24
25
26 def test_network(foo: Tinc) -> None:
27     """Test command 'network'."""
28
29     _, err = foo.cmd("network", "foo", "bar", code=1)
30     check.is_in("Too many arguments", err)
31
32     _, err = foo.cmd("network", "foo./", code=1)
33     check.is_in("Invalid character in netname", err)
34
35     _, err = foo.cmd("network", "foo.<")
36     check.is_in("unsafe character in netname", err)
37
38
39 def run_tests(foo: Tinc, bar: Tinc) -> None:
40     """Run tests."""
41
42     log.info("start nodes")
43     foo.start()
44     bar.start()
45     check.nodes(foo, 1)
46
47     log.info("test failing commands")
48     _, err = foo.cmd("connect", code=1)
49     check.is_in("Invalid number of arguments", err)
50
51     _, err = foo.cmd("connect", "foo", "bar", code=1)
52     check.is_in("Invalid number of arguments", err)
53
54     _, err = foo.cmd("connect", f"{bar}@", code=1)
55     check.is_in("Invalid name for node", err)
56
57     log.info("connect nodes")
58     foo.add_script(bar.script_up)
59     cmd.exchange(foo, bar)
60
61     # Implement REQ_CONNECT and update this
62     log.info("test connect")
63     _, err = foo.cmd("connect", bar.name, code=1)
64     check.is_in("Could not connect to", err)
65
66     log.info("connect nodes")
67     foo.cmd("add", "ConnectTo", bar.name)
68     foo.cmd("retry")
69     foo[bar.script_up].wait()
70     check.nodes(foo, 2)
71
72     log.info("disconnect nodes")
73     foo.add_script(bar.script_down)
74     foo.cmd("disconnect", bar.name)
75     foo[bar.script_down].wait()
76     check.nodes(foo, 1)
77
78     log.info("second disconnect must fail")
79     _, err = foo.cmd("disconnect", bar.name, code=1)
80     check.is_in("Could not disconnect", err)
81
82     log.info("retry connections")
83     foo.cmd("retry")
84     foo[bar.script_up].wait()
85     check.nodes(foo, 2)
86
87     log.info("purge old connections")
88     bar.cmd("stop")
89     foo[bar.script_down].wait()
90     foo.cmd("purge")
91
92     for command, result in ("nodes", 1), ("edges", 0), ("subnets", 4):
93         out, _ = foo.cmd("dump", command)
94         check.lines(out, result)
95
96     test_network(foo)
97
98
99 with Test("run network tests") as context:
100     run_tests(init(context), init(context))