def testfunc(child): global sniffer tap = get_bridge(os.environ["TAP"]) child.sendline("unittests") check_unittests(child) # wait for and check result of unittests print("." * int(child.match.group(1)), end="", flush=True) lladdr_src = get_host_lladdr(tap) child.sendline("ifconfig") child.expect(r"HWaddr: (?P<hwaddr>[A-Fa-f:0-9]+)\s") hwaddr_dst = child.match.group("hwaddr").lower() child.expect(r"(?P<lladdr>fe80::[A-Fa-f:0-9]+)\s") lladdr_dst = child.match.group("lladdr").lower() sniffer = Sniffer(tap) sniffer.start() def run(func): if child.logfile == sys.stdout: func(child, tap, hwaddr_dst, lladdr_dst, lladdr_src) else: try: func(child, tap, hwaddr_dst, lladdr_dst, lladdr_src) print(".", end="", flush=True) except Exception as e: print("FAILED") raise e run(test_wrong_type) run(test_seg_left_gt_len_addresses) run(test_multicast_dst) run(test_multicast_addr) run(test_multiple_addrs_of_mine_uncomp) run(test_forward_uncomp) run(test_forward_uncomp_not_first_ext_hdr) # compressed tests hard to implement with scapy and also covered in # unittests run(test_seq_left_0) run(test_time_exc) print("SUCCESS") sniffer.stop()
def testfunc(child): # embUnit tests check_unittests(child) # output cross-checked hex data with WireShark -> "Import from Hex Dump..." # test_netapi_send__raw_unicast_ethernet_packet child.expect("Sending data from Ethernet device:") child.expect("00000000 3E E6 B5 0F 19 23 3E E6 B5 22 FD 0A FF FF 41 42") child.expect("00000010 43 44 45 46 47 00") # test_netapi_send__raw_broadcast_ethernet_packet child.expect("Sending data from Ethernet device:") child.expect("00000000 FF FF FF FF FF FF 3E E6 B5 22 FD 0A FF FF 41 42") child.expect("00000010 43 44 45 46 47 00") # test_netapi_send__raw_unicast_ieee802154_long_long_packet child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 DC 00 00 00 0B FD 22 19 0F B5 E6 3E 0A FD 22") child.expect("00000010 19 0F B5 E6 3E 31 32 33 41 42 43 44 45 46 47 00") # test_netapi_send__raw_unicast_ieee802154_long_short_packet child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 D8 01 00 00 0B FD 0A FD 22 19 0F B5 E6 3E 31") child.expect("00000010 32 33 41 42 43 44 45 46 47 00") # test_netapi_send__raw_unicast_ieee802154_short_long_packet1 child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 9C 02 00 00 0B FD 22 19 0F B5 E6 3E 0A FD 31") child.expect("00000010 32 33 41 42 43 44 45 46 47 00") # test_netapi_send__raw_unicast_ieee802154_short_long_packet2 child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 9C 03 00 00 0B FD 22 19 0F B5 E6 3E 0A FD 31") child.expect("00000010 32 33 41 42 43 44 45 46 47 00") # test_netapi_send__raw_unicast_ieee802154_short_short_packet child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 98 04 00 00 0B FD 0A FD 31 32 33 41 42 43 44") child.expect("00000010 45 46 47 00") # test_netapi_send__raw_broadcast_ieee802154_long_packet child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 D8 05 00 00 FF FF 0A FD 22 19 0F B5 E6 3E 31") child.expect("00000010 32 33 41 42 43 44 45 46 47 00") # test_netapi_send__raw_broadcast_ieee802154_short_packet child.expect(r"Sending data from IEEE 802\.15\.4 device:") child.expect("00000000 41 98 06 00 00 FF FF 0A FD 31 32 33 41 42 43 44") child.expect("00000010 45 46 47 00") # test_netapi_send__ipv6_unicast_ethernet_packet child.expect("Sending data from Ethernet device:") child.expect("00000000 3E E6 B5 0F 19 23 3E E6 B5 22 FD 0A 86 DD 60 00") child.expect("00000010 00 00 00 08 3B 40 FE 80 00 00 00 00 00 00 3C E6") child.expect("00000020 B5 FF FE 22 FD 0A FE 80 00 00 00 00 00 00 3C E6") child.expect("00000030 B5 FF FE 0F 19 23 41 42 43 44 45 46 47 00") # test_netapi_send__ipv6_multicast_ethernet_packet child.expect("Sending data from Ethernet device:") child.expect("00000000 33 33 00 00 00 01 3E E6 B5 22 FD 0A 86 DD 60 00") child.expect("00000010 00 00 00 08 3B 40 FE 80 00 00 00 00 00 00 3C E6") child.expect("00000020 B5 FF FE 22 FD 0A FF 02 00 00 00 00 00 00 00 00") child.expect("00000030 00 00 00 00 00 01 41 42 43 44 45 46 47 00") # test_netapi_send__ipv6_unicast_ieee802154_packet child.expect("Sending data from IEEE 802.15.4 device:") child.expect("00000000 41 DC 07 00 00 0B FD 22 19 0F B5 E6 3E 0A FD 22") child.expect("00000010 19 0F B5 E6 3E 60 00 00 00 00 08 3B 40 FE 80 00") child.expect("00000020 00 00 00 00 00 3C E6 B5 0F 19 22 FD 0A FE 80 00") child.expect("00000030 00 00 00 00 00 3C E6 B5 FF FE 0F 19 23 41 42 43") child.expect("00000040 44 45 46 47 00") # test_netapi_send__ipv6_multicast_ieee802154_packet child.expect("Sending data from IEEE 802.15.4 device:") child.expect("00000000 41 D8 08 00 00 FF FF 0A FD 22 19 0F B5 E6 3E 60") child.expect("00000010 00 00 00 00 08 3B 40 FE 80 00 00 00 00 00 00 3C") child.expect("00000020 E6 B5 0F 19 22 FD 0A FF 02 00 00 00 00 00 00 00") child.expect("00000030 00 00 00 00 00 00 01 41 42 43 44 45 46 47 00") # test_netapi_recv__empty_ethernet_payload child.expect("pktdump dumping Ethernet packet with empty payload") child.expect("PKTDUMP: data received:") child.expect(r"~~ SNIP 0 - size: 0 byte, type: NETTYPE_UNDEF \(0\)") child.expect(r"00000000~~ SNIP 1 - size: \d+ byte, type: NETTYPE_NETIF \(-1\)") child.expect(r"if_pid: (\d+) rssi: -?\d+ lqi: \d+") assert 0 < int(child.match.group(1)) child.expect("flags: 0x0") child.expect("src_l2addr: 3E:E6:B5:22:FD:0B") child.expect("dst_l2addr: 3E:E6:B5:22:FD:0A") child.expect(r"~~ PKT - 2 snips, total size: \d+ byte") # test_netapi_recv__empty_ieee802154_payload child.expect(r"pktdump dumping IEEE 802\.15\.4 packet with empty payload") child.expect("PKTDUMP: data received:") child.expect(r"~~ SNIP 0 - size: 0 byte, type: NETTYPE_UNDEF \(0\)") child.expect(r"00000000~~ SNIP 1 - size: \d+ byte, type: NETTYPE_NETIF \(-1\)") child.expect(r"if_pid: (\d+) rssi: -?\d+ lqi: \d+") assert 0 < int(child.match.group(1)) child.expect("flags: 0x0") child.expect("src_l2addr: 3E:E6:B5:0F:19:22:FD:0B") child.expect("dst_l2addr: 3E:E6:B5:0F:19:22:FD:0A") child.expect(r"~~ PKT - 2 snips, total size: \d+ byte") # test_netapi_recv__raw_ethernet_payload child.expect("pktdump dumping Ethernet packet with payload 12 34 45 56") child.expect("PKTDUMP: data received:") child.expect(r"~~ SNIP 0 - size: 4 byte, type: NETTYPE_UNDEF \(0\)") child.expect("00000000 12 34 45 56") child.expect(r"~~ SNIP 1 - size: \d+ byte, type: NETTYPE_NETIF \(-1\)") child.expect(r"if_pid: (\d+) rssi: -?\d+ lqi: \d+") assert 0 < int(child.match.group(1)) child.expect("flags: 0x0") child.expect("src_l2addr: 3E:E6:B5:22:FD:0B") child.expect("dst_l2addr: 3E:E6:B5:22:FD:0A") child.expect(r"~~ PKT - 2 snips, total size: \d+ byte") # test_netapi_recv__raw_ieee802154_payload child.expect(r"pktdump dumping IEEE 802\.15\.4 packet with payload 12 34 45 56") child.expect("PKTDUMP: data received:") child.expect(r"~~ SNIP 0 - size: 4 byte, type: NETTYPE_UNDEF \(0\)") child.expect("00000000 12 34 45 56") child.expect(r"~~ SNIP 1 - size: \d+ byte, type: NETTYPE_NETIF \(-1\)") child.expect(r"if_pid: (\d+) rssi: -?\d+ lqi: \d+") assert 0 < int(child.match.group(1)) child.expect("flags: 0x0") child.expect("src_l2addr: 3E:E6:B5:0F:19:22:FD:0B") child.expect("dst_l2addr: 3E:E6:B5:0F:19:22:FD:0A") child.expect(r"~~ PKT - 2 snips, total size: \d+ byte") # test_netapi_recv__ipv6_ethernet_payload child.expect("pktdump dumping IPv6 over Ethernet packet with payload 01") child.expect("PKTDUMP: data received:") # payload not dumped because not parsed yet, but header looks okay, so let's # assume the payload is as well child.expect(r"~~ SNIP 0 - size: 41 byte, type: NETTYPE_IPV6 \(2\)") child.expect(r"traffic class: 0x00 \(ECN: 0x0, DSCP: 0x00\)") child.expect("flow label: 0x00000") child.expect("length: 1 next header: 59 hop limit: 64") child.expect("source address: fe80::3fe6:b5ff:fe22:fd0a") child.expect("destination address: fe80::3fe6:b5ff:fe22:fd0b") child.expect(r"~~ SNIP 1 - size: \d+ byte, type: NETTYPE_NETIF \(-1\)") child.expect(r"if_pid: (\d+) rssi: -?\d+ lqi: \d+") assert 0 < int(child.match.group(1)) child.expect("flags: 0x0") child.expect("src_l2addr: 3E:E6:B5:22:FD:0B") child.expect("dst_l2addr: 3E:E6:B5:22:FD:0A") child.expect(r"~~ PKT - 2 snips, total size: \d+ byte")
def testfunc(child): debug_enabled = child.expect([ r"OK \(\d+ tests\)", r"6lo iphc: VRB present, trying to create entry for dst 2001:db8::2", ]) if debug_enabled: # only import scapy dependency if DEBUG_ENABLE=1 from scapy.all import SixLoWPAN, LoWPANFragmentationFirst, \ LoWPAN_IPHC, IPv6, ICMPv6EchoRequest # test_recv__success child.expect_exact("6lo iphc: found route, trying to forward") child.expect( r"6lo iphc: Do not know how to forward fragment from " r"\((?P<vrb_src>[a-fA-F0-9:]+), (?P<vrb_src_tag>\d+)\) to " r"\((?P<vrb_dst>[a-fA-F0-9:]+), (?P<vrb_dst_tag>\d+)\)") vrb_src_tag = int(child.match.group("vrb_src_tag")) child.expect_exact("Original fragmentation header:") child.expect("(?P<hex>( [A-Fa-f0-9]{2})+)") frag = SixLoWPAN(bytes.fromhex(child.match.group("hex"))) assert LoWPANFragmentationFirst in frag assert frag[LoWPANFragmentationFirst].datagramTag == vrb_src_tag stream = "" child.expect_exact("IPHC headers + payload:") for _ in range(7): child.expect("(?P<hex>( [A-Fa-f0-9]{2})+)") stream += child.match.group("hex") iphc = SixLoWPAN(bytes.fromhex(stream)) assert LoWPAN_IPHC in iphc assert IPv6 in iphc # The IPHC header after compression assert ICMPv6EchoRequest in iphc # check against fields of original fragment specified in main.c assert iphc[LoWPAN_IPHC].tf == 0x3 assert iphc[LoWPAN_IPHC].nh == 0b0 # Inline (ICMPv6) assert iphc[LoWPAN_IPHC].hlim == 0b00 # Inline as it was decremented assert not iphc[LoWPAN_IPHC].cid assert iphc[LoWPAN_IPHC].sac == 0b0 # Stateless assert iphc[LoWPAN_IPHC].sam == 0b00 # Inline assert not iphc[LoWPAN_IPHC].m # not multicast assert iphc[LoWPAN_IPHC].dac == 0b0 # Stateless assert iphc[LoWPAN_IPHC].dam == 0b00 # Inline assert iphc[IPv6].src == "2001:db8::1" assert iphc[IPv6].dst == "2001:db8::2" assert iphc[IPv6].hlim == (64 - 1) # hop limit was decremented assert iphc[ICMPv6EchoRequest].code == 0 assert iphc[ICMPv6EchoRequest].cksum == 0x8ea0 assert iphc[ICMPv6EchoRequest].id == 0x238f assert iphc[ICMPv6EchoRequest].seq == 2 assert iphc[ICMPv6EchoRequest].data.startswith( bytes.fromhex("9d4bb21c5353535353535353535353535353535353535353")) # test_recv__no_route child.expect_exact( "6lo iphc: VRB present, trying to create entry for dst 2001:db8::2" ) child.expect_exact( "6lo iphc: no route found, reassemble datagram normally") # test_recv__vrb_full child.expect_exact( "6lo iphc: VRB present, trying to create entry for dst 2001:db8::2" ) child.expect_exact( "6lo iphc: no route found, reassemble datagram normally") # test_recv__pkt_held child.expect_exact("6lo iphc: found route, trying to forward") child.expect( r"6lo iphc: Do not know how to forward fragment from " r"\((?P<vrb_src>[a-fA-F0-9:]+), (?P<vrb_src_tag>\d+)\) to " r"\((?P<vrb_dst>[a-fA-F0-9:]+), (?P<vrb_dst_tag>\d+)\)") child.expect_exact("Original fragmentation header:") child.expect_exact("IPHC headers + payload:") check_unittests(child) assert int(child.match.group(1)) >= 4
def testfunc(child): board = os.environ['BOARD'] # Increase timeout on "real" hardware timeout = 120 if board != 'native' else -1 check_unittests(child, timeout=timeout)
def testfunc(child): # embUnit tests check_unittests(child)
def testfunc(child): tap = get_bridge(os.environ["TAP"]) child.sendline("unittests") check_unittests(child) # wait for and check result of unittests print("." * int(child.match.group(1)), end="", flush=True) lladdr_src = get_host_lladdr(tap) def run_sock_test(func, s): if child.logfile == sys.stdout: func(child, s, tap, lladdr_src) else: try: func(child, s, tap, lladdr_src) print(".", end="", flush=True) except PermissionError: print("\n\x1b[1;33mSkipping {} because of missing " "privileges\x1b[0m".format(func.__name__)) except Exception as e: print("FAILED") raise e child.sendline("send-test-pkt") child.expect(r"Sending UDP test packets to port (\d+)\r\n") port = int(child.match.group(1)) with socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) as s: res = socket.getaddrinfo("{}%{}".format(lladdr_src, tap), port) s.bind(res[0][4]) s.settimeout(.3) run_sock_test(test_ipv6_ext_frag_shell_test_0, s) run_sock_test(test_ipv6_ext_frag_shell_test_1, s) run_sock_test(test_ipv6_ext_frag_send_success, s) run_sock_test(test_ipv6_ext_frag_send_last_fragment_filled, s) run_sock_test(test_ipv6_ext_frag_send_last_fragment_only_one_byte, s) run_sock_test(test_ipv6_ext_frag_send_full_pktbuf, s) run_sock_test(test_ipv6_ext_frag_fwd_success, s) run_sock_test(test_ipv6_ext_frag_fwd_too_big, s) if os.environ.get("BOARD", "") != "native": # ethos currently can't handle the larger, rapidly sent packets by the # IPv6 fragmentation of the Linux Kernel print("SUCCESS") print("Skipping datagram reception tests due to ethos bug.") return # datagram reception tests res = 1 count = 0 while res: # check `ifconfig` and also get addresses from it until # link-local address becomes valid time.sleep(1) child.sendline("ifconfig") child.expect(r"HWaddr: (?P<hwaddr>[A-Fa-f:0-9]+)\s") hwaddr_dst = child.match.group("hwaddr").lower() res = child.expect([ r"(?P<lladdr>fe80::[A-Fa-f:0-9]+)\s+scope:\s+link\s+VAL", pexpect.TIMEOUT ]) count += 1 if res and (count > 5): raise pexpect.TIMEOUT("Link-local address did not become valid") lladdr_dst = child.match.group("lladdr").lower() def run(func): if child.logfile == sys.stdout: func(child, tap, hwaddr_dst, lladdr_dst, lladdr_src) else: try: func(child, tap, hwaddr_dst, lladdr_dst, lladdr_src) print(".", end="", flush=True) except PermissionError: print("\n\x1b[1;33mSkipping {} because of missing " "privileges\x1b[0m".format(func.__name__)) except Exception as e: print("FAILED") raise e run(test_reass_successful_udp) run(test_reass_too_short_header) run(test_reass_offset_too_large) print("SUCCESS")
def test_embedded_unittests(self): self.spawn.sendline("unittests") check_unittests(self.spawn)