Add tests for some device & address variables
[tinc] / test / integration / device_raw_socket.py
1 #!/usr/bin/env python3
2
3 """Test raw socket device support."""
4
5 import sys
6 import subprocess as subp
7
8 from testlib import check, util
9 from testlib.log import log
10 from testlib.const import EXIT_SKIP
11 from testlib.proc import Script
12 from testlib.test import Test
13 from testlib.external import veth_add, move_dev, ping
14
15 util.require_root()
16 util.require_command("ip", "link")
17
18 FAKE_DEV = "cqhqdr7knaLzYeMSdy"
19
20 IP_NETNS = "10.198.96.1"
21 IP_HOST = "10.198.96.2"
22
23
24 def test_device_raw_socket(ctx: Test) -> None:
25     """Test raw socket device."""
26
27     foo = ctx.node(init="set DeviceType raw_socket")
28     foo_log = foo.sub("log")
29
30     log.info("test with a bad Interface")
31     _, err = foo.cmd("start", "-o", f"Interface={FAKE_DEV}", code=1)
32     if "Raw socket device not supported" in err:
33         sys.exit(EXIT_SKIP)
34     check.is_in(f"Can't find interface {FAKE_DEV}", err)
35
36     log.info("create a veth pair")
37     dev0, dev1 = util.random_string(10), util.random_string(10)
38     veth_add(dev0, dev1)
39
40     log.info("configure the veth pair")
41     move_dev(dev1, dev1, f"{IP_NETNS}/30")
42     subp.run(["ip", "addr", "add", f"{IP_HOST}/30", "dev", dev0], check=True)
43     subp.run(["ip", "link", "set", dev0, "up"], check=True)
44
45     log.info("set Interface and Device")
46     foo.cmd("set", "Interface", dev0)
47     foo.cmd("set", "Device", f"dev_{dev0}")
48     foo.add_script(Script.TINC_UP)
49
50     log.info("start tincd")
51     _, err = foo.cmd("start", "--logfile", foo_log, "-d10")
52     check.is_in(f"dev_{dev0} is a raw_socket", err)
53
54     log.info("send some data to tincd interface")
55     foo[Script.TINC_UP].wait()
56     assert ping(IP_NETNS)
57
58     log.info("stop tincd")
59     foo.add_script(Script.TINC_DOWN)
60     foo.cmd("stop")
61     foo[Script.TINC_DOWN].wait()
62
63     log.info("check that tincd received some data")
64     check.in_file(foo_log, "Writing packet of")
65     check.in_file(foo_log, "Read packet of")
66
67
68 with Test("test raw socket device") as context:
69     test_device_raw_socket(context)