15b8af90fSJose Luis Duranimport pytest 25b8af90fSJose Luis Duran 35b8af90fSJose Luis Duranimport logging 45b8af90fSJose Luis Duranimport os 55b8af90fSJose Luis Duranimport re 65b8af90fSJose Luis Duranimport subprocess 75b8af90fSJose Luis Duran 85b8af90fSJose Luis Duranfrom atf_python.sys.net.vnet import IfaceFactory 95b8af90fSJose Luis Duranfrom atf_python.sys.net.vnet import SingleVnetTestTemplate 105b8af90fSJose Luis Duranfrom atf_python.sys.net.tools import ToolsHelper 115b8af90fSJose Luis Duranfrom typing import List 125b8af90fSJose Luis Duranfrom typing import Optional 135b8af90fSJose Luis Duran 145b8af90fSJose Luis Duranlogging.getLogger("scapy").setLevel(logging.CRITICAL) 155b8af90fSJose Luis Duranimport scapy.all as sc 165b8af90fSJose Luis Duran 175b8af90fSJose Luis Duran 185b8af90fSJose Luis Durandef build_response_packet(echo, ip, icmp, oip_ihl, special): 195b8af90fSJose Luis Duran icmp_id_seq_types = [0, 8, 13, 14, 15, 16, 17, 18, 37, 38] 205b8af90fSJose Luis Duran oip = echo[sc.IP] 215b8af90fSJose Luis Duran oicmp = echo[sc.ICMP] 225b8af90fSJose Luis Duran load = echo[sc.ICMP].payload 235b8af90fSJose Luis Duran oip[sc.IP].remove_payload() 245b8af90fSJose Luis Duran oicmp[sc.ICMP].remove_payload() 255b8af90fSJose Luis Duran oicmp.type = 8 265b8af90fSJose Luis Duran 275b8af90fSJose Luis Duran # As if the original IP packet had these set 285b8af90fSJose Luis Duran oip.ihl = None 295b8af90fSJose Luis Duran oip.len = None 305b8af90fSJose Luis Duran oip.id = 1 315b8af90fSJose Luis Duran oip.flags = ip.flags 325b8af90fSJose Luis Duran oip.chksum = None 335b8af90fSJose Luis Duran oip.options = ip.options 345b8af90fSJose Luis Duran 355b8af90fSJose Luis Duran # Inner packet (oip) options 365b8af90fSJose Luis Duran if oip_ihl: 375b8af90fSJose Luis Duran oip.ihl = oip_ihl 385b8af90fSJose Luis Duran 395b8af90fSJose Luis Duran # Special options 405b8af90fSJose Luis Duran if special == "no-payload": 415b8af90fSJose Luis Duran load = "" 425b8af90fSJose Luis Duran if special == "tcp": 435b8af90fSJose Luis Duran oip.proto = "tcp" 445b8af90fSJose Luis Duran tcp = sc.TCP(sport=1234, dport=5678) 455b8af90fSJose Luis Duran return ip / icmp / oip / tcp 465b8af90fSJose Luis Duran if special == "udp": 475b8af90fSJose Luis Duran oip.proto = "udp" 485b8af90fSJose Luis Duran udp = sc.UDP(sport=1234, dport=5678) 495b8af90fSJose Luis Duran return ip / icmp / oip / udp 505b8af90fSJose Luis Duran if special == "warp": 515b8af90fSJose Luis Duran # Build a package with a timestamp of INT_MAX 525b8af90fSJose Luis Duran # (time-warped package) 535b8af90fSJose Luis Duran payload_no_timestamp = sc.bytes_hex(load)[16:] 545b8af90fSJose Luis Duran load = (b"\xff" * 8) + sc.hex_bytes(payload_no_timestamp) 555b8af90fSJose Luis Duran if special == "wrong": 565b8af90fSJose Luis Duran # Build a package with a wrong last byte 575b8af90fSJose Luis Duran payload_no_last_byte = sc.bytes_hex(load)[:-2] 585b8af90fSJose Luis Duran load = (sc.hex_bytes(payload_no_last_byte)) + b"\x00" 595b8af90fSJose Luis Duran 605b8af90fSJose Luis Duran if icmp.type in icmp_id_seq_types: 615b8af90fSJose Luis Duran pkt = ip / icmp / load 625b8af90fSJose Luis Duran else: 635b8af90fSJose Luis Duran ip.options = "" 645b8af90fSJose Luis Duran pkt = ip / icmp / oip / oicmp / load 655b8af90fSJose Luis Duran return pkt 665b8af90fSJose Luis Duran 675b8af90fSJose Luis Duran 685b8af90fSJose Luis Durandef generate_ip_options(opts): 695b8af90fSJose Luis Duran if not opts: 705b8af90fSJose Luis Duran return "" 715b8af90fSJose Luis Duran 725b8af90fSJose Luis Duran routers = [ 735b8af90fSJose Luis Duran "192.0.2.10", 745b8af90fSJose Luis Duran "192.0.2.20", 755b8af90fSJose Luis Duran "192.0.2.30", 765b8af90fSJose Luis Duran "192.0.2.40", 775b8af90fSJose Luis Duran "192.0.2.50", 785b8af90fSJose Luis Duran "192.0.2.60", 795b8af90fSJose Luis Duran "192.0.2.70", 805b8af90fSJose Luis Duran "192.0.2.80", 815b8af90fSJose Luis Duran "192.0.2.90", 825b8af90fSJose Luis Duran ] 835b8af90fSJose Luis Duran routers_zero = [0, 0, 0, 0, 0, 0, 0, 0, 0] 845b8af90fSJose Luis Duran if opts == "EOL": 855b8af90fSJose Luis Duran options = sc.IPOption(b"\x00") 865b8af90fSJose Luis Duran elif opts == "NOP": 875b8af90fSJose Luis Duran options = sc.IPOption(b"\x01") 885b8af90fSJose Luis Duran elif opts == "NOP-40": 895b8af90fSJose Luis Duran options = sc.IPOption(b"\x01" * 40) 905b8af90fSJose Luis Duran elif opts == "RR": 915b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 925b8af90fSJose Luis Duran options = sc.IPOption_RR(pointer=40, routers=routers) 935b8af90fSJose Luis Duran elif opts == "RR-same": 945b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 955b8af90fSJose Luis Duran options = sc.IPOption_RR(pointer=3, routers=routers_zero) 965b8af90fSJose Luis Duran elif opts == "RR-trunc": 975b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 985b8af90fSJose Luis Duran options = sc.IPOption_RR(length=7, routers=routers_zero) 995b8af90fSJose Luis Duran elif opts == "LSRR": 1005b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1015b8af90fSJose Luis Duran options = sc.IPOption_LSRR(routers=routers) 1025b8af90fSJose Luis Duran elif opts == "LSRR-trunc": 1035b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1045b8af90fSJose Luis Duran options = sc.IPOption_LSRR(length=3, routers=routers_zero) 1055b8af90fSJose Luis Duran elif opts == "SSRR": 1065b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1075b8af90fSJose Luis Duran options = sc.IPOption_SSRR(routers=routers) 1085b8af90fSJose Luis Duran elif opts == "SSRR-trunc": 1095b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1105b8af90fSJose Luis Duran options = sc.IPOption_SSRR(length=3, routers=routers_zero) 1115b8af90fSJose Luis Duran elif opts == "unk": 1125b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1135b8af90fSJose Luis Duran options = sc.IPOption(b"\x9f") 1145b8af90fSJose Luis Duran elif opts == "unk-40": 1155b8af90fSJose Luis Duran ToolsHelper.set_sysctl("net.inet.ip.process_options", 0) 1165b8af90fSJose Luis Duran options = sc.IPOption(b"\x9f" * 40) 1175b8af90fSJose Luis Duran else: 1185b8af90fSJose Luis Duran options = "" 1195b8af90fSJose Luis Duran return options 1205b8af90fSJose Luis Duran 1215b8af90fSJose Luis Duran 1225b8af90fSJose Luis Durandef pinger( 1235b8af90fSJose Luis Duran # Required arguments 1245b8af90fSJose Luis Duran # Avoid setting defaults on these arguments, 1255b8af90fSJose Luis Duran # as we want to set them explicitly in the tests 1265b8af90fSJose Luis Duran iface: str, 1275b8af90fSJose Luis Duran /, 1285b8af90fSJose Luis Duran src: sc.scapy.fields.SourceIPField, 1295b8af90fSJose Luis Duran dst: sc.scapy.layers.inet.DestIPField, 1305b8af90fSJose Luis Duran icmp_type: sc.scapy.fields.ByteEnumField, 1315b8af90fSJose Luis Duran icmp_code: sc.scapy.fields.MultiEnumField, 1325b8af90fSJose Luis Duran # IP arguments 1335b8af90fSJose Luis Duran ihl: Optional[sc.scapy.fields.BitField] = None, 1345b8af90fSJose Luis Duran flags: Optional[sc.scapy.fields.FlagsField] = None, 1355b8af90fSJose Luis Duran opts: Optional[str] = None, 1365b8af90fSJose Luis Duran oip_ihl: Optional[sc.scapy.fields.BitField] = None, 1375b8af90fSJose Luis Duran special: Optional[str] = None, 1385b8af90fSJose Luis Duran # ICMP arguments 1395b8af90fSJose Luis Duran # Match names with <netinet/ip_icmp.h> 1405b8af90fSJose Luis Duran icmp_pptr: sc.scapy.fields.ByteField = 0, 1415b8af90fSJose Luis Duran icmp_gwaddr: sc.scapy.fields.IPField = "0.0.0.0", 1425b8af90fSJose Luis Duran icmp_nextmtu: sc.scapy.fields.ShortField = 0, 1435b8af90fSJose Luis Duran icmp_otime: sc.scapy.layers.inet.ICMPTimeStampField = 0, 1445b8af90fSJose Luis Duran icmp_rtime: sc.scapy.layers.inet.ICMPTimeStampField = 0, 1455b8af90fSJose Luis Duran icmp_ttime: sc.scapy.layers.inet.ICMPTimeStampField = 0, 1465b8af90fSJose Luis Duran icmp_mask: sc.scapy.fields.IPField = "0.0.0.0", 1475b8af90fSJose Luis Duran request: Optional[str] = None, 1485b8af90fSJose Luis Duran # Miscellaneous arguments 1495b8af90fSJose Luis Duran count: int = 1, 1505b8af90fSJose Luis Duran dup: bool = False, 1515b8af90fSJose Luis Duran) -> subprocess.CompletedProcess: 1525b8af90fSJose Luis Duran """P I N G E R 1535b8af90fSJose Luis Duran 1545b8af90fSJose Luis Duran Echo reply faker 1555b8af90fSJose Luis Duran 1565b8af90fSJose Luis Duran :param str iface: Interface to send packet to 1575b8af90fSJose Luis Duran :keyword src: Source packet IP 1585b8af90fSJose Luis Duran :type src: class:`scapy.fields.SourceIPField` 1595b8af90fSJose Luis Duran :keyword dst: Destination packet IP 1605b8af90fSJose Luis Duran :type dst: class:`scapy.layers.inet.DestIPField` 1615b8af90fSJose Luis Duran :keyword icmp_type: ICMP type 1625b8af90fSJose Luis Duran :type icmp_type: class:`scapy.fields.ByteEnumField` 1635b8af90fSJose Luis Duran :keyword icmp_code: ICMP code 1645b8af90fSJose Luis Duran :type icmp_code: class:`scapy.fields.MultiEnumField` 1655b8af90fSJose Luis Duran 1665b8af90fSJose Luis Duran :keyword ihl: Internet Header Length, defaults to None 1675b8af90fSJose Luis Duran :type ihl: class:`scapy.fields.BitField`, optional 1685b8af90fSJose Luis Duran :keyword flags: IP flags - one of `DF`, `MF` or `evil`, defaults to None 1695b8af90fSJose Luis Duran :type flags: class:`scapy.fields.FlagsField`, optional 1705b8af90fSJose Luis Duran :keyword opts: Include IP options - one of `EOL`, `NOP`, `NOP-40`, `unk`, 1715b8af90fSJose Luis Duran `unk-40`, `RR`, `RR-same`, `RR-trunc`, `LSRR`, `LSRR-trunc`, `SSRR` or 1725b8af90fSJose Luis Duran `SSRR-trunc`, defaults to None 1735b8af90fSJose Luis Duran :type opts: str, optional 1745b8af90fSJose Luis Duran :keyword oip_ihl: Inner packet's Internet Header Length, defaults to None 1755b8af90fSJose Luis Duran :type oip_ihl: class:`scapy.fields.BitField`, optional 1765b8af90fSJose Luis Duran :keyword special: Send a special packet - one of `no-payload`, `tcp`, 1775b8af90fSJose Luis Duran `udp`, `wrong` or `warp`, defaults to None 1785b8af90fSJose Luis Duran :type special: str, optional 1795b8af90fSJose Luis Duran :keyword icmp_pptr: ICMP pointer, defaults to 0 1805b8af90fSJose Luis Duran :type icmp_pptr: class:`scapy.fields.ByteField` 1815b8af90fSJose Luis Duran :keyword icmp_gwaddr: ICMP gateway IP address, defaults to "0.0.0.0" 1825b8af90fSJose Luis Duran :type icmp_gwaddr: class:`scapy.fields.IPField` 1835b8af90fSJose Luis Duran :keyword icmp_nextmtu: ICMP next MTU, defaults to 0 1845b8af90fSJose Luis Duran :type icmp_nextmtu: class:`scapy.fields.ShortField` 1855b8af90fSJose Luis Duran :keyword icmp_otime: ICMP originate timestamp, defaults to 0 1865b8af90fSJose Luis Duran :type icmp_otime: class:`scapy.layers.inet.ICMPTimeStampField` 1875b8af90fSJose Luis Duran :keyword icmp_rtime: ICMP receive timestamp, defaults to 0 1885b8af90fSJose Luis Duran :type icmp_rtime: class:`scapy.layers.inet.ICMPTimeStampField` 1895b8af90fSJose Luis Duran :keyword icmp_ttime: ICMP transmit timestamp, defaults to 0 1905b8af90fSJose Luis Duran :type icmp_ttime: class:`scapy.layers.inet.ICMPTimeStampField` 1915b8af90fSJose Luis Duran :keyword icmp_mask: ICMP address mask, defaults to "0.0.0.0" 1925b8af90fSJose Luis Duran :type icmp_mask: class:`scapy.fields.IPField` 1935b8af90fSJose Luis Duran :keyword request: Request type - one of `mask` or `timestamp`, 1945b8af90fSJose Luis Duran defaults to None 1955b8af90fSJose Luis Duran :type request: str, optional 1965b8af90fSJose Luis Duran :keyword count: Number of packets to send, defaults to 1 1975b8af90fSJose Luis Duran :type count: int 1985b8af90fSJose Luis Duran :keyword dup: Duplicate packets, defaults to `False` 1995b8af90fSJose Luis Duran :type dup: bool 2005b8af90fSJose Luis Duran 2015b8af90fSJose Luis Duran :return: A class:`subprocess.CompletedProcess` with the output from the 2025b8af90fSJose Luis Duran ping utility 2035b8af90fSJose Luis Duran :rtype: class:`subprocess.CompletedProcess` 2045b8af90fSJose Luis Duran """ 2055b8af90fSJose Luis Duran tun = sc.TunTapInterface(iface) 2065b8af90fSJose Luis Duran subprocess.run(["ifconfig", tun.iface, "up"], check=True) 2075b8af90fSJose Luis Duran subprocess.run(["ifconfig", tun.iface, src, dst], check=True) 2085b8af90fSJose Luis Duran ip_opts = generate_ip_options(opts) 2095b8af90fSJose Luis Duran ip = sc.IP(ihl=ihl, flags=flags, src=dst, dst=src, options=ip_opts) 2105b8af90fSJose Luis Duran command = [ 2115b8af90fSJose Luis Duran "/sbin/ping", 2125b8af90fSJose Luis Duran "-c", 2135b8af90fSJose Luis Duran str(count), 2145b8af90fSJose Luis Duran "-t", 2155b8af90fSJose Luis Duran str(count), 2165b8af90fSJose Luis Duran "-v", 2175b8af90fSJose Luis Duran ] 2185b8af90fSJose Luis Duran if request == "mask": 2195b8af90fSJose Luis Duran command += ["-Mm"] 2205b8af90fSJose Luis Duran if request == "timestamp": 2215b8af90fSJose Luis Duran command += ["-Mt"] 2225b8af90fSJose Luis Duran if special: 2235b8af90fSJose Luis Duran command += ["-p1"] 2245b8af90fSJose Luis Duran if opts in [ 2255b8af90fSJose Luis Duran "RR", 2265b8af90fSJose Luis Duran "RR-same", 2275b8af90fSJose Luis Duran "RR-trunc", 2285b8af90fSJose Luis Duran "LSRR", 2295b8af90fSJose Luis Duran "LSRR-trunc", 2305b8af90fSJose Luis Duran "SSRR", 2315b8af90fSJose Luis Duran "SSRR-trunc", 2325b8af90fSJose Luis Duran ]: 2335b8af90fSJose Luis Duran command += ["-R"] 2345b8af90fSJose Luis Duran command += [dst] 2355b8af90fSJose Luis Duran with subprocess.Popen( 2365b8af90fSJose Luis Duran args=command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True 2375b8af90fSJose Luis Duran ) as ping: 2385b8af90fSJose Luis Duran for dummy in range(count): 2395b8af90fSJose Luis Duran echo = tun.recv() 2405b8af90fSJose Luis Duran icmp = sc.ICMP( 2415b8af90fSJose Luis Duran type=icmp_type, 2425b8af90fSJose Luis Duran code=icmp_code, 2435b8af90fSJose Luis Duran id=echo[sc.ICMP].id, 2445b8af90fSJose Luis Duran seq=echo[sc.ICMP].seq, 2455b8af90fSJose Luis Duran ts_ori=icmp_otime, 2465b8af90fSJose Luis Duran ts_rx=icmp_rtime, 2475b8af90fSJose Luis Duran ts_tx=icmp_ttime, 2485b8af90fSJose Luis Duran gw=icmp_gwaddr, 2495b8af90fSJose Luis Duran ptr=icmp_pptr, 2505b8af90fSJose Luis Duran addr_mask=icmp_mask, 2515b8af90fSJose Luis Duran nexthopmtu=icmp_nextmtu, 2525b8af90fSJose Luis Duran ) 2535b8af90fSJose Luis Duran pkt = build_response_packet(echo, ip, icmp, oip_ihl, special) 2545b8af90fSJose Luis Duran tun.send(pkt) 2555b8af90fSJose Luis Duran if dup is True: 2565b8af90fSJose Luis Duran tun.send(pkt) 2575b8af90fSJose Luis Duran stdout, stderr = ping.communicate() 2585b8af90fSJose Luis Duran return subprocess.CompletedProcess( 2595b8af90fSJose Luis Duran ping.args, ping.returncode, stdout, stderr 2605b8af90fSJose Luis Duran ) 2615b8af90fSJose Luis Duran 2625b8af90fSJose Luis Duran 2635b8af90fSJose Luis Durandef redact(output): 2645b8af90fSJose Luis Duran """Redact some elements of ping's output""" 2655b8af90fSJose Luis Duran pattern_replacements = [ 2665b8af90fSJose Luis Duran ("localhost \([0-9]{1,3}(\.[0-9]{1,3}){3}\)", "localhost"), 2675b8af90fSJose Luis Duran ("from [0-9]{1,3}(\.[0-9]{1,3}){3}", "from"), 2685b8af90fSJose Luis Duran ("hlim=[0-9]*", "hlim="), 2695b8af90fSJose Luis Duran ("ttl=[0-9]*", "ttl="), 2705b8af90fSJose Luis Duran ("time=[0-9.-]*", "time="), 2715b8af90fSJose Luis Duran ("[0-9\.]+/[0-9.]+", "/"), 2725b8af90fSJose Luis Duran ] 2735b8af90fSJose Luis Duran for pattern, repl in pattern_replacements: 2745b8af90fSJose Luis Duran output = re.sub(pattern, repl, output) 2755b8af90fSJose Luis Duran return output 2765b8af90fSJose Luis Duran 2775b8af90fSJose Luis Duran 2785b8af90fSJose Luis Duranclass TestPing(SingleVnetTestTemplate): 2795b8af90fSJose Luis Duran IPV6_PREFIXES: List[str] = ["2001:db8::1/64"] 2805b8af90fSJose Luis Duran IPV4_PREFIXES: List[str] = ["192.0.2.1/24"] 2815b8af90fSJose Luis Duran 2825b8af90fSJose Luis Duran # Each param in testdata contains a dictionary with the command, 2835b8af90fSJose Luis Duran # and the expected outcome (returncode, redacted stdout, and stderr) 2845b8af90fSJose Luis Duran testdata = [ 2855b8af90fSJose Luis Duran pytest.param( 2865b8af90fSJose Luis Duran { 2875b8af90fSJose Luis Duran "args": "ping -4 -c1 -s56 -t1 localhost", 2885b8af90fSJose Luis Duran "returncode": 0, 2895b8af90fSJose Luis Duran "stdout": """\ 2905b8af90fSJose Luis DuranPING localhost: 56 data bytes 2915b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 2925b8af90fSJose Luis Duran 2935b8af90fSJose Luis Duran--- localhost ping statistics --- 2945b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 2955b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 2965b8af90fSJose Luis Duran""", 2975b8af90fSJose Luis Duran "stderr": "", 2985b8af90fSJose Luis Duran }, 2995b8af90fSJose Luis Duran id="_4_c1_s56_t1_localhost", 3005b8af90fSJose Luis Duran ), 3015b8af90fSJose Luis Duran pytest.param( 3025b8af90fSJose Luis Duran { 3035b8af90fSJose Luis Duran "args": "ping -6 -c1 -s8 -t1 localhost", 3045b8af90fSJose Luis Duran "returncode": 0, 3055b8af90fSJose Luis Duran "stdout": """\ 3065b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1 3075b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms 3085b8af90fSJose Luis Duran 3095b8af90fSJose Luis Duran--- localhost ping6 statistics --- 3105b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 3115b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 3125b8af90fSJose Luis Duran""", 3135b8af90fSJose Luis Duran "stderr": "", 3145b8af90fSJose Luis Duran }, 3155b8af90fSJose Luis Duran id="_6_c1_s8_t1_localhost", 3165b8af90fSJose Luis Duran ), 3175b8af90fSJose Luis Duran pytest.param( 3185b8af90fSJose Luis Duran { 3195b8af90fSJose Luis Duran "args": "ping -A -c1 192.0.2.1", 3205b8af90fSJose Luis Duran "returncode": 0, 3215b8af90fSJose Luis Duran "stdout": """\ 3225b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 3235b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 3245b8af90fSJose Luis Duran 3255b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 3265b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 3275b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 3285b8af90fSJose Luis Duran""", 3295b8af90fSJose Luis Duran "stderr": "", 3305b8af90fSJose Luis Duran }, 3315b8af90fSJose Luis Duran id="_A_c1_192_0_2_1", 3325b8af90fSJose Luis Duran ), 3335b8af90fSJose Luis Duran pytest.param( 3345b8af90fSJose Luis Duran { 3355b8af90fSJose Luis Duran "args": "ping -A -c1 192.0.2.2", 3365b8af90fSJose Luis Duran "returncode": 2, 3375b8af90fSJose Luis Duran "stdout": """\ 3385b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 3395b8af90fSJose Luis Duran 3405b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 3415b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 3425b8af90fSJose Luis Duran""", 3435b8af90fSJose Luis Duran "stderr": "", 3445b8af90fSJose Luis Duran }, 3455b8af90fSJose Luis Duran id="_A_c1_192_0_2_2", 3465b8af90fSJose Luis Duran ), 3475b8af90fSJose Luis Duran pytest.param( 3485b8af90fSJose Luis Duran { 3495b8af90fSJose Luis Duran "args": "ping -A -c1 2001:db8::1", 3505b8af90fSJose Luis Duran "returncode": 0, 3515b8af90fSJose Luis Duran "stdout": """\ 3525b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 3535b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms 3545b8af90fSJose Luis Duran 3555b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 3565b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 3575b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 3585b8af90fSJose Luis Duran""", 3595b8af90fSJose Luis Duran "stderr": "", 3605b8af90fSJose Luis Duran }, 3615b8af90fSJose Luis Duran id="_A_c1_2001_db8__1", 3625b8af90fSJose Luis Duran ), 3635b8af90fSJose Luis Duran pytest.param( 3645b8af90fSJose Luis Duran { 3655b8af90fSJose Luis Duran "args": "ping -A -c1 2001:db8::2", 3665b8af90fSJose Luis Duran "returncode": 2, 3675b8af90fSJose Luis Duran "stdout": """\ 3685b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 3695b8af90fSJose Luis Duran 3705b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 3715b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 3725b8af90fSJose Luis Duran""", 3735b8af90fSJose Luis Duran "stderr": "", 3745b8af90fSJose Luis Duran }, 3755b8af90fSJose Luis Duran id="_A_c1_2001_db8__2", 3765b8af90fSJose Luis Duran ), 3775b8af90fSJose Luis Duran pytest.param( 3785b8af90fSJose Luis Duran { 3795b8af90fSJose Luis Duran "args": "ping -A -c3 192.0.2.1", 3805b8af90fSJose Luis Duran "returncode": 0, 3815b8af90fSJose Luis Duran "stdout": """\ 3825b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 3835b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 3845b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms 3855b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms 3865b8af90fSJose Luis Duran 3875b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 3885b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 3895b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 3905b8af90fSJose Luis Duran""", 3915b8af90fSJose Luis Duran "stderr": "", 3925b8af90fSJose Luis Duran }, 3935b8af90fSJose Luis Duran id="_A_3_192_0.2.1", 3945b8af90fSJose Luis Duran ), 3955b8af90fSJose Luis Duran pytest.param( 3965b8af90fSJose Luis Duran { 3975b8af90fSJose Luis Duran "args": "ping -A -c3 192.0.2.2", 3985b8af90fSJose Luis Duran "returncode": 2, 3995b8af90fSJose Luis Duran "stdout": """\ 4005b8af90fSJose Luis Duran\x07\x07PING 192.0.2.2 (192.0.2.2): 56 data bytes 4015b8af90fSJose Luis Duran 4025b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 4035b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 4045b8af90fSJose Luis Duran""", 4055b8af90fSJose Luis Duran "stderr": "", 4065b8af90fSJose Luis Duran }, 4075b8af90fSJose Luis Duran id="_A_c3_192_0_2_2", 4085b8af90fSJose Luis Duran ), 4095b8af90fSJose Luis Duran pytest.param( 4105b8af90fSJose Luis Duran { 4115b8af90fSJose Luis Duran "args": "ping -A -c3 2001:db8::1", 4125b8af90fSJose Luis Duran "returncode": 0, 4135b8af90fSJose Luis Duran "stdout": """\ 4145b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 4155b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms 4165b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms 4175b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms 4185b8af90fSJose Luis Duran 4195b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 4205b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 4215b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 4225b8af90fSJose Luis Duran""", 4235b8af90fSJose Luis Duran "stderr": "", 4245b8af90fSJose Luis Duran }, 4255b8af90fSJose Luis Duran id="_A_c3_2001_db8__1", 4265b8af90fSJose Luis Duran ), 4275b8af90fSJose Luis Duran pytest.param( 4285b8af90fSJose Luis Duran { 4295b8af90fSJose Luis Duran "args": "ping -A -c3 2001:db8::2", 4305b8af90fSJose Luis Duran "returncode": 2, 4315b8af90fSJose Luis Duran "stdout": """\ 4325b8af90fSJose Luis Duran\x07\x07PING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 4335b8af90fSJose Luis Duran 4345b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 4355b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 4365b8af90fSJose Luis Duran""", 4375b8af90fSJose Luis Duran "stderr": "", 4385b8af90fSJose Luis Duran }, 4395b8af90fSJose Luis Duran id="_A_c3_2001_db8__2", 4405b8af90fSJose Luis Duran ), 4415b8af90fSJose Luis Duran pytest.param( 4425b8af90fSJose Luis Duran { 4435b8af90fSJose Luis Duran "args": "ping -c1 192.0.2.1", 4445b8af90fSJose Luis Duran "returncode": 0, 4455b8af90fSJose Luis Duran "stdout": """\ 4465b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 4475b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 4485b8af90fSJose Luis Duran 4495b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 4505b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 4515b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 4525b8af90fSJose Luis Duran""", 4535b8af90fSJose Luis Duran "stderr": "", 4545b8af90fSJose Luis Duran }, 4555b8af90fSJose Luis Duran id="_c1_192_0_2_1", 4565b8af90fSJose Luis Duran ), 4575b8af90fSJose Luis Duran pytest.param( 4585b8af90fSJose Luis Duran { 4595b8af90fSJose Luis Duran "args": "ping -c1 192.0.2.2", 4605b8af90fSJose Luis Duran "returncode": 2, 4615b8af90fSJose Luis Duran "stdout": """\ 4625b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 4635b8af90fSJose Luis Duran 4645b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 4655b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 4665b8af90fSJose Luis Duran""", 4675b8af90fSJose Luis Duran "stderr": "", 4685b8af90fSJose Luis Duran }, 4695b8af90fSJose Luis Duran id="_c1_192_0_2_2", 4705b8af90fSJose Luis Duran ), 4715b8af90fSJose Luis Duran pytest.param( 4725b8af90fSJose Luis Duran { 4735b8af90fSJose Luis Duran "args": "ping -c1 2001:db8::1", 4745b8af90fSJose Luis Duran "returncode": 0, 4755b8af90fSJose Luis Duran "stdout": """\ 4765b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 4775b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms 4785b8af90fSJose Luis Duran 4795b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 4805b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 4815b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 4825b8af90fSJose Luis Duran""", 4835b8af90fSJose Luis Duran "stderr": "", 4845b8af90fSJose Luis Duran }, 4855b8af90fSJose Luis Duran id="_c1_2001_db8__1", 4865b8af90fSJose Luis Duran ), 4875b8af90fSJose Luis Duran pytest.param( 4885b8af90fSJose Luis Duran { 4895b8af90fSJose Luis Duran "args": "ping -c1 2001:db8::2", 4905b8af90fSJose Luis Duran "returncode": 2, 4915b8af90fSJose Luis Duran "stdout": """\ 4925b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 4935b8af90fSJose Luis Duran 4945b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 4955b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 4965b8af90fSJose Luis Duran""", 4975b8af90fSJose Luis Duran "stderr": "", 4985b8af90fSJose Luis Duran }, 4995b8af90fSJose Luis Duran id="_c1_2001_db8__2", 5005b8af90fSJose Luis Duran ), 5015b8af90fSJose Luis Duran pytest.param( 5025b8af90fSJose Luis Duran { 5035b8af90fSJose Luis Duran "args": "ping -c1 -S127.0.0.1 -s56 -t1 localhost", 5045b8af90fSJose Luis Duran "returncode": 0, 5055b8af90fSJose Luis Duran "stdout": """\ 5065b8af90fSJose Luis DuranPING localhost from: 56 data bytes 5075b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 5085b8af90fSJose Luis Duran 5095b8af90fSJose Luis Duran--- localhost ping statistics --- 5105b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 5115b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 5125b8af90fSJose Luis Duran""", 5135b8af90fSJose Luis Duran "stderr": "", 5145b8af90fSJose Luis Duran }, 5155b8af90fSJose Luis Duran id="_c1_S127_0_0_1_s56_t1_localhost", 5165b8af90fSJose Luis Duran ), 5175b8af90fSJose Luis Duran pytest.param( 5185b8af90fSJose Luis Duran { 5195b8af90fSJose Luis Duran "args": "ping -c1 -S::1 -s8 -t1 localhost", 5205b8af90fSJose Luis Duran "returncode": 0, 5215b8af90fSJose Luis Duran "stdout": """\ 5225b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1 5235b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms 5245b8af90fSJose Luis Duran 5255b8af90fSJose Luis Duran--- localhost ping6 statistics --- 5265b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 5275b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 5285b8af90fSJose Luis Duran""", 5295b8af90fSJose Luis Duran "stderr": "", 5305b8af90fSJose Luis Duran }, 5315b8af90fSJose Luis Duran id="_c1_S__1_s8_t1_localhost", 5325b8af90fSJose Luis Duran ), 5335b8af90fSJose Luis Duran pytest.param( 5345b8af90fSJose Luis Duran { 5355b8af90fSJose Luis Duran "args": "ping -c3 192.0.2.1", 5365b8af90fSJose Luis Duran "returncode": 0, 5375b8af90fSJose Luis Duran "stdout": """\ 5385b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 5395b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 5405b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms 5415b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms 5425b8af90fSJose Luis Duran 5435b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 5445b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 5455b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 5465b8af90fSJose Luis Duran""", 5475b8af90fSJose Luis Duran "stderr": "", 5485b8af90fSJose Luis Duran }, 5495b8af90fSJose Luis Duran id="_c3_192_0_2_1", 5505b8af90fSJose Luis Duran ), 5515b8af90fSJose Luis Duran pytest.param( 5525b8af90fSJose Luis Duran { 5535b8af90fSJose Luis Duran "args": "ping -c3 192.0.2.2", 5545b8af90fSJose Luis Duran "returncode": 2, 5555b8af90fSJose Luis Duran "stdout": """\ 5565b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 5575b8af90fSJose Luis Duran 5585b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 5595b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 5605b8af90fSJose Luis Duran""", 5615b8af90fSJose Luis Duran "stderr": "", 5625b8af90fSJose Luis Duran }, 5635b8af90fSJose Luis Duran id="_c3_192_0_2_2", 5645b8af90fSJose Luis Duran ), 5655b8af90fSJose Luis Duran pytest.param( 5665b8af90fSJose Luis Duran { 5675b8af90fSJose Luis Duran "args": "ping -c3 2001:db8::1", 5685b8af90fSJose Luis Duran "returncode": 0, 5695b8af90fSJose Luis Duran "stdout": """\ 5705b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 5715b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms 5725b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms 5735b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms 5745b8af90fSJose Luis Duran 5755b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 5765b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 5775b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 5785b8af90fSJose Luis Duran""", 5795b8af90fSJose Luis Duran "stderr": "", 5805b8af90fSJose Luis Duran }, 5815b8af90fSJose Luis Duran id="_c3_2001_db8__1", 5825b8af90fSJose Luis Duran ), 5835b8af90fSJose Luis Duran pytest.param( 5845b8af90fSJose Luis Duran { 5855b8af90fSJose Luis Duran "args": "ping -c3 2001:db8::2", 5865b8af90fSJose Luis Duran "returncode": 2, 5875b8af90fSJose Luis Duran "stdout": """\ 5885b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 5895b8af90fSJose Luis Duran 5905b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 5915b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 5925b8af90fSJose Luis Duran""", 5935b8af90fSJose Luis Duran "stderr": "", 5945b8af90fSJose Luis Duran }, 5955b8af90fSJose Luis Duran id="_c3_2001_db8__2", 5965b8af90fSJose Luis Duran ), 5975b8af90fSJose Luis Duran pytest.param( 5985b8af90fSJose Luis Duran { 5995b8af90fSJose Luis Duran "args": "ping -q -c1 192.0.2.1", 6005b8af90fSJose Luis Duran "returncode": 0, 6015b8af90fSJose Luis Duran "stdout": """\ 6025b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 6035b8af90fSJose Luis Duran 6045b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 6055b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 6065b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 6075b8af90fSJose Luis Duran""", 6085b8af90fSJose Luis Duran "stderr": "", 6095b8af90fSJose Luis Duran }, 6105b8af90fSJose Luis Duran id="_q_c1_192_0_2_1", 6115b8af90fSJose Luis Duran ), 6125b8af90fSJose Luis Duran pytest.param( 6135b8af90fSJose Luis Duran { 6145b8af90fSJose Luis Duran "args": "ping -q -c1 192.0.2.2", 6155b8af90fSJose Luis Duran "returncode": 2, 6165b8af90fSJose Luis Duran "stdout": """\ 6175b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 6185b8af90fSJose Luis Duran 6195b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 6205b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 6215b8af90fSJose Luis Duran""", 6225b8af90fSJose Luis Duran "stderr": "", 6235b8af90fSJose Luis Duran }, 6245b8af90fSJose Luis Duran id="_q_c1_192_0_2_2", 6255b8af90fSJose Luis Duran ), 6265b8af90fSJose Luis Duran pytest.param( 6275b8af90fSJose Luis Duran { 6285b8af90fSJose Luis Duran "args": "ping -q -c1 2001:db8::1", 6295b8af90fSJose Luis Duran "returncode": 0, 6305b8af90fSJose Luis Duran "stdout": """\ 6315b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 6325b8af90fSJose Luis Duran 6335b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 6345b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 6355b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 6365b8af90fSJose Luis Duran""", 6375b8af90fSJose Luis Duran "stderr": "", 6385b8af90fSJose Luis Duran }, 6395b8af90fSJose Luis Duran id="_q_c1_2001_db8__1", 6405b8af90fSJose Luis Duran ), 6415b8af90fSJose Luis Duran pytest.param( 6425b8af90fSJose Luis Duran { 6435b8af90fSJose Luis Duran "args": "ping -q -c1 2001:db8::2", 6445b8af90fSJose Luis Duran "returncode": 2, 6455b8af90fSJose Luis Duran "stdout": """\ 6465b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 6475b8af90fSJose Luis Duran 6485b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 6495b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 6505b8af90fSJose Luis Duran""", 6515b8af90fSJose Luis Duran "stderr": "", 6525b8af90fSJose Luis Duran }, 6535b8af90fSJose Luis Duran id="_q_c1_2001_db8__2", 6545b8af90fSJose Luis Duran ), 6555b8af90fSJose Luis Duran pytest.param( 6565b8af90fSJose Luis Duran { 6575b8af90fSJose Luis Duran "args": "ping -q -c3 192.0.2.1", 6585b8af90fSJose Luis Duran "returncode": 0, 6595b8af90fSJose Luis Duran "stdout": """\ 6605b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes 6615b8af90fSJose Luis Duran 6625b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics --- 6635b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 6645b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 6655b8af90fSJose Luis Duran""", 6665b8af90fSJose Luis Duran "stderr": "", 6675b8af90fSJose Luis Duran }, 6685b8af90fSJose Luis Duran id="_q_c3_192_0_2_1", 6695b8af90fSJose Luis Duran ), 6705b8af90fSJose Luis Duran pytest.param( 6715b8af90fSJose Luis Duran { 6725b8af90fSJose Luis Duran "args": "ping -q -c3 192.0.2.2", 6735b8af90fSJose Luis Duran "returncode": 2, 6745b8af90fSJose Luis Duran "stdout": """\ 6755b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 6765b8af90fSJose Luis Duran 6775b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 6785b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 6795b8af90fSJose Luis Duran""", 6805b8af90fSJose Luis Duran "stderr": "", 6815b8af90fSJose Luis Duran }, 6825b8af90fSJose Luis Duran id="_q_c3_192_0_2_2", 6835b8af90fSJose Luis Duran ), 6845b8af90fSJose Luis Duran pytest.param( 6855b8af90fSJose Luis Duran { 6865b8af90fSJose Luis Duran "args": "ping -q -c3 2001:db8::1", 6875b8af90fSJose Luis Duran "returncode": 0, 6885b8af90fSJose Luis Duran "stdout": """\ 6895b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1 6905b8af90fSJose Luis Duran 6915b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics --- 6925b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss 6935b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms 6945b8af90fSJose Luis Duran""", 6955b8af90fSJose Luis Duran "stderr": "", 6965b8af90fSJose Luis Duran }, 6975b8af90fSJose Luis Duran id="_q_c3_2001_db8__1", 6985b8af90fSJose Luis Duran ), 6995b8af90fSJose Luis Duran pytest.param( 7005b8af90fSJose Luis Duran { 7015b8af90fSJose Luis Duran "args": "ping -q -c3 2001:db8::2", 7025b8af90fSJose Luis Duran "returncode": 2, 7035b8af90fSJose Luis Duran "stdout": """\ 7045b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2 7055b8af90fSJose Luis Duran 7065b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics --- 7075b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss 7085b8af90fSJose Luis Duran""", 7095b8af90fSJose Luis Duran "stderr": "", 7105b8af90fSJose Luis Duran }, 7115b8af90fSJose Luis Duran id="_q_c3_2001_db8__2", 7125b8af90fSJose Luis Duran ), 7135b8af90fSJose Luis Duran ] 7145b8af90fSJose Luis Duran 7155b8af90fSJose Luis Duran @pytest.mark.parametrize("expected", testdata) 7165b8af90fSJose Luis Duran def test_ping(self, expected): 7175b8af90fSJose Luis Duran """Test ping""" 7185b8af90fSJose Luis Duran ping = subprocess.run( 7195b8af90fSJose Luis Duran expected["args"].split(), 7205b8af90fSJose Luis Duran capture_output=True, 7215b8af90fSJose Luis Duran timeout=15, 7225b8af90fSJose Luis Duran text=True, 7235b8af90fSJose Luis Duran ) 7245b8af90fSJose Luis Duran assert ping.returncode == expected["returncode"] 7255b8af90fSJose Luis Duran assert redact(ping.stdout) == expected["stdout"] 7265b8af90fSJose Luis Duran assert ping.stderr == expected["stderr"] 7275b8af90fSJose Luis Duran 7285b8af90fSJose Luis Duran # Each param in ping46_testdata contains a dictionary with the arguments 7295b8af90fSJose Luis Duran # and the expected outcome (returncode, redacted stdout, and stderr) 7305b8af90fSJose Luis Duran # common to `ping -4` and `ping -6` 7315b8af90fSJose Luis Duran ping46_testdata = [ 7325b8af90fSJose Luis Duran pytest.param( 7335b8af90fSJose Luis Duran { 7345b8af90fSJose Luis Duran "args": "-Wx localhost", 7355b8af90fSJose Luis Duran "returncode": os.EX_USAGE, 7365b8af90fSJose Luis Duran "stdout": "", 7375b8af90fSJose Luis Duran "stderr": "ping: invalid timing interval: `x'\n", 7385b8af90fSJose Luis Duran }, 7395b8af90fSJose Luis Duran id="_Wx_localhost", 7405b8af90fSJose Luis Duran ), 7415b8af90fSJose Luis Duran ] 7425b8af90fSJose Luis Duran 7435b8af90fSJose Luis Duran @pytest.mark.parametrize("expected", ping46_testdata) 7445b8af90fSJose Luis Duran def test_ping_46(self, expected): 7455b8af90fSJose Luis Duran """Test ping -4/ping -6""" 7465b8af90fSJose Luis Duran for version in [4, 6]: 7475b8af90fSJose Luis Duran ping = subprocess.run( 7485b8af90fSJose Luis Duran ["ping", f"-{version}"] + expected["args"].split(), 7495b8af90fSJose Luis Duran capture_output=True, 7505b8af90fSJose Luis Duran timeout=15, 7515b8af90fSJose Luis Duran text=True, 7525b8af90fSJose Luis Duran ) 7535b8af90fSJose Luis Duran assert ping.returncode == expected["returncode"] 7545b8af90fSJose Luis Duran assert redact(ping.stdout) == expected["stdout"] 7555b8af90fSJose Luis Duran assert ping.stderr == expected["stderr"] 7565b8af90fSJose Luis Duran 7575b8af90fSJose Luis Duran # Each param in pinger_testdata contains a dictionary with the keywords to 7585b8af90fSJose Luis Duran # `pinger()` and a dictionary with the expected outcome (returncode, 7595b8af90fSJose Luis Duran # stdout, stderr, and if ping's output is redacted) 7605b8af90fSJose Luis Duran pinger_testdata = [ 7615b8af90fSJose Luis Duran pytest.param( 7625b8af90fSJose Luis Duran { 7635b8af90fSJose Luis Duran "src": "192.0.2.1", 7645b8af90fSJose Luis Duran "dst": "192.0.2.2", 7655b8af90fSJose Luis Duran "icmp_type": 0, 7665b8af90fSJose Luis Duran "icmp_code": 0, 7675b8af90fSJose Luis Duran }, 7685b8af90fSJose Luis Duran { 7695b8af90fSJose Luis Duran "returncode": 0, 7705b8af90fSJose Luis Duran "stdout": """\ 7715b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 7725b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 7735b8af90fSJose Luis Duran 7745b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 7755b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 7765b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 7775b8af90fSJose Luis Duran""", 7785b8af90fSJose Luis Duran "stderr": "", 7795b8af90fSJose Luis Duran "redacted": True, 7805b8af90fSJose Luis Duran }, 7815b8af90fSJose Luis Duran id="_0_0", 7825b8af90fSJose Luis Duran ), 7835b8af90fSJose Luis Duran pytest.param( 7845b8af90fSJose Luis Duran { 7855b8af90fSJose Luis Duran "src": "192.0.2.1", 7865b8af90fSJose Luis Duran "dst": "192.0.2.2", 7875b8af90fSJose Luis Duran "icmp_type": 0, 7885b8af90fSJose Luis Duran "icmp_code": 0, 789*076b718dSJose Luis Duran "opts": "EOL", 790*076b718dSJose Luis Duran }, 791*076b718dSJose Luis Duran { 792*076b718dSJose Luis Duran "returncode": 0, 793*076b718dSJose Luis Duran "stdout": """\ 794*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 795*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 796*076b718dSJose Luis Duranwrong total length 88 instead of 84 797*076b718dSJose Luis Duran 798*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 799*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 800*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 801*076b718dSJose Luis Duran""", 802*076b718dSJose Luis Duran "stderr": "", 803*076b718dSJose Luis Duran "redacted": True, 804*076b718dSJose Luis Duran }, 805*076b718dSJose Luis Duran id="_0_0_opts_EOL", 806*076b718dSJose Luis Duran ), 807*076b718dSJose Luis Duran pytest.param( 808*076b718dSJose Luis Duran { 809*076b718dSJose Luis Duran "src": "192.0.2.1", 810*076b718dSJose Luis Duran "dst": "192.0.2.2", 811*076b718dSJose Luis Duran "icmp_type": 0, 812*076b718dSJose Luis Duran "icmp_code": 0, 813*076b718dSJose Luis Duran "opts": "LSRR", 814*076b718dSJose Luis Duran }, 815*076b718dSJose Luis Duran { 816*076b718dSJose Luis Duran "returncode": 0, 817*076b718dSJose Luis Duran "stdout": """\ 818*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 819*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 820*076b718dSJose Luis DuranLSRR: 192.0.2.10 821*076b718dSJose Luis Duran 192.0.2.20 822*076b718dSJose Luis Duran 192.0.2.30 823*076b718dSJose Luis Duran 192.0.2.40 824*076b718dSJose Luis Duran 192.0.2.50 825*076b718dSJose Luis Duran 192.0.2.60 826*076b718dSJose Luis Duran 192.0.2.70 827*076b718dSJose Luis Duran 192.0.2.80 828*076b718dSJose Luis Duran 192.0.2.90 829*076b718dSJose Luis Duran 830*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 831*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 832*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 833*076b718dSJose Luis Duran""", 834*076b718dSJose Luis Duran "stderr": "", 835*076b718dSJose Luis Duran "redacted": True, 836*076b718dSJose Luis Duran }, 837*076b718dSJose Luis Duran id="_0_0_opts_LSRR", 838*076b718dSJose Luis Duran ), 839*076b718dSJose Luis Duran pytest.param( 840*076b718dSJose Luis Duran { 841*076b718dSJose Luis Duran "src": "192.0.2.1", 842*076b718dSJose Luis Duran "dst": "192.0.2.2", 843*076b718dSJose Luis Duran "icmp_type": 0, 844*076b718dSJose Luis Duran "icmp_code": 0, 845*076b718dSJose Luis Duran "opts": "LSRR-trunc", 846*076b718dSJose Luis Duran }, 847*076b718dSJose Luis Duran { 848*076b718dSJose Luis Duran "returncode": 0, 849*076b718dSJose Luis Duran "stdout": """\ 850*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 851*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 852*076b718dSJose Luis DuranLSRR: (truncated route) 853*076b718dSJose Luis Duran 854*076b718dSJose Luis Duran 855*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 856*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 857*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 858*076b718dSJose Luis Duran""", 859*076b718dSJose Luis Duran "stderr": "", 860*076b718dSJose Luis Duran "redacted": True, 861*076b718dSJose Luis Duran }, 862*076b718dSJose Luis Duran id="_0_0_opts_LSRR_trunc", 863*076b718dSJose Luis Duran ), 864*076b718dSJose Luis Duran pytest.param( 865*076b718dSJose Luis Duran { 866*076b718dSJose Luis Duran "src": "192.0.2.1", 867*076b718dSJose Luis Duran "dst": "192.0.2.2", 868*076b718dSJose Luis Duran "icmp_type": 0, 869*076b718dSJose Luis Duran "icmp_code": 0, 870*076b718dSJose Luis Duran "opts": "SSRR", 871*076b718dSJose Luis Duran }, 872*076b718dSJose Luis Duran { 873*076b718dSJose Luis Duran "returncode": 0, 874*076b718dSJose Luis Duran "stdout": """\ 875*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 876*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 877*076b718dSJose Luis DuranSSRR: 192.0.2.10 878*076b718dSJose Luis Duran 192.0.2.20 879*076b718dSJose Luis Duran 192.0.2.30 880*076b718dSJose Luis Duran 192.0.2.40 881*076b718dSJose Luis Duran 192.0.2.50 882*076b718dSJose Luis Duran 192.0.2.60 883*076b718dSJose Luis Duran 192.0.2.70 884*076b718dSJose Luis Duran 192.0.2.80 885*076b718dSJose Luis Duran 192.0.2.90 886*076b718dSJose Luis Duran 887*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 888*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 889*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 890*076b718dSJose Luis Duran""", 891*076b718dSJose Luis Duran "stderr": "", 892*076b718dSJose Luis Duran "redacted": True, 893*076b718dSJose Luis Duran }, 894*076b718dSJose Luis Duran id="_0_0_opts_SSRR", 895*076b718dSJose Luis Duran ), 896*076b718dSJose Luis Duran pytest.param( 897*076b718dSJose Luis Duran { 898*076b718dSJose Luis Duran "src": "192.0.2.1", 899*076b718dSJose Luis Duran "dst": "192.0.2.2", 900*076b718dSJose Luis Duran "icmp_type": 0, 901*076b718dSJose Luis Duran "icmp_code": 0, 902*076b718dSJose Luis Duran "opts": "SSRR-trunc", 903*076b718dSJose Luis Duran }, 904*076b718dSJose Luis Duran { 905*076b718dSJose Luis Duran "returncode": 0, 906*076b718dSJose Luis Duran "stdout": """\ 907*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 908*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 909*076b718dSJose Luis DuranSSRR: (truncated route) 910*076b718dSJose Luis Duran 911*076b718dSJose Luis Duran 912*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 913*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 914*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 915*076b718dSJose Luis Duran""", 916*076b718dSJose Luis Duran "stderr": "", 917*076b718dSJose Luis Duran "redacted": True, 918*076b718dSJose Luis Duran }, 919*076b718dSJose Luis Duran id="_0_0_opts_SSRR_trunc", 920*076b718dSJose Luis Duran ), 921*076b718dSJose Luis Duran pytest.param( 922*076b718dSJose Luis Duran { 923*076b718dSJose Luis Duran "src": "192.0.2.1", 924*076b718dSJose Luis Duran "dst": "192.0.2.2", 925*076b718dSJose Luis Duran "icmp_type": 0, 926*076b718dSJose Luis Duran "icmp_code": 0, 927*076b718dSJose Luis Duran "opts": "RR", 928*076b718dSJose Luis Duran }, 929*076b718dSJose Luis Duran { 930*076b718dSJose Luis Duran "returncode": 0, 931*076b718dSJose Luis Duran "stdout": """\ 932*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 933*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 934*076b718dSJose Luis DuranRR: 192.0.2.10 935*076b718dSJose Luis Duran 192.0.2.20 936*076b718dSJose Luis Duran 192.0.2.30 937*076b718dSJose Luis Duran 192.0.2.40 938*076b718dSJose Luis Duran 192.0.2.50 939*076b718dSJose Luis Duran 192.0.2.60 940*076b718dSJose Luis Duran 192.0.2.70 941*076b718dSJose Luis Duran 192.0.2.80 942*076b718dSJose Luis Duran 192.0.2.90 943*076b718dSJose Luis Duran 944*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 945*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 946*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 947*076b718dSJose Luis Duran""", 948*076b718dSJose Luis Duran "stderr": "", 949*076b718dSJose Luis Duran "redacted": True, 950*076b718dSJose Luis Duran }, 951*076b718dSJose Luis Duran id="_0_0_opts_RR", 952*076b718dSJose Luis Duran ), 953*076b718dSJose Luis Duran pytest.param( 954*076b718dSJose Luis Duran { 955*076b718dSJose Luis Duran "src": "192.0.2.1", 956*076b718dSJose Luis Duran "dst": "192.0.2.2", 957*076b718dSJose Luis Duran "icmp_type": 0, 958*076b718dSJose Luis Duran "icmp_code": 0, 959*076b718dSJose Luis Duran "opts": "RR-same", 960*076b718dSJose Luis Duran }, 961*076b718dSJose Luis Duran { 962*076b718dSJose Luis Duran "returncode": 0, 963*076b718dSJose Luis Duran "stdout": """\ 964*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 965*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms (same route) 966*076b718dSJose Luis Duran 967*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 968*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 969*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 970*076b718dSJose Luis Duran""", 971*076b718dSJose Luis Duran "stderr": "", 972*076b718dSJose Luis Duran "redacted": True, 973*076b718dSJose Luis Duran }, 974*076b718dSJose Luis Duran id="_0_0_opts_RR_same", 975*076b718dSJose Luis Duran ), 976*076b718dSJose Luis Duran pytest.param( 977*076b718dSJose Luis Duran { 978*076b718dSJose Luis Duran "src": "192.0.2.1", 979*076b718dSJose Luis Duran "dst": "192.0.2.2", 980*076b718dSJose Luis Duran "icmp_type": 0, 981*076b718dSJose Luis Duran "icmp_code": 0, 982*076b718dSJose Luis Duran "opts": "RR-trunc", 983*076b718dSJose Luis Duran }, 984*076b718dSJose Luis Duran { 985*076b718dSJose Luis Duran "returncode": 0, 986*076b718dSJose Luis Duran "stdout": """\ 987*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 988*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 989*076b718dSJose Luis DuranRR: (truncated route) 990*076b718dSJose Luis Duran 991*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 992*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 993*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 994*076b718dSJose Luis Duran""", 995*076b718dSJose Luis Duran "stderr": "", 996*076b718dSJose Luis Duran "redacted": True, 997*076b718dSJose Luis Duran }, 998*076b718dSJose Luis Duran id="_0_0_opts_RR_trunc", 999*076b718dSJose Luis Duran ), 1000*076b718dSJose Luis Duran pytest.param( 1001*076b718dSJose Luis Duran { 1002*076b718dSJose Luis Duran "src": "192.0.2.1", 1003*076b718dSJose Luis Duran "dst": "192.0.2.2", 1004*076b718dSJose Luis Duran "icmp_type": 0, 1005*076b718dSJose Luis Duran "icmp_code": 0, 1006*076b718dSJose Luis Duran "opts": "NOP", 1007*076b718dSJose Luis Duran }, 1008*076b718dSJose Luis Duran { 1009*076b718dSJose Luis Duran "returncode": 0, 1010*076b718dSJose Luis Duran "stdout": """\ 1011*076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 1012*076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 1013*076b718dSJose Luis Duranwrong total length 88 instead of 84 1014*076b718dSJose Luis DuranNOP 1015*076b718dSJose Luis Duran 1016*076b718dSJose Luis Duran--- 192.0.2.2 ping statistics --- 1017*076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 1018*076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms 1019*076b718dSJose Luis Duran""", 1020*076b718dSJose Luis Duran "stderr": "", 1021*076b718dSJose Luis Duran "redacted": True, 1022*076b718dSJose Luis Duran }, 1023*076b718dSJose Luis Duran id="_0_0_opts_NOP", 1024*076b718dSJose Luis Duran ), 1025*076b718dSJose Luis Duran pytest.param( 1026*076b718dSJose Luis Duran { 1027*076b718dSJose Luis Duran "src": "192.0.2.1", 1028*076b718dSJose Luis Duran "dst": "192.0.2.2", 1029*076b718dSJose Luis Duran "icmp_type": 0, 1030*076b718dSJose Luis Duran "icmp_code": 0, 10315b8af90fSJose Luis Duran "opts": "NOP-40", 10325b8af90fSJose Luis Duran }, 10335b8af90fSJose Luis Duran { 10345b8af90fSJose Luis Duran "returncode": 0, 10355b8af90fSJose Luis Duran "stdout": """\ 10365b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 10375b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 10385b8af90fSJose Luis Duranwrong total length 124 instead of 84 10395b8af90fSJose Luis DuranNOP 10405b8af90fSJose Luis DuranNOP 10415b8af90fSJose Luis DuranNOP 10425b8af90fSJose Luis DuranNOP 10435b8af90fSJose Luis DuranNOP 10445b8af90fSJose Luis DuranNOP 10455b8af90fSJose Luis DuranNOP 10465b8af90fSJose Luis DuranNOP 10475b8af90fSJose Luis DuranNOP 10485b8af90fSJose Luis DuranNOP 10495b8af90fSJose Luis DuranNOP 10505b8af90fSJose Luis DuranNOP 10515b8af90fSJose Luis DuranNOP 10525b8af90fSJose Luis DuranNOP 10535b8af90fSJose Luis DuranNOP 10545b8af90fSJose Luis DuranNOP 10555b8af90fSJose Luis DuranNOP 10565b8af90fSJose Luis DuranNOP 10575b8af90fSJose Luis DuranNOP 10585b8af90fSJose Luis DuranNOP 10595b8af90fSJose Luis DuranNOP 10605b8af90fSJose Luis DuranNOP 10615b8af90fSJose Luis DuranNOP 10625b8af90fSJose Luis DuranNOP 10635b8af90fSJose Luis DuranNOP 10645b8af90fSJose Luis DuranNOP 10655b8af90fSJose Luis DuranNOP 10665b8af90fSJose Luis DuranNOP 10675b8af90fSJose Luis DuranNOP 10685b8af90fSJose Luis DuranNOP 10695b8af90fSJose Luis DuranNOP 10705b8af90fSJose Luis DuranNOP 10715b8af90fSJose Luis DuranNOP 10725b8af90fSJose Luis DuranNOP 10735b8af90fSJose Luis DuranNOP 10745b8af90fSJose Luis DuranNOP 10755b8af90fSJose Luis DuranNOP 10765b8af90fSJose Luis DuranNOP 10775b8af90fSJose Luis DuranNOP 10785b8af90fSJose Luis DuranNOP 10795b8af90fSJose Luis Duran 10805b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 10815b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 10825b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 10835b8af90fSJose Luis Duran""", 10845b8af90fSJose Luis Duran "stderr": "", 10855b8af90fSJose Luis Duran "redacted": True, 10865b8af90fSJose Luis Duran }, 10875b8af90fSJose Luis Duran id="_0_0_opts_NOP_40", 10885b8af90fSJose Luis Duran ), 10895b8af90fSJose Luis Duran pytest.param( 10905b8af90fSJose Luis Duran { 10915b8af90fSJose Luis Duran "src": "192.0.2.1", 10925b8af90fSJose Luis Duran "dst": "192.0.2.2", 10935b8af90fSJose Luis Duran "icmp_type": 0, 10945b8af90fSJose Luis Duran "icmp_code": 0, 10955b8af90fSJose Luis Duran "opts": "unk", 10965b8af90fSJose Luis Duran }, 10975b8af90fSJose Luis Duran { 10985b8af90fSJose Luis Duran "returncode": 0, 10995b8af90fSJose Luis Duran "stdout": """\ 11005b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 11015b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms 11025b8af90fSJose Luis Duranwrong total length 88 instead of 84 11035b8af90fSJose Luis Duranunknown option 9f 11045b8af90fSJose Luis Duran 11055b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 11065b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss 11075b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms 11085b8af90fSJose Luis Duran""", 11095b8af90fSJose Luis Duran "stderr": "", 11105b8af90fSJose Luis Duran "redacted": True, 11115b8af90fSJose Luis Duran }, 11125b8af90fSJose Luis Duran id="_0_0_opts_unk", 11135b8af90fSJose Luis Duran ), 11145b8af90fSJose Luis Duran pytest.param( 11155b8af90fSJose Luis Duran { 11165b8af90fSJose Luis Duran "src": "192.0.2.1", 11175b8af90fSJose Luis Duran "dst": "192.0.2.2", 11185b8af90fSJose Luis Duran "icmp_type": 3, 11195b8af90fSJose Luis Duran "icmp_code": 1, 11205b8af90fSJose Luis Duran "opts": "NOP-40", 11215b8af90fSJose Luis Duran }, 11225b8af90fSJose Luis Duran { 11235b8af90fSJose Luis Duran "returncode": 2, 11245b8af90fSJose Luis Duran "stdout": """\ 11255b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 11265b8af90fSJose Luis Duran132 bytes from 192.0.2.2: Destination Host Unreachable 11275b8af90fSJose Luis DuranVr HL TOS Len ID Flg off TTL Pro cks Src Dst 11285b8af90fSJose Luis Duran 4 f 00 007c 0001 0 0000 40 01 d868 192.0.2.1 192.0.2.2 01010101010101010101010101010101010101010101010101010101010101010101010101010101 11295b8af90fSJose Luis Duran 11305b8af90fSJose Luis Duran 11315b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 11325b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 11335b8af90fSJose Luis Duran""", 11345b8af90fSJose Luis Duran "stderr": "", 11355b8af90fSJose Luis Duran "redacted": False, 11365b8af90fSJose Luis Duran }, 11375b8af90fSJose Luis Duran id="_3_1_opts_NOP_40", 11385b8af90fSJose Luis Duran ), 11395b8af90fSJose Luis Duran pytest.param( 11405b8af90fSJose Luis Duran { 11415b8af90fSJose Luis Duran "src": "192.0.2.1", 11425b8af90fSJose Luis Duran "dst": "192.0.2.2", 11435b8af90fSJose Luis Duran "icmp_type": 3, 11445b8af90fSJose Luis Duran "icmp_code": 1, 11455b8af90fSJose Luis Duran "flags": "DF", 11465b8af90fSJose Luis Duran }, 11475b8af90fSJose Luis Duran { 11485b8af90fSJose Luis Duran "returncode": 2, 11495b8af90fSJose Luis Duran "stdout": """\ 11505b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 11515b8af90fSJose Luis Duran92 bytes from 192.0.2.2: Destination Host Unreachable 11525b8af90fSJose Luis DuranVr HL TOS Len ID Flg off TTL Pro cks Src Dst 11535b8af90fSJose Luis Duran 4 5 00 0054 0001 2 0000 40 01 b6a4 192.0.2.1 192.0.2.2 11545b8af90fSJose Luis Duran 11555b8af90fSJose Luis Duran 11565b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics --- 11575b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 11585b8af90fSJose Luis Duran""", 11595b8af90fSJose Luis Duran "stderr": "", 11605b8af90fSJose Luis Duran "redacted": False, 11615b8af90fSJose Luis Duran }, 11625b8af90fSJose Luis Duran id="_3_1_flags_DF", 11635b8af90fSJose Luis Duran ), 11641dc1f6bdSJose Luis Duran pytest.param( 11651dc1f6bdSJose Luis Duran { 11661dc1f6bdSJose Luis Duran "src": "192.0.2.1", 11671dc1f6bdSJose Luis Duran "dst": "192.0.2.2", 11681dc1f6bdSJose Luis Duran "icmp_type": 3, 11691dc1f6bdSJose Luis Duran "icmp_code": 1, 11701dc1f6bdSJose Luis Duran "special": "tcp", 11711dc1f6bdSJose Luis Duran }, 11721dc1f6bdSJose Luis Duran { 11731dc1f6bdSJose Luis Duran "returncode": 2, 11741dc1f6bdSJose Luis Duran "stdout": """\ 11751dc1f6bdSJose Luis DuranPATTERN: 0x01 11761dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 11771dc1f6bdSJose Luis Duran 11781dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics --- 11791dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 11801dc1f6bdSJose Luis Duran""", 11811dc1f6bdSJose Luis Duran "stderr": """\ 11821dc1f6bdSJose Luis Duranping: quoted data too short (40 bytes) from 192.0.2.2 11831dc1f6bdSJose Luis Duran""", 11841dc1f6bdSJose Luis Duran "redacted": False, 11851dc1f6bdSJose Luis Duran }, 11861dc1f6bdSJose Luis Duran id="_3_1_special_tcp", 11871dc1f6bdSJose Luis Duran ), 11881dc1f6bdSJose Luis Duran pytest.param( 11891dc1f6bdSJose Luis Duran { 11901dc1f6bdSJose Luis Duran "src": "192.0.2.1", 11911dc1f6bdSJose Luis Duran "dst": "192.0.2.2", 11921dc1f6bdSJose Luis Duran "icmp_type": 3, 11931dc1f6bdSJose Luis Duran "icmp_code": 1, 11941dc1f6bdSJose Luis Duran "special": "udp", 11951dc1f6bdSJose Luis Duran }, 11961dc1f6bdSJose Luis Duran { 11971dc1f6bdSJose Luis Duran "returncode": 2, 11981dc1f6bdSJose Luis Duran "stdout": """\ 11991dc1f6bdSJose Luis DuranPATTERN: 0x01 12001dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes 12011dc1f6bdSJose Luis Duran 12021dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics --- 12031dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss 12041dc1f6bdSJose Luis Duran""", 12051dc1f6bdSJose Luis Duran "stderr": """\ 12061dc1f6bdSJose Luis Duranping: quoted data too short (28 bytes) from 192.0.2.2 12071dc1f6bdSJose Luis Duran""", 12081dc1f6bdSJose Luis Duran "redacted": False, 12091dc1f6bdSJose Luis Duran }, 12101dc1f6bdSJose Luis Duran id="_3_1_special_udp", 12111dc1f6bdSJose Luis Duran ), 12125b8af90fSJose Luis Duran ] 12135b8af90fSJose Luis Duran 12145b8af90fSJose Luis Duran @pytest.mark.parametrize("pinger_kargs, expected", pinger_testdata) 12155b8af90fSJose Luis Duran @pytest.mark.require_progs(["scapy"]) 12165b8af90fSJose Luis Duran @pytest.mark.require_user("root") 12175b8af90fSJose Luis Duran def test_pinger(self, pinger_kargs, expected): 12185b8af90fSJose Luis Duran """Test ping using pinger(), a reply faker""" 12195b8af90fSJose Luis Duran iface = IfaceFactory().create_iface("", "tun")[0].name 12205b8af90fSJose Luis Duran ping = pinger(iface, **pinger_kargs) 12215b8af90fSJose Luis Duran assert ping.returncode == expected["returncode"] 12225b8af90fSJose Luis Duran if expected["redacted"]: 12235b8af90fSJose Luis Duran assert redact(ping.stdout) == expected["stdout"] 12245b8af90fSJose Luis Duran else: 12255b8af90fSJose Luis Duran assert ping.stdout == expected["stdout"] 12265b8af90fSJose Luis Duran assert ping.stderr == expected["stderr"] 1227