xref: /freebsd/sbin/ping/tests/test_ping.py (revision 20012a3a1a045bfe02bb64063cf0aba4d82471cb)
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"
599fc2d858SJose Luis Duran    if special == "not-mine":
609fc2d858SJose Luis Duran        # Modify the ICMP Identifier field
619fc2d858SJose Luis Duran        oicmp.id += 1
625b8af90fSJose Luis Duran
635b8af90fSJose Luis Duran    if icmp.type in icmp_id_seq_types:
645b8af90fSJose Luis Duran        pkt = ip / icmp / load
655b8af90fSJose Luis Duran    else:
665b8af90fSJose Luis Duran        ip.options = ""
675b8af90fSJose Luis Duran        pkt = ip / icmp / oip / oicmp / load
685b8af90fSJose Luis Duran    return pkt
695b8af90fSJose Luis Duran
705b8af90fSJose Luis Duran
715b8af90fSJose Luis Durandef generate_ip_options(opts):
725b8af90fSJose Luis Duran    if not opts:
735b8af90fSJose Luis Duran        return ""
745b8af90fSJose Luis Duran
755b8af90fSJose Luis Duran    routers = [
765b8af90fSJose Luis Duran        "192.0.2.10",
775b8af90fSJose Luis Duran        "192.0.2.20",
785b8af90fSJose Luis Duran        "192.0.2.30",
795b8af90fSJose Luis Duran        "192.0.2.40",
805b8af90fSJose Luis Duran        "192.0.2.50",
815b8af90fSJose Luis Duran        "192.0.2.60",
825b8af90fSJose Luis Duran        "192.0.2.70",
835b8af90fSJose Luis Duran        "192.0.2.80",
845b8af90fSJose Luis Duran        "192.0.2.90",
855b8af90fSJose Luis Duran    ]
865b8af90fSJose Luis Duran    routers_zero = [0, 0, 0, 0, 0, 0, 0, 0, 0]
875b8af90fSJose Luis Duran    if opts == "EOL":
885b8af90fSJose Luis Duran        options = sc.IPOption(b"\x00")
895b8af90fSJose Luis Duran    elif opts == "NOP":
905b8af90fSJose Luis Duran        options = sc.IPOption(b"\x01")
915b8af90fSJose Luis Duran    elif opts == "NOP-40":
925b8af90fSJose Luis Duran        options = sc.IPOption(b"\x01" * 40)
935b8af90fSJose Luis Duran    elif opts == "RR":
945b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
955b8af90fSJose Luis Duran        options = sc.IPOption_RR(pointer=40, routers=routers)
965b8af90fSJose Luis Duran    elif opts == "RR-same":
975b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
985b8af90fSJose Luis Duran        options = sc.IPOption_RR(pointer=3, routers=routers_zero)
995b8af90fSJose Luis Duran    elif opts == "RR-trunc":
1005b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1015b8af90fSJose Luis Duran        options = sc.IPOption_RR(length=7, routers=routers_zero)
1025b8af90fSJose Luis Duran    elif opts == "LSRR":
1035b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1045b8af90fSJose Luis Duran        options = sc.IPOption_LSRR(routers=routers)
1055b8af90fSJose Luis Duran    elif opts == "LSRR-trunc":
1065b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1075b8af90fSJose Luis Duran        options = sc.IPOption_LSRR(length=3, routers=routers_zero)
1085b8af90fSJose Luis Duran    elif opts == "SSRR":
1095b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1105b8af90fSJose Luis Duran        options = sc.IPOption_SSRR(routers=routers)
1115b8af90fSJose Luis Duran    elif opts == "SSRR-trunc":
1125b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1135b8af90fSJose Luis Duran        options = sc.IPOption_SSRR(length=3, routers=routers_zero)
1145b8af90fSJose Luis Duran    elif opts == "unk":
1155b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1165b8af90fSJose Luis Duran        options = sc.IPOption(b"\x9f")
1175b8af90fSJose Luis Duran    elif opts == "unk-40":
1185b8af90fSJose Luis Duran        ToolsHelper.set_sysctl("net.inet.ip.process_options", 0)
1195b8af90fSJose Luis Duran        options = sc.IPOption(b"\x9f" * 40)
1205b8af90fSJose Luis Duran    else:
1215b8af90fSJose Luis Duran        options = ""
1225b8af90fSJose Luis Duran    return options
1235b8af90fSJose Luis Duran
1245b8af90fSJose Luis Duran
1255b8af90fSJose Luis Durandef pinger(
1265b8af90fSJose Luis Duran    # Required arguments
1275b8af90fSJose Luis Duran    # Avoid setting defaults on these arguments,
1285b8af90fSJose Luis Duran    # as we want to set them explicitly in the tests
1295b8af90fSJose Luis Duran    iface: str,
1305b8af90fSJose Luis Duran    /,
1315b8af90fSJose Luis Duran    src: sc.scapy.fields.SourceIPField,
1325b8af90fSJose Luis Duran    dst: sc.scapy.layers.inet.DestIPField,
1335b8af90fSJose Luis Duran    icmp_type: sc.scapy.fields.ByteEnumField,
1345b8af90fSJose Luis Duran    icmp_code: sc.scapy.fields.MultiEnumField,
1355b8af90fSJose Luis Duran    # IP arguments
1365b8af90fSJose Luis Duran    ihl: Optional[sc.scapy.fields.BitField] = None,
1375b8af90fSJose Luis Duran    flags: Optional[sc.scapy.fields.FlagsField] = None,
1385b8af90fSJose Luis Duran    opts: Optional[str] = None,
1395b8af90fSJose Luis Duran    oip_ihl: Optional[sc.scapy.fields.BitField] = None,
1405b8af90fSJose Luis Duran    special: Optional[str] = None,
1415b8af90fSJose Luis Duran    # ICMP arguments
1425b8af90fSJose Luis Duran    # Match names with <netinet/ip_icmp.h>
1435b8af90fSJose Luis Duran    icmp_pptr: sc.scapy.fields.ByteField = 0,
1445b8af90fSJose Luis Duran    icmp_gwaddr: sc.scapy.fields.IPField = "0.0.0.0",
1455b8af90fSJose Luis Duran    icmp_nextmtu: sc.scapy.fields.ShortField = 0,
1465b8af90fSJose Luis Duran    icmp_otime: sc.scapy.layers.inet.ICMPTimeStampField = 0,
1475b8af90fSJose Luis Duran    icmp_rtime: sc.scapy.layers.inet.ICMPTimeStampField = 0,
1485b8af90fSJose Luis Duran    icmp_ttime: sc.scapy.layers.inet.ICMPTimeStampField = 0,
1495b8af90fSJose Luis Duran    icmp_mask: sc.scapy.fields.IPField = "0.0.0.0",
1505b8af90fSJose Luis Duran    request: Optional[str] = None,
1515b8af90fSJose Luis Duran    # Miscellaneous arguments
1525b8af90fSJose Luis Duran    count: int = 1,
1535b8af90fSJose Luis Duran    dup: bool = False,
1549fc2d858SJose Luis Duran    verbose: bool = True,
1555b8af90fSJose Luis Duran) -> subprocess.CompletedProcess:
1565b8af90fSJose Luis Duran    """P I N G E R
1575b8af90fSJose Luis Duran
1585b8af90fSJose Luis Duran    Echo reply faker
1595b8af90fSJose Luis Duran
1605b8af90fSJose Luis Duran    :param str iface: Interface to send packet to
1615b8af90fSJose Luis Duran    :keyword src: Source packet IP
1625b8af90fSJose Luis Duran    :type src: class:`scapy.fields.SourceIPField`
1635b8af90fSJose Luis Duran    :keyword dst: Destination packet IP
1645b8af90fSJose Luis Duran    :type dst: class:`scapy.layers.inet.DestIPField`
1655b8af90fSJose Luis Duran    :keyword icmp_type: ICMP type
1665b8af90fSJose Luis Duran    :type icmp_type: class:`scapy.fields.ByteEnumField`
1675b8af90fSJose Luis Duran    :keyword icmp_code: ICMP code
1685b8af90fSJose Luis Duran    :type icmp_code: class:`scapy.fields.MultiEnumField`
1695b8af90fSJose Luis Duran
1705b8af90fSJose Luis Duran    :keyword ihl: Internet Header Length, defaults to None
1715b8af90fSJose Luis Duran    :type ihl: class:`scapy.fields.BitField`, optional
1725b8af90fSJose Luis Duran    :keyword flags: IP flags - one of `DF`, `MF` or `evil`, defaults to None
1735b8af90fSJose Luis Duran    :type flags: class:`scapy.fields.FlagsField`, optional
1745b8af90fSJose Luis Duran    :keyword opts: Include IP options - one of `EOL`, `NOP`, `NOP-40`, `unk`,
1755b8af90fSJose Luis Duran        `unk-40`, `RR`, `RR-same`, `RR-trunc`, `LSRR`, `LSRR-trunc`, `SSRR` or
1765b8af90fSJose Luis Duran        `SSRR-trunc`, defaults to None
1775b8af90fSJose Luis Duran    :type opts: str, optional
1785b8af90fSJose Luis Duran    :keyword oip_ihl: Inner packet's Internet Header Length, defaults to None
1795b8af90fSJose Luis Duran    :type oip_ihl: class:`scapy.fields.BitField`, optional
1809fc2d858SJose Luis Duran    :keyword special: Send a special packet - one of `no-payload`, `not-mine`,
1819fc2d858SJose Luis Duran        `tcp`, `udp`, `wrong` or `warp`, defaults to None
1825b8af90fSJose Luis Duran    :type special: str, optional
1835b8af90fSJose Luis Duran    :keyword icmp_pptr: ICMP pointer, defaults to 0
1845b8af90fSJose Luis Duran    :type icmp_pptr: class:`scapy.fields.ByteField`
1855b8af90fSJose Luis Duran    :keyword icmp_gwaddr: ICMP gateway IP address, defaults to "0.0.0.0"
1865b8af90fSJose Luis Duran    :type icmp_gwaddr: class:`scapy.fields.IPField`
1875b8af90fSJose Luis Duran    :keyword icmp_nextmtu: ICMP next MTU, defaults to 0
1885b8af90fSJose Luis Duran    :type icmp_nextmtu: class:`scapy.fields.ShortField`
1895b8af90fSJose Luis Duran    :keyword icmp_otime: ICMP originate timestamp, defaults to 0
1905b8af90fSJose Luis Duran    :type icmp_otime: class:`scapy.layers.inet.ICMPTimeStampField`
1915b8af90fSJose Luis Duran    :keyword icmp_rtime: ICMP receive timestamp, defaults to 0
1925b8af90fSJose Luis Duran    :type icmp_rtime: class:`scapy.layers.inet.ICMPTimeStampField`
1935b8af90fSJose Luis Duran    :keyword icmp_ttime: ICMP transmit timestamp, defaults to 0
1945b8af90fSJose Luis Duran    :type icmp_ttime: class:`scapy.layers.inet.ICMPTimeStampField`
1955b8af90fSJose Luis Duran    :keyword icmp_mask: ICMP address mask, defaults to "0.0.0.0"
1965b8af90fSJose Luis Duran    :type icmp_mask: class:`scapy.fields.IPField`
1975b8af90fSJose Luis Duran    :keyword request: Request type - one of `mask` or `timestamp`,
1985b8af90fSJose Luis Duran        defaults to None
1995b8af90fSJose Luis Duran    :type request: str, optional
2005b8af90fSJose Luis Duran    :keyword count: Number of packets to send, defaults to 1
2015b8af90fSJose Luis Duran    :type count: int
2025b8af90fSJose Luis Duran    :keyword dup: Duplicate packets, defaults to `False`
2035b8af90fSJose Luis Duran    :type dup: bool
2049fc2d858SJose Luis Duran    :keyword verbose: Turn on/off verbosity, defaults to `True`
2059fc2d858SJose Luis Duran    :type verbose: bool
2065b8af90fSJose Luis Duran
2075b8af90fSJose Luis Duran    :return: A class:`subprocess.CompletedProcess` with the output from the
2085b8af90fSJose Luis Duran        ping utility
2095b8af90fSJose Luis Duran    :rtype: class:`subprocess.CompletedProcess`
2105b8af90fSJose Luis Duran    """
2115b8af90fSJose Luis Duran    tun = sc.TunTapInterface(iface)
2125b8af90fSJose Luis Duran    subprocess.run(["ifconfig", tun.iface, "up"], check=True)
2135b8af90fSJose Luis Duran    subprocess.run(["ifconfig", tun.iface, src, dst], check=True)
2145b8af90fSJose Luis Duran    ip_opts = generate_ip_options(opts)
2155b8af90fSJose Luis Duran    ip = sc.IP(ihl=ihl, flags=flags, src=dst, dst=src, options=ip_opts)
2165b8af90fSJose Luis Duran    command = [
2175b8af90fSJose Luis Duran        "/sbin/ping",
2185b8af90fSJose Luis Duran        "-c",
2195b8af90fSJose Luis Duran        str(count),
2205b8af90fSJose Luis Duran        "-t",
2215b8af90fSJose Luis Duran        str(count),
2225b8af90fSJose Luis Duran    ]
2239fc2d858SJose Luis Duran    if verbose:
2249fc2d858SJose Luis Duran        command += ["-v"]
2255b8af90fSJose Luis Duran    if request == "mask":
2265b8af90fSJose Luis Duran        command += ["-Mm"]
2275b8af90fSJose Luis Duran    if request == "timestamp":
2285b8af90fSJose Luis Duran        command += ["-Mt"]
2295b8af90fSJose Luis Duran    if special:
2305b8af90fSJose Luis Duran        command += ["-p1"]
2315b8af90fSJose Luis Duran    if opts in [
2325b8af90fSJose Luis Duran        "RR",
2335b8af90fSJose Luis Duran        "RR-same",
2345b8af90fSJose Luis Duran        "RR-trunc",
2355b8af90fSJose Luis Duran        "LSRR",
2365b8af90fSJose Luis Duran        "LSRR-trunc",
2375b8af90fSJose Luis Duran        "SSRR",
2385b8af90fSJose Luis Duran        "SSRR-trunc",
2395b8af90fSJose Luis Duran    ]:
2405b8af90fSJose Luis Duran        command += ["-R"]
2415b8af90fSJose Luis Duran    command += [dst]
2425b8af90fSJose Luis Duran    with subprocess.Popen(
2435b8af90fSJose Luis Duran        args=command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
2445b8af90fSJose Luis Duran    ) as ping:
2455b8af90fSJose Luis Duran        for dummy in range(count):
2465b8af90fSJose Luis Duran            echo = tun.recv()
2475b8af90fSJose Luis Duran            icmp = sc.ICMP(
2485b8af90fSJose Luis Duran                type=icmp_type,
2495b8af90fSJose Luis Duran                code=icmp_code,
2505b8af90fSJose Luis Duran                id=echo[sc.ICMP].id,
2515b8af90fSJose Luis Duran                seq=echo[sc.ICMP].seq,
2525b8af90fSJose Luis Duran                ts_ori=icmp_otime,
2535b8af90fSJose Luis Duran                ts_rx=icmp_rtime,
2545b8af90fSJose Luis Duran                ts_tx=icmp_ttime,
2555b8af90fSJose Luis Duran                gw=icmp_gwaddr,
2565b8af90fSJose Luis Duran                ptr=icmp_pptr,
2575b8af90fSJose Luis Duran                addr_mask=icmp_mask,
2585b8af90fSJose Luis Duran                nexthopmtu=icmp_nextmtu,
2595b8af90fSJose Luis Duran            )
2605b8af90fSJose Luis Duran            pkt = build_response_packet(echo, ip, icmp, oip_ihl, special)
2615b8af90fSJose Luis Duran            tun.send(pkt)
2625b8af90fSJose Luis Duran            if dup is True:
2635b8af90fSJose Luis Duran                tun.send(pkt)
2645b8af90fSJose Luis Duran        stdout, stderr = ping.communicate()
2655b8af90fSJose Luis Duran    return subprocess.CompletedProcess(
2665b8af90fSJose Luis Duran        ping.args, ping.returncode, stdout, stderr
2675b8af90fSJose Luis Duran    )
2685b8af90fSJose Luis Duran
2695b8af90fSJose Luis Duran
2705b8af90fSJose Luis Durandef redact(output):
2715b8af90fSJose Luis Duran    """Redact some elements of ping's output"""
2725b8af90fSJose Luis Duran    pattern_replacements = [
2735b8af90fSJose Luis Duran        ("localhost \([0-9]{1,3}(\.[0-9]{1,3}){3}\)", "localhost"),
2745b8af90fSJose Luis Duran        ("from [0-9]{1,3}(\.[0-9]{1,3}){3}", "from"),
2755b8af90fSJose Luis Duran        ("hlim=[0-9]*", "hlim="),
2765b8af90fSJose Luis Duran        ("ttl=[0-9]*", "ttl="),
2775b8af90fSJose Luis Duran        ("time=[0-9.-]*", "time="),
278ea6d1692SJose Luis Duran        ("\(-[0-9\.]+[0-9]+ ms\)", "(- ms)"),
2795b8af90fSJose Luis Duran        ("[0-9\.]+/[0-9.]+", "/"),
2805b8af90fSJose Luis Duran    ]
2815b8af90fSJose Luis Duran    for pattern, repl in pattern_replacements:
2825b8af90fSJose Luis Duran        output = re.sub(pattern, repl, output)
2835b8af90fSJose Luis Duran    return output
2845b8af90fSJose Luis Duran
2855b8af90fSJose Luis Duran
2865b8af90fSJose Luis Duranclass TestPing(SingleVnetTestTemplate):
2875b8af90fSJose Luis Duran    IPV6_PREFIXES: List[str] = ["2001:db8::1/64"]
2885b8af90fSJose Luis Duran    IPV4_PREFIXES: List[str] = ["192.0.2.1/24"]
2895b8af90fSJose Luis Duran
2905b8af90fSJose Luis Duran    # Each param in testdata contains a dictionary with the command,
2915b8af90fSJose Luis Duran    # and the expected outcome (returncode, redacted stdout, and stderr)
2925b8af90fSJose Luis Duran    testdata = [
2935b8af90fSJose Luis Duran        pytest.param(
2945b8af90fSJose Luis Duran            {
2955b8af90fSJose Luis Duran                "args": "ping -4 -c1 -s56 -t1 localhost",
2965b8af90fSJose Luis Duran                "returncode": 0,
2975b8af90fSJose Luis Duran                "stdout": """\
2985b8af90fSJose Luis DuranPING localhost: 56 data bytes
2995b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
3005b8af90fSJose Luis Duran
3015b8af90fSJose Luis Duran--- localhost ping statistics ---
3025b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3035b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
3045b8af90fSJose Luis Duran""",
3055b8af90fSJose Luis Duran                "stderr": "",
3065b8af90fSJose Luis Duran            },
3075b8af90fSJose Luis Duran            id="_4_c1_s56_t1_localhost",
3085b8af90fSJose Luis Duran        ),
3095b8af90fSJose Luis Duran        pytest.param(
3105b8af90fSJose Luis Duran            {
3115b8af90fSJose Luis Duran                "args": "ping -6 -c1 -s8 -t1 localhost",
3125b8af90fSJose Luis Duran                "returncode": 0,
3135b8af90fSJose Luis Duran                "stdout": """\
3145b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1
3155b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms
3165b8af90fSJose Luis Duran
3175b8af90fSJose Luis Duran--- localhost ping6 statistics ---
3185b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3195b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
3205b8af90fSJose Luis Duran""",
3215b8af90fSJose Luis Duran                "stderr": "",
3225b8af90fSJose Luis Duran            },
3235b8af90fSJose Luis Duran            id="_6_c1_s8_t1_localhost",
3245b8af90fSJose Luis Duran        ),
3255b8af90fSJose Luis Duran        pytest.param(
3265b8af90fSJose Luis Duran            {
3275b8af90fSJose Luis Duran                "args": "ping -A -c1 192.0.2.1",
3285b8af90fSJose Luis Duran                "returncode": 0,
3295b8af90fSJose Luis Duran                "stdout": """\
3305b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
3315b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
3325b8af90fSJose Luis Duran
3335b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
3345b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3355b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
3365b8af90fSJose Luis Duran""",
3375b8af90fSJose Luis Duran                "stderr": "",
3385b8af90fSJose Luis Duran            },
3395b8af90fSJose Luis Duran            id="_A_c1_192_0_2_1",
3405b8af90fSJose Luis Duran        ),
3415b8af90fSJose Luis Duran        pytest.param(
3425b8af90fSJose Luis Duran            {
3435b8af90fSJose Luis Duran                "args": "ping -A -c1 192.0.2.2",
3445b8af90fSJose Luis Duran                "returncode": 2,
3455b8af90fSJose Luis Duran                "stdout": """\
3465b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
3475b8af90fSJose Luis Duran
3485b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
3495b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
3505b8af90fSJose Luis Duran""",
3515b8af90fSJose Luis Duran                "stderr": "",
3525b8af90fSJose Luis Duran            },
3535b8af90fSJose Luis Duran            id="_A_c1_192_0_2_2",
3545b8af90fSJose Luis Duran        ),
3555b8af90fSJose Luis Duran        pytest.param(
3565b8af90fSJose Luis Duran            {
3575b8af90fSJose Luis Duran                "args": "ping -A -c1 2001:db8::1",
3585b8af90fSJose Luis Duran                "returncode": 0,
3595b8af90fSJose Luis Duran                "stdout": """\
3605b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
3615b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
3625b8af90fSJose Luis Duran
3635b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
3645b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3655b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
3665b8af90fSJose Luis Duran""",
3675b8af90fSJose Luis Duran                "stderr": "",
3685b8af90fSJose Luis Duran            },
3695b8af90fSJose Luis Duran            id="_A_c1_2001_db8__1",
3705b8af90fSJose Luis Duran        ),
3715b8af90fSJose Luis Duran        pytest.param(
3725b8af90fSJose Luis Duran            {
3735b8af90fSJose Luis Duran                "args": "ping -A -c1 2001:db8::2",
3745b8af90fSJose Luis Duran                "returncode": 2,
3755b8af90fSJose Luis Duran                "stdout": """\
3765b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
3775b8af90fSJose Luis Duran
3785b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
3795b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
3805b8af90fSJose Luis Duran""",
3815b8af90fSJose Luis Duran                "stderr": "",
3825b8af90fSJose Luis Duran            },
3835b8af90fSJose Luis Duran            id="_A_c1_2001_db8__2",
3845b8af90fSJose Luis Duran        ),
3855b8af90fSJose Luis Duran        pytest.param(
3865b8af90fSJose Luis Duran            {
3875b8af90fSJose Luis Duran                "args": "ping -A -c3 192.0.2.1",
3885b8af90fSJose Luis Duran                "returncode": 0,
3895b8af90fSJose Luis Duran                "stdout": """\
3905b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
3915b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
3925b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms
3935b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms
3945b8af90fSJose Luis Duran
3955b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
3965b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
3975b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
3985b8af90fSJose Luis Duran""",
3995b8af90fSJose Luis Duran                "stderr": "",
4005b8af90fSJose Luis Duran            },
4015b8af90fSJose Luis Duran            id="_A_3_192_0.2.1",
4025b8af90fSJose Luis Duran        ),
4035b8af90fSJose Luis Duran        pytest.param(
4045b8af90fSJose Luis Duran            {
4055b8af90fSJose Luis Duran                "args": "ping -A -c3 192.0.2.2",
4065b8af90fSJose Luis Duran                "returncode": 2,
4075b8af90fSJose Luis Duran                "stdout": """\
4085b8af90fSJose Luis Duran\x07\x07PING 192.0.2.2 (192.0.2.2): 56 data bytes
4095b8af90fSJose Luis Duran
4105b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
4115b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
4125b8af90fSJose Luis Duran""",
4135b8af90fSJose Luis Duran                "stderr": "",
4145b8af90fSJose Luis Duran            },
4155b8af90fSJose Luis Duran            id="_A_c3_192_0_2_2",
4165b8af90fSJose Luis Duran        ),
4175b8af90fSJose Luis Duran        pytest.param(
4185b8af90fSJose Luis Duran            {
4195b8af90fSJose Luis Duran                "args": "ping -A -c3 2001:db8::1",
4205b8af90fSJose Luis Duran                "returncode": 0,
4215b8af90fSJose Luis Duran                "stdout": """\
4225b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
4235b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
4245b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms
4255b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms
4265b8af90fSJose Luis Duran
4275b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
4285b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
4295b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
4305b8af90fSJose Luis Duran""",
4315b8af90fSJose Luis Duran                "stderr": "",
4325b8af90fSJose Luis Duran            },
4335b8af90fSJose Luis Duran            id="_A_c3_2001_db8__1",
4345b8af90fSJose Luis Duran        ),
4355b8af90fSJose Luis Duran        pytest.param(
4365b8af90fSJose Luis Duran            {
4375b8af90fSJose Luis Duran                "args": "ping -A -c3 2001:db8::2",
4385b8af90fSJose Luis Duran                "returncode": 2,
4395b8af90fSJose Luis Duran                "stdout": """\
4405b8af90fSJose Luis Duran\x07\x07PING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
4415b8af90fSJose Luis Duran
4425b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
4435b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
4445b8af90fSJose Luis Duran""",
4455b8af90fSJose Luis Duran                "stderr": "",
4465b8af90fSJose Luis Duran            },
4475b8af90fSJose Luis Duran            id="_A_c3_2001_db8__2",
4485b8af90fSJose Luis Duran        ),
4495b8af90fSJose Luis Duran        pytest.param(
4505b8af90fSJose Luis Duran            {
4515b8af90fSJose Luis Duran                "args": "ping -c1 192.0.2.1",
4525b8af90fSJose Luis Duran                "returncode": 0,
4535b8af90fSJose Luis Duran                "stdout": """\
4545b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
4555b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
4565b8af90fSJose Luis Duran
4575b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
4585b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
4595b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
4605b8af90fSJose Luis Duran""",
4615b8af90fSJose Luis Duran                "stderr": "",
4625b8af90fSJose Luis Duran            },
4635b8af90fSJose Luis Duran            id="_c1_192_0_2_1",
4645b8af90fSJose Luis Duran        ),
4655b8af90fSJose Luis Duran        pytest.param(
4665b8af90fSJose Luis Duran            {
4675b8af90fSJose Luis Duran                "args": "ping -c1 192.0.2.2",
4685b8af90fSJose Luis Duran                "returncode": 2,
4695b8af90fSJose Luis Duran                "stdout": """\
4705b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
4715b8af90fSJose Luis Duran
4725b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
4735b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
4745b8af90fSJose Luis Duran""",
4755b8af90fSJose Luis Duran                "stderr": "",
4765b8af90fSJose Luis Duran            },
4775b8af90fSJose Luis Duran            id="_c1_192_0_2_2",
4785b8af90fSJose Luis Duran        ),
4795b8af90fSJose Luis Duran        pytest.param(
4805b8af90fSJose Luis Duran            {
4815b8af90fSJose Luis Duran                "args": "ping -c1 2001:db8::1",
4825b8af90fSJose Luis Duran                "returncode": 0,
4835b8af90fSJose Luis Duran                "stdout": """\
4845b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
4855b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
4865b8af90fSJose Luis Duran
4875b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
4885b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
4895b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
4905b8af90fSJose Luis Duran""",
4915b8af90fSJose Luis Duran                "stderr": "",
4925b8af90fSJose Luis Duran            },
4935b8af90fSJose Luis Duran            id="_c1_2001_db8__1",
4945b8af90fSJose Luis Duran        ),
4955b8af90fSJose Luis Duran        pytest.param(
4965b8af90fSJose Luis Duran            {
4975b8af90fSJose Luis Duran                "args": "ping -c1 2001:db8::2",
4985b8af90fSJose Luis Duran                "returncode": 2,
4995b8af90fSJose Luis Duran                "stdout": """\
5005b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
5015b8af90fSJose Luis Duran
5025b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
5035b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
5045b8af90fSJose Luis Duran""",
5055b8af90fSJose Luis Duran                "stderr": "",
5065b8af90fSJose Luis Duran            },
5075b8af90fSJose Luis Duran            id="_c1_2001_db8__2",
5085b8af90fSJose Luis Duran        ),
5095b8af90fSJose Luis Duran        pytest.param(
5105b8af90fSJose Luis Duran            {
5115b8af90fSJose Luis Duran                "args": "ping -c1 -S127.0.0.1 -s56 -t1 localhost",
5125b8af90fSJose Luis Duran                "returncode": 0,
5135b8af90fSJose Luis Duran                "stdout": """\
5145b8af90fSJose Luis DuranPING localhost from: 56 data bytes
5155b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
5165b8af90fSJose Luis Duran
5175b8af90fSJose Luis Duran--- localhost ping statistics ---
5185b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
5195b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
5205b8af90fSJose Luis Duran""",
5215b8af90fSJose Luis Duran                "stderr": "",
5225b8af90fSJose Luis Duran            },
5235b8af90fSJose Luis Duran            id="_c1_S127_0_0_1_s56_t1_localhost",
5245b8af90fSJose Luis Duran        ),
5255b8af90fSJose Luis Duran        pytest.param(
5265b8af90fSJose Luis Duran            {
5275b8af90fSJose Luis Duran                "args": "ping -c1 -S::1 -s8 -t1 localhost",
5285b8af90fSJose Luis Duran                "returncode": 0,
5295b8af90fSJose Luis Duran                "stdout": """\
5305b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1
5315b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms
5325b8af90fSJose Luis Duran
5335b8af90fSJose Luis Duran--- localhost ping6 statistics ---
5345b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
5355b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
5365b8af90fSJose Luis Duran""",
5375b8af90fSJose Luis Duran                "stderr": "",
5385b8af90fSJose Luis Duran            },
5395b8af90fSJose Luis Duran            id="_c1_S__1_s8_t1_localhost",
5405b8af90fSJose Luis Duran        ),
5415b8af90fSJose Luis Duran        pytest.param(
5425b8af90fSJose Luis Duran            {
5435b8af90fSJose Luis Duran                "args": "ping -c3 192.0.2.1",
5445b8af90fSJose Luis Duran                "returncode": 0,
5455b8af90fSJose Luis Duran                "stdout": """\
5465b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
5475b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
5485b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms
5495b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms
5505b8af90fSJose Luis Duran
5515b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
5525b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
5535b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
5545b8af90fSJose Luis Duran""",
5555b8af90fSJose Luis Duran                "stderr": "",
5565b8af90fSJose Luis Duran            },
5575b8af90fSJose Luis Duran            id="_c3_192_0_2_1",
5585b8af90fSJose Luis Duran        ),
5595b8af90fSJose Luis Duran        pytest.param(
5605b8af90fSJose Luis Duran            {
5615b8af90fSJose Luis Duran                "args": "ping -c3 192.0.2.2",
5625b8af90fSJose Luis Duran                "returncode": 2,
5635b8af90fSJose Luis Duran                "stdout": """\
5645b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
5655b8af90fSJose Luis Duran
5665b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
5675b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
5685b8af90fSJose Luis Duran""",
5695b8af90fSJose Luis Duran                "stderr": "",
5705b8af90fSJose Luis Duran            },
5715b8af90fSJose Luis Duran            id="_c3_192_0_2_2",
5725b8af90fSJose Luis Duran        ),
5735b8af90fSJose Luis Duran        pytest.param(
5745b8af90fSJose Luis Duran            {
5755b8af90fSJose Luis Duran                "args": "ping -c3 2001:db8::1",
5765b8af90fSJose Luis Duran                "returncode": 0,
5775b8af90fSJose Luis Duran                "stdout": """\
5785b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
5795b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
5805b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms
5815b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms
5825b8af90fSJose Luis Duran
5835b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
5845b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
5855b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
5865b8af90fSJose Luis Duran""",
5875b8af90fSJose Luis Duran                "stderr": "",
5885b8af90fSJose Luis Duran            },
5895b8af90fSJose Luis Duran            id="_c3_2001_db8__1",
5905b8af90fSJose Luis Duran        ),
5915b8af90fSJose Luis Duran        pytest.param(
5925b8af90fSJose Luis Duran            {
5935b8af90fSJose Luis Duran                "args": "ping -c3 2001:db8::2",
5945b8af90fSJose Luis Duran                "returncode": 2,
5955b8af90fSJose Luis Duran                "stdout": """\
5965b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
5975b8af90fSJose Luis Duran
5985b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
5995b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
6005b8af90fSJose Luis Duran""",
6015b8af90fSJose Luis Duran                "stderr": "",
6025b8af90fSJose Luis Duran            },
6035b8af90fSJose Luis Duran            id="_c3_2001_db8__2",
6045b8af90fSJose Luis Duran        ),
6055b8af90fSJose Luis Duran        pytest.param(
6065b8af90fSJose Luis Duran            {
6075b8af90fSJose Luis Duran                "args": "ping -q -c1 192.0.2.1",
6085b8af90fSJose Luis Duran                "returncode": 0,
6095b8af90fSJose Luis Duran                "stdout": """\
6105b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
6115b8af90fSJose Luis Duran
6125b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
6135b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
6145b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
6155b8af90fSJose Luis Duran""",
6165b8af90fSJose Luis Duran                "stderr": "",
6175b8af90fSJose Luis Duran            },
6185b8af90fSJose Luis Duran            id="_q_c1_192_0_2_1",
6195b8af90fSJose Luis Duran        ),
6205b8af90fSJose Luis Duran        pytest.param(
6215b8af90fSJose Luis Duran            {
6225b8af90fSJose Luis Duran                "args": "ping -q -c1 192.0.2.2",
6235b8af90fSJose Luis Duran                "returncode": 2,
6245b8af90fSJose Luis Duran                "stdout": """\
6255b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
6265b8af90fSJose Luis Duran
6275b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
6285b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
6295b8af90fSJose Luis Duran""",
6305b8af90fSJose Luis Duran                "stderr": "",
6315b8af90fSJose Luis Duran            },
6325b8af90fSJose Luis Duran            id="_q_c1_192_0_2_2",
6335b8af90fSJose Luis Duran        ),
6345b8af90fSJose Luis Duran        pytest.param(
6355b8af90fSJose Luis Duran            {
6365b8af90fSJose Luis Duran                "args": "ping -q -c1 2001:db8::1",
6375b8af90fSJose Luis Duran                "returncode": 0,
6385b8af90fSJose Luis Duran                "stdout": """\
6395b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
6405b8af90fSJose Luis Duran
6415b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
6425b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
6435b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
6445b8af90fSJose Luis Duran""",
6455b8af90fSJose Luis Duran                "stderr": "",
6465b8af90fSJose Luis Duran            },
6475b8af90fSJose Luis Duran            id="_q_c1_2001_db8__1",
6485b8af90fSJose Luis Duran        ),
6495b8af90fSJose Luis Duran        pytest.param(
6505b8af90fSJose Luis Duran            {
6515b8af90fSJose Luis Duran                "args": "ping -q -c1 2001:db8::2",
6525b8af90fSJose Luis Duran                "returncode": 2,
6535b8af90fSJose Luis Duran                "stdout": """\
6545b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
6555b8af90fSJose Luis Duran
6565b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
6575b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
6585b8af90fSJose Luis Duran""",
6595b8af90fSJose Luis Duran                "stderr": "",
6605b8af90fSJose Luis Duran            },
6615b8af90fSJose Luis Duran            id="_q_c1_2001_db8__2",
6625b8af90fSJose Luis Duran        ),
6635b8af90fSJose Luis Duran        pytest.param(
6645b8af90fSJose Luis Duran            {
6655b8af90fSJose Luis Duran                "args": "ping -q -c3 192.0.2.1",
6665b8af90fSJose Luis Duran                "returncode": 0,
6675b8af90fSJose Luis Duran                "stdout": """\
6685b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
6695b8af90fSJose Luis Duran
6705b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
6715b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
6725b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
6735b8af90fSJose Luis Duran""",
6745b8af90fSJose Luis Duran                "stderr": "",
6755b8af90fSJose Luis Duran            },
6765b8af90fSJose Luis Duran            id="_q_c3_192_0_2_1",
6775b8af90fSJose Luis Duran        ),
6785b8af90fSJose Luis Duran        pytest.param(
6795b8af90fSJose Luis Duran            {
6805b8af90fSJose Luis Duran                "args": "ping -q -c3 192.0.2.2",
6815b8af90fSJose Luis Duran                "returncode": 2,
6825b8af90fSJose Luis Duran                "stdout": """\
6835b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
6845b8af90fSJose Luis Duran
6855b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
6865b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
6875b8af90fSJose Luis Duran""",
6885b8af90fSJose Luis Duran                "stderr": "",
6895b8af90fSJose Luis Duran            },
6905b8af90fSJose Luis Duran            id="_q_c3_192_0_2_2",
6915b8af90fSJose Luis Duran        ),
6925b8af90fSJose Luis Duran        pytest.param(
6935b8af90fSJose Luis Duran            {
6945b8af90fSJose Luis Duran                "args": "ping -q -c3 2001:db8::1",
6955b8af90fSJose Luis Duran                "returncode": 0,
6965b8af90fSJose Luis Duran                "stdout": """\
6975b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
6985b8af90fSJose Luis Duran
6995b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
7005b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
7015b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
7025b8af90fSJose Luis Duran""",
7035b8af90fSJose Luis Duran                "stderr": "",
7045b8af90fSJose Luis Duran            },
7055b8af90fSJose Luis Duran            id="_q_c3_2001_db8__1",
7065b8af90fSJose Luis Duran        ),
7075b8af90fSJose Luis Duran        pytest.param(
7085b8af90fSJose Luis Duran            {
7095b8af90fSJose Luis Duran                "args": "ping -q -c3 2001:db8::2",
7105b8af90fSJose Luis Duran                "returncode": 2,
7115b8af90fSJose Luis Duran                "stdout": """\
7125b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
7135b8af90fSJose Luis Duran
7145b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
7155b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
7165b8af90fSJose Luis Duran""",
7175b8af90fSJose Luis Duran                "stderr": "",
7185b8af90fSJose Luis Duran            },
7195b8af90fSJose Luis Duran            id="_q_c3_2001_db8__2",
7205b8af90fSJose Luis Duran        ),
7215b8af90fSJose Luis Duran    ]
7225b8af90fSJose Luis Duran
7235b8af90fSJose Luis Duran    @pytest.mark.parametrize("expected", testdata)
7245b8af90fSJose Luis Duran    def test_ping(self, expected):
7255b8af90fSJose Luis Duran        """Test ping"""
7265b8af90fSJose Luis Duran        ping = subprocess.run(
7275b8af90fSJose Luis Duran            expected["args"].split(),
7285b8af90fSJose Luis Duran            capture_output=True,
7295b8af90fSJose Luis Duran            timeout=15,
7305b8af90fSJose Luis Duran            text=True,
7315b8af90fSJose Luis Duran        )
7325b8af90fSJose Luis Duran        assert ping.returncode == expected["returncode"]
7335b8af90fSJose Luis Duran        assert redact(ping.stdout) == expected["stdout"]
7345b8af90fSJose Luis Duran        assert ping.stderr == expected["stderr"]
7355b8af90fSJose Luis Duran
7365b8af90fSJose Luis Duran    # Each param in ping46_testdata contains a dictionary with the arguments
7375b8af90fSJose Luis Duran    # and the expected outcome (returncode, redacted stdout, and stderr)
7385b8af90fSJose Luis Duran    # common to `ping -4` and `ping -6`
7395b8af90fSJose Luis Duran    ping46_testdata = [
7405b8af90fSJose Luis Duran        pytest.param(
7415b8af90fSJose Luis Duran            {
7425b8af90fSJose Luis Duran                "args": "-Wx localhost",
7435b8af90fSJose Luis Duran                "returncode": os.EX_USAGE,
7445b8af90fSJose Luis Duran                "stdout": "",
7455b8af90fSJose Luis Duran                "stderr": "ping: invalid timing interval: `x'\n",
7465b8af90fSJose Luis Duran            },
7475b8af90fSJose Luis Duran            id="_Wx_localhost",
7485b8af90fSJose Luis Duran        ),
7495b8af90fSJose Luis Duran    ]
7505b8af90fSJose Luis Duran
7515b8af90fSJose Luis Duran    @pytest.mark.parametrize("expected", ping46_testdata)
7525b8af90fSJose Luis Duran    def test_ping_46(self, expected):
7535b8af90fSJose Luis Duran        """Test ping -4/ping -6"""
7545b8af90fSJose Luis Duran        for version in [4, 6]:
7555b8af90fSJose Luis Duran            ping = subprocess.run(
7565b8af90fSJose Luis Duran                ["ping", f"-{version}"] + expected["args"].split(),
7575b8af90fSJose Luis Duran                capture_output=True,
7585b8af90fSJose Luis Duran                timeout=15,
7595b8af90fSJose Luis Duran                text=True,
7605b8af90fSJose Luis Duran            )
7615b8af90fSJose Luis Duran            assert ping.returncode == expected["returncode"]
7625b8af90fSJose Luis Duran            assert redact(ping.stdout) == expected["stdout"]
7635b8af90fSJose Luis Duran            assert ping.stderr == expected["stderr"]
7645b8af90fSJose Luis Duran
7655b8af90fSJose Luis Duran    # Each param in pinger_testdata contains a dictionary with the keywords to
7665b8af90fSJose Luis Duran    # `pinger()` and a dictionary with the expected outcome (returncode,
7675b8af90fSJose Luis Duran    # stdout, stderr, and if ping's output is redacted)
7685b8af90fSJose Luis Duran    pinger_testdata = [
7695b8af90fSJose Luis Duran        pytest.param(
7705b8af90fSJose Luis Duran            {
7715b8af90fSJose Luis Duran                "src": "192.0.2.1",
7725b8af90fSJose Luis Duran                "dst": "192.0.2.2",
7735b8af90fSJose Luis Duran                "icmp_type": 0,
7745b8af90fSJose Luis Duran                "icmp_code": 0,
7755b8af90fSJose Luis Duran            },
7765b8af90fSJose Luis Duran            {
7775b8af90fSJose Luis Duran                "returncode": 0,
7785b8af90fSJose Luis Duran                "stdout": """\
7795b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
7805b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
7815b8af90fSJose Luis Duran
7825b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
7835b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
7845b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
7855b8af90fSJose Luis Duran""",
7865b8af90fSJose Luis Duran                "stderr": "",
7875b8af90fSJose Luis Duran                "redacted": True,
7885b8af90fSJose Luis Duran            },
7895b8af90fSJose Luis Duran            id="_0_0",
7905b8af90fSJose Luis Duran        ),
7915b8af90fSJose Luis Duran        pytest.param(
7925b8af90fSJose Luis Duran            {
7935b8af90fSJose Luis Duran                "src": "192.0.2.1",
7945b8af90fSJose Luis Duran                "dst": "192.0.2.2",
7955b8af90fSJose Luis Duran                "icmp_type": 0,
7965b8af90fSJose Luis Duran                "icmp_code": 0,
797076b718dSJose Luis Duran                "opts": "EOL",
798076b718dSJose Luis Duran            },
799076b718dSJose Luis Duran            {
800076b718dSJose Luis Duran                "returncode": 0,
801076b718dSJose Luis Duran                "stdout": """\
802076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
803076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
804076b718dSJose Luis Duranwrong total length 88 instead of 84
805076b718dSJose Luis Duran
806076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
807076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
808076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
809076b718dSJose Luis Duran""",
810076b718dSJose Luis Duran                "stderr": "",
811076b718dSJose Luis Duran                "redacted": True,
812076b718dSJose Luis Duran            },
813076b718dSJose Luis Duran            id="_0_0_opts_EOL",
814076b718dSJose Luis Duran        ),
815076b718dSJose Luis Duran        pytest.param(
816076b718dSJose Luis Duran            {
817076b718dSJose Luis Duran                "src": "192.0.2.1",
818076b718dSJose Luis Duran                "dst": "192.0.2.2",
819076b718dSJose Luis Duran                "icmp_type": 0,
820076b718dSJose Luis Duran                "icmp_code": 0,
821076b718dSJose Luis Duran                "opts": "LSRR",
822076b718dSJose Luis Duran            },
823076b718dSJose Luis Duran            {
824076b718dSJose Luis Duran                "returncode": 0,
825076b718dSJose Luis Duran                "stdout": """\
826076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
827076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
828076b718dSJose Luis DuranLSRR: 	192.0.2.10
829076b718dSJose Luis Duran	192.0.2.20
830076b718dSJose Luis Duran	192.0.2.30
831076b718dSJose Luis Duran	192.0.2.40
832076b718dSJose Luis Duran	192.0.2.50
833076b718dSJose Luis Duran	192.0.2.60
834076b718dSJose Luis Duran	192.0.2.70
835076b718dSJose Luis Duran	192.0.2.80
836076b718dSJose Luis Duran	192.0.2.90
837076b718dSJose Luis Duran
838076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
839076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
840076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
841076b718dSJose Luis Duran""",
842076b718dSJose Luis Duran                "stderr": "",
843076b718dSJose Luis Duran                "redacted": True,
844076b718dSJose Luis Duran            },
845076b718dSJose Luis Duran            id="_0_0_opts_LSRR",
846076b718dSJose Luis Duran        ),
847076b718dSJose Luis Duran        pytest.param(
848076b718dSJose Luis Duran            {
849076b718dSJose Luis Duran                "src": "192.0.2.1",
850076b718dSJose Luis Duran                "dst": "192.0.2.2",
851076b718dSJose Luis Duran                "icmp_type": 0,
852076b718dSJose Luis Duran                "icmp_code": 0,
853076b718dSJose Luis Duran                "opts": "LSRR-trunc",
854076b718dSJose Luis Duran            },
855076b718dSJose Luis Duran            {
856076b718dSJose Luis Duran                "returncode": 0,
857076b718dSJose Luis Duran                "stdout": """\
858076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
859076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
860076b718dSJose Luis DuranLSRR: 	(truncated route)
861076b718dSJose Luis Duran
862076b718dSJose Luis Duran
863076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
864076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
865076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
866076b718dSJose Luis Duran""",
867076b718dSJose Luis Duran                "stderr": "",
868076b718dSJose Luis Duran                "redacted": True,
869076b718dSJose Luis Duran            },
870076b718dSJose Luis Duran            id="_0_0_opts_LSRR_trunc",
871076b718dSJose Luis Duran        ),
872076b718dSJose Luis Duran        pytest.param(
873076b718dSJose Luis Duran            {
874076b718dSJose Luis Duran                "src": "192.0.2.1",
875076b718dSJose Luis Duran                "dst": "192.0.2.2",
876076b718dSJose Luis Duran                "icmp_type": 0,
877076b718dSJose Luis Duran                "icmp_code": 0,
878076b718dSJose Luis Duran                "opts": "SSRR",
879076b718dSJose Luis Duran            },
880076b718dSJose Luis Duran            {
881076b718dSJose Luis Duran                "returncode": 0,
882076b718dSJose Luis Duran                "stdout": """\
883076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
884076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
885076b718dSJose Luis DuranSSRR: 	192.0.2.10
886076b718dSJose Luis Duran	192.0.2.20
887076b718dSJose Luis Duran	192.0.2.30
888076b718dSJose Luis Duran	192.0.2.40
889076b718dSJose Luis Duran	192.0.2.50
890076b718dSJose Luis Duran	192.0.2.60
891076b718dSJose Luis Duran	192.0.2.70
892076b718dSJose Luis Duran	192.0.2.80
893076b718dSJose Luis Duran	192.0.2.90
894076b718dSJose Luis Duran
895076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
896076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
897076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
898076b718dSJose Luis Duran""",
899076b718dSJose Luis Duran                "stderr": "",
900076b718dSJose Luis Duran                "redacted": True,
901076b718dSJose Luis Duran            },
902076b718dSJose Luis Duran            id="_0_0_opts_SSRR",
903076b718dSJose Luis Duran        ),
904076b718dSJose Luis Duran        pytest.param(
905076b718dSJose Luis Duran            {
906076b718dSJose Luis Duran                "src": "192.0.2.1",
907076b718dSJose Luis Duran                "dst": "192.0.2.2",
908076b718dSJose Luis Duran                "icmp_type": 0,
909076b718dSJose Luis Duran                "icmp_code": 0,
910076b718dSJose Luis Duran                "opts": "SSRR-trunc",
911076b718dSJose Luis Duran            },
912076b718dSJose Luis Duran            {
913076b718dSJose Luis Duran                "returncode": 0,
914076b718dSJose Luis Duran                "stdout": """\
915076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
916076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
917076b718dSJose Luis DuranSSRR: 	(truncated route)
918076b718dSJose Luis Duran
919076b718dSJose Luis Duran
920076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
921076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
922076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
923076b718dSJose Luis Duran""",
924076b718dSJose Luis Duran                "stderr": "",
925076b718dSJose Luis Duran                "redacted": True,
926076b718dSJose Luis Duran            },
927076b718dSJose Luis Duran            id="_0_0_opts_SSRR_trunc",
928076b718dSJose Luis Duran        ),
929076b718dSJose Luis Duran        pytest.param(
930076b718dSJose Luis Duran            {
931076b718dSJose Luis Duran                "src": "192.0.2.1",
932076b718dSJose Luis Duran                "dst": "192.0.2.2",
933076b718dSJose Luis Duran                "icmp_type": 0,
934076b718dSJose Luis Duran                "icmp_code": 0,
935076b718dSJose Luis Duran                "opts": "RR",
936076b718dSJose Luis Duran            },
937076b718dSJose Luis Duran            {
938076b718dSJose Luis Duran                "returncode": 0,
939076b718dSJose Luis Duran                "stdout": """\
940076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
941076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
942076b718dSJose Luis DuranRR: 	192.0.2.10
943076b718dSJose Luis Duran	192.0.2.20
944076b718dSJose Luis Duran	192.0.2.30
945076b718dSJose Luis Duran	192.0.2.40
946076b718dSJose Luis Duran	192.0.2.50
947076b718dSJose Luis Duran	192.0.2.60
948076b718dSJose Luis Duran	192.0.2.70
949076b718dSJose Luis Duran	192.0.2.80
950076b718dSJose Luis Duran	192.0.2.90
951076b718dSJose Luis Duran
952076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
953076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
954076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
955076b718dSJose Luis Duran""",
956076b718dSJose Luis Duran                "stderr": "",
957076b718dSJose Luis Duran                "redacted": True,
958076b718dSJose Luis Duran            },
959076b718dSJose Luis Duran            id="_0_0_opts_RR",
960076b718dSJose Luis Duran        ),
961076b718dSJose Luis Duran        pytest.param(
962076b718dSJose Luis Duran            {
963076b718dSJose Luis Duran                "src": "192.0.2.1",
964076b718dSJose Luis Duran                "dst": "192.0.2.2",
965076b718dSJose Luis Duran                "icmp_type": 0,
966076b718dSJose Luis Duran                "icmp_code": 0,
967076b718dSJose Luis Duran                "opts": "RR-same",
968076b718dSJose Luis Duran            },
969076b718dSJose Luis Duran            {
970076b718dSJose Luis Duran                "returncode": 0,
971076b718dSJose Luis Duran                "stdout": """\
972076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
973076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms	(same route)
974076b718dSJose Luis Duran
975076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
976076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
977076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
978076b718dSJose Luis Duran""",
979076b718dSJose Luis Duran                "stderr": "",
980076b718dSJose Luis Duran                "redacted": True,
981076b718dSJose Luis Duran            },
982076b718dSJose Luis Duran            id="_0_0_opts_RR_same",
983076b718dSJose Luis Duran        ),
984076b718dSJose Luis Duran        pytest.param(
985076b718dSJose Luis Duran            {
986076b718dSJose Luis Duran                "src": "192.0.2.1",
987076b718dSJose Luis Duran                "dst": "192.0.2.2",
988076b718dSJose Luis Duran                "icmp_type": 0,
989076b718dSJose Luis Duran                "icmp_code": 0,
990076b718dSJose Luis Duran                "opts": "RR-trunc",
991076b718dSJose Luis Duran            },
992076b718dSJose Luis Duran            {
993076b718dSJose Luis Duran                "returncode": 0,
994076b718dSJose Luis Duran                "stdout": """\
995076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
996076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
997076b718dSJose Luis DuranRR: 	(truncated route)
998076b718dSJose Luis Duran
999076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
1000076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
1001076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
1002076b718dSJose Luis Duran""",
1003076b718dSJose Luis Duran                "stderr": "",
1004076b718dSJose Luis Duran                "redacted": True,
1005076b718dSJose Luis Duran            },
1006076b718dSJose Luis Duran            id="_0_0_opts_RR_trunc",
1007076b718dSJose Luis Duran        ),
1008076b718dSJose Luis Duran        pytest.param(
1009076b718dSJose Luis Duran            {
1010076b718dSJose Luis Duran                "src": "192.0.2.1",
1011076b718dSJose Luis Duran                "dst": "192.0.2.2",
1012076b718dSJose Luis Duran                "icmp_type": 0,
1013076b718dSJose Luis Duran                "icmp_code": 0,
1014076b718dSJose Luis Duran                "opts": "NOP",
1015076b718dSJose Luis Duran            },
1016076b718dSJose Luis Duran            {
1017076b718dSJose Luis Duran                "returncode": 0,
1018076b718dSJose Luis Duran                "stdout": """\
1019076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1020076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
1021076b718dSJose Luis Duranwrong total length 88 instead of 84
1022076b718dSJose Luis DuranNOP
1023076b718dSJose Luis Duran
1024076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
1025076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
1026076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
1027076b718dSJose Luis Duran""",
1028076b718dSJose Luis Duran                "stderr": "",
1029076b718dSJose Luis Duran                "redacted": True,
1030076b718dSJose Luis Duran            },
1031076b718dSJose Luis Duran            id="_0_0_opts_NOP",
1032076b718dSJose Luis Duran        ),
1033076b718dSJose Luis Duran        pytest.param(
1034076b718dSJose Luis Duran            {
1035076b718dSJose Luis Duran                "src": "192.0.2.1",
1036076b718dSJose Luis Duran                "dst": "192.0.2.2",
1037*20012a3aSJose Luis Duran                "icmp_type": 3,
1038*20012a3aSJose Luis Duran                "icmp_code": 1,
1039*20012a3aSJose Luis Duran                "ihl": 0x4,
1040*20012a3aSJose Luis Duran            },
1041*20012a3aSJose Luis Duran            {
1042*20012a3aSJose Luis Duran                "returncode": 2,
1043*20012a3aSJose Luis Duran                "stdout": """\
1044*20012a3aSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1045*20012a3aSJose Luis Duran
1046*20012a3aSJose Luis Duran--- 192.0.2.2 ping statistics ---
1047*20012a3aSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
1048*20012a3aSJose Luis Duran""",
1049*20012a3aSJose Luis Duran                "stderr": "",  # "IHL too short" message not shown
1050*20012a3aSJose Luis Duran                "redacted": False,
1051*20012a3aSJose Luis Duran            },
1052*20012a3aSJose Luis Duran            id="_IHL_too_short",
1053*20012a3aSJose Luis Duran        ),
1054*20012a3aSJose Luis Duran        pytest.param(
1055*20012a3aSJose Luis Duran            {
1056*20012a3aSJose Luis Duran                "src": "192.0.2.1",
1057*20012a3aSJose Luis Duran                "dst": "192.0.2.2",
1058*20012a3aSJose Luis Duran                "icmp_type": 3,
1059*20012a3aSJose Luis Duran                "icmp_code": 1,
1060*20012a3aSJose Luis Duran                "special": "no-payload",
1061*20012a3aSJose Luis Duran            },
1062*20012a3aSJose Luis Duran            {
1063*20012a3aSJose Luis Duran                "returncode": 2,
1064*20012a3aSJose Luis Duran                "stdout": """\
1065*20012a3aSJose Luis DuranPATTERN: 0x01
1066*20012a3aSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1067*20012a3aSJose Luis Duran
1068*20012a3aSJose Luis Duran--- 192.0.2.2 ping statistics ---
1069*20012a3aSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
1070*20012a3aSJose Luis Duran""",
1071*20012a3aSJose Luis Duran                "stderr": """\
1072*20012a3aSJose Luis Duranping: quoted data too short (28 bytes) from 192.0.2.2
1073*20012a3aSJose Luis Duran""",
1074*20012a3aSJose Luis Duran                "redacted": False,
1075*20012a3aSJose Luis Duran            },
1076*20012a3aSJose Luis Duran            id="_quoted_data_too_short",
1077*20012a3aSJose Luis Duran        ),
1078*20012a3aSJose Luis Duran        pytest.param(
1079*20012a3aSJose Luis Duran            {
1080*20012a3aSJose Luis Duran                "src": "192.0.2.1",
1081*20012a3aSJose Luis Duran                "dst": "192.0.2.2",
1082*20012a3aSJose Luis Duran                "icmp_type": 3,
1083*20012a3aSJose Luis Duran                "icmp_code": 1,
1084*20012a3aSJose Luis Duran                "oip_ihl": 0x4,
1085*20012a3aSJose Luis Duran            },
1086*20012a3aSJose Luis Duran            {
1087*20012a3aSJose Luis Duran                "returncode": 2,
1088*20012a3aSJose Luis Duran                "stdout": """\
1089*20012a3aSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1090*20012a3aSJose Luis Duran
1091*20012a3aSJose Luis Duran--- 192.0.2.2 ping statistics ---
1092*20012a3aSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
1093*20012a3aSJose Luis Duran""",
1094*20012a3aSJose Luis Duran                "stderr": "",  # "inner IHL too short" message not shown
1095*20012a3aSJose Luis Duran                "redacted": False,
1096*20012a3aSJose Luis Duran            },
1097*20012a3aSJose Luis Duran            id="_inner_IHL_too_short",
1098*20012a3aSJose Luis Duran        ),
1099*20012a3aSJose Luis Duran        pytest.param(
1100*20012a3aSJose Luis Duran            {
1101*20012a3aSJose Luis Duran                "src": "192.0.2.1",
1102*20012a3aSJose Luis Duran                "dst": "192.0.2.2",
1103*20012a3aSJose Luis Duran                "icmp_type": 3,
1104*20012a3aSJose Luis Duran                "icmp_code": 1,
1105*20012a3aSJose Luis Duran                "oip_ihl": 0xF,
1106*20012a3aSJose Luis Duran            },
1107*20012a3aSJose Luis Duran            {
1108*20012a3aSJose Luis Duran                "returncode": 2,
1109*20012a3aSJose Luis Duran                "stdout": """\
1110*20012a3aSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1111*20012a3aSJose Luis Duran
1112*20012a3aSJose Luis Duran--- 192.0.2.2 ping statistics ---
1113*20012a3aSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
1114*20012a3aSJose Luis Duran""",
1115*20012a3aSJose Luis Duran                "stderr": """\
1116*20012a3aSJose Luis Duranping: inner packet too short (84 bytes) from 192.0.2.2
1117*20012a3aSJose Luis Duran""",
1118*20012a3aSJose Luis Duran                "redacted": False,
1119*20012a3aSJose Luis Duran            },
1120*20012a3aSJose Luis Duran            id="_inner_packet_too_short",
1121*20012a3aSJose Luis Duran        ),
1122*20012a3aSJose Luis Duran        pytest.param(
1123*20012a3aSJose Luis Duran            {
1124*20012a3aSJose Luis Duran                "src": "192.0.2.1",
1125*20012a3aSJose Luis Duran                "dst": "192.0.2.2",
1126*20012a3aSJose Luis Duran                "icmp_type": 3,
1127*20012a3aSJose Luis Duran                "icmp_code": 1,
1128*20012a3aSJose Luis Duran                "oip_ihl": 0xF,
1129*20012a3aSJose Luis Duran                "special": "no-payload",
1130*20012a3aSJose Luis Duran            },
1131*20012a3aSJose Luis Duran            {
1132*20012a3aSJose Luis Duran                "returncode": 2,
1133*20012a3aSJose Luis Duran                "stdout": """\
1134*20012a3aSJose Luis DuranPATTERN: 0x01
1135*20012a3aSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1136*20012a3aSJose Luis Duran
1137*20012a3aSJose Luis Duran--- 192.0.2.2 ping statistics ---
1138*20012a3aSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
1139*20012a3aSJose Luis Duran""",
1140*20012a3aSJose Luis Duran                "stderr": "",
1141*20012a3aSJose Luis Duran                "redacted": False,
1142*20012a3aSJose Luis Duran            },
1143*20012a3aSJose Luis Duran            id="_max_inner_packet_ihl_without_payload",
1144*20012a3aSJose Luis Duran        ),
1145*20012a3aSJose Luis Duran        pytest.param(
1146*20012a3aSJose Luis Duran            {
1147*20012a3aSJose Luis Duran                "src": "192.0.2.1",
1148*20012a3aSJose Luis Duran                "dst": "192.0.2.2",
1149076b718dSJose Luis Duran                "icmp_type": 0,
1150076b718dSJose Luis Duran                "icmp_code": 0,
11515b8af90fSJose Luis Duran                "opts": "NOP-40",
11525b8af90fSJose Luis Duran            },
11535b8af90fSJose Luis Duran            {
11545b8af90fSJose Luis Duran                "returncode": 0,
11555b8af90fSJose Luis Duran                "stdout": """\
11565b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
11575b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
11585b8af90fSJose Luis Duranwrong total length 124 instead of 84
11595b8af90fSJose Luis DuranNOP
11605b8af90fSJose Luis DuranNOP
11615b8af90fSJose Luis DuranNOP
11625b8af90fSJose Luis DuranNOP
11635b8af90fSJose Luis DuranNOP
11645b8af90fSJose Luis DuranNOP
11655b8af90fSJose Luis DuranNOP
11665b8af90fSJose Luis DuranNOP
11675b8af90fSJose Luis DuranNOP
11685b8af90fSJose Luis DuranNOP
11695b8af90fSJose Luis DuranNOP
11705b8af90fSJose Luis DuranNOP
11715b8af90fSJose Luis DuranNOP
11725b8af90fSJose Luis DuranNOP
11735b8af90fSJose Luis DuranNOP
11745b8af90fSJose Luis DuranNOP
11755b8af90fSJose Luis DuranNOP
11765b8af90fSJose Luis DuranNOP
11775b8af90fSJose Luis DuranNOP
11785b8af90fSJose Luis DuranNOP
11795b8af90fSJose Luis DuranNOP
11805b8af90fSJose Luis DuranNOP
11815b8af90fSJose Luis DuranNOP
11825b8af90fSJose Luis DuranNOP
11835b8af90fSJose Luis DuranNOP
11845b8af90fSJose Luis DuranNOP
11855b8af90fSJose Luis DuranNOP
11865b8af90fSJose Luis DuranNOP
11875b8af90fSJose Luis DuranNOP
11885b8af90fSJose Luis DuranNOP
11895b8af90fSJose Luis DuranNOP
11905b8af90fSJose Luis DuranNOP
11915b8af90fSJose Luis DuranNOP
11925b8af90fSJose Luis DuranNOP
11935b8af90fSJose Luis DuranNOP
11945b8af90fSJose Luis DuranNOP
11955b8af90fSJose Luis DuranNOP
11965b8af90fSJose Luis DuranNOP
11975b8af90fSJose Luis DuranNOP
11985b8af90fSJose Luis DuranNOP
11995b8af90fSJose Luis Duran
12005b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
12015b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
12025b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
12035b8af90fSJose Luis Duran""",
12045b8af90fSJose Luis Duran                "stderr": "",
12055b8af90fSJose Luis Duran                "redacted": True,
12065b8af90fSJose Luis Duran            },
12075b8af90fSJose Luis Duran            id="_0_0_opts_NOP_40",
12085b8af90fSJose Luis Duran        ),
12095b8af90fSJose Luis Duran        pytest.param(
12105b8af90fSJose Luis Duran            {
12115b8af90fSJose Luis Duran                "src": "192.0.2.1",
12125b8af90fSJose Luis Duran                "dst": "192.0.2.2",
12135b8af90fSJose Luis Duran                "icmp_type": 0,
12145b8af90fSJose Luis Duran                "icmp_code": 0,
12155b8af90fSJose Luis Duran                "opts": "unk",
12165b8af90fSJose Luis Duran            },
12175b8af90fSJose Luis Duran            {
12185b8af90fSJose Luis Duran                "returncode": 0,
12195b8af90fSJose Luis Duran                "stdout": """\
12205b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
12215b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
12225b8af90fSJose Luis Duranwrong total length 88 instead of 84
12235b8af90fSJose Luis Duranunknown option 9f
12245b8af90fSJose Luis Duran
12255b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
12265b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
12275b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
12285b8af90fSJose Luis Duran""",
12295b8af90fSJose Luis Duran                "stderr": "",
12305b8af90fSJose Luis Duran                "redacted": True,
12315b8af90fSJose Luis Duran            },
12325b8af90fSJose Luis Duran            id="_0_0_opts_unk",
12335b8af90fSJose Luis Duran        ),
12345b8af90fSJose Luis Duran        pytest.param(
12355b8af90fSJose Luis Duran            {
12365b8af90fSJose Luis Duran                "src": "192.0.2.1",
12375b8af90fSJose Luis Duran                "dst": "192.0.2.2",
12385b8af90fSJose Luis Duran                "icmp_type": 3,
12395b8af90fSJose Luis Duran                "icmp_code": 1,
12405b8af90fSJose Luis Duran                "opts": "NOP-40",
12415b8af90fSJose Luis Duran            },
12425b8af90fSJose Luis Duran            {
12435b8af90fSJose Luis Duran                "returncode": 2,
12445b8af90fSJose Luis Duran                "stdout": """\
12455b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
12465b8af90fSJose Luis Duran132 bytes from 192.0.2.2: Destination Host Unreachable
12475b8af90fSJose Luis DuranVr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
12485b8af90fSJose Luis Duran 4  f  00 007c 0001   0 0000  40  01 d868 192.0.2.1  192.0.2.2 01010101010101010101010101010101010101010101010101010101010101010101010101010101
12495b8af90fSJose Luis Duran
12505b8af90fSJose Luis Duran
12515b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
12525b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
12535b8af90fSJose Luis Duran""",
12545b8af90fSJose Luis Duran                "stderr": "",
12555b8af90fSJose Luis Duran                "redacted": False,
12565b8af90fSJose Luis Duran            },
12575b8af90fSJose Luis Duran            id="_3_1_opts_NOP_40",
12585b8af90fSJose Luis Duran        ),
12595b8af90fSJose Luis Duran        pytest.param(
12605b8af90fSJose Luis Duran            {
12615b8af90fSJose Luis Duran                "src": "192.0.2.1",
12625b8af90fSJose Luis Duran                "dst": "192.0.2.2",
12635b8af90fSJose Luis Duran                "icmp_type": 3,
12645b8af90fSJose Luis Duran                "icmp_code": 1,
12655b8af90fSJose Luis Duran                "flags": "DF",
12665b8af90fSJose Luis Duran            },
12675b8af90fSJose Luis Duran            {
12685b8af90fSJose Luis Duran                "returncode": 2,
12695b8af90fSJose Luis Duran                "stdout": """\
12705b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
12715b8af90fSJose Luis Duran92 bytes from 192.0.2.2: Destination Host Unreachable
12725b8af90fSJose Luis DuranVr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
12735b8af90fSJose Luis Duran 4  5  00 0054 0001   2 0000  40  01 b6a4 192.0.2.1  192.0.2.2
12745b8af90fSJose Luis Duran
12755b8af90fSJose Luis Duran
12765b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
12775b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
12785b8af90fSJose Luis Duran""",
12795b8af90fSJose Luis Duran                "stderr": "",
12805b8af90fSJose Luis Duran                "redacted": False,
12815b8af90fSJose Luis Duran            },
12825b8af90fSJose Luis Duran            id="_3_1_flags_DF",
12835b8af90fSJose Luis Duran        ),
12841dc1f6bdSJose Luis Duran        pytest.param(
12851dc1f6bdSJose Luis Duran            {
12861dc1f6bdSJose Luis Duran                "src": "192.0.2.1",
12871dc1f6bdSJose Luis Duran                "dst": "192.0.2.2",
12881dc1f6bdSJose Luis Duran                "icmp_type": 3,
12891dc1f6bdSJose Luis Duran                "icmp_code": 1,
12901dc1f6bdSJose Luis Duran                "special": "tcp",
12911dc1f6bdSJose Luis Duran            },
12921dc1f6bdSJose Luis Duran            {
12931dc1f6bdSJose Luis Duran                "returncode": 2,
12941dc1f6bdSJose Luis Duran                "stdout": """\
12951dc1f6bdSJose Luis DuranPATTERN: 0x01
12961dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
12971dc1f6bdSJose Luis Duran
12981dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics ---
12991dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
13001dc1f6bdSJose Luis Duran""",
13011dc1f6bdSJose Luis Duran                "stderr": """\
13021dc1f6bdSJose Luis Duranping: quoted data too short (40 bytes) from 192.0.2.2
13031dc1f6bdSJose Luis Duran""",
13041dc1f6bdSJose Luis Duran                "redacted": False,
13051dc1f6bdSJose Luis Duran            },
13061dc1f6bdSJose Luis Duran            id="_3_1_special_tcp",
13071dc1f6bdSJose Luis Duran        ),
13081dc1f6bdSJose Luis Duran        pytest.param(
13091dc1f6bdSJose Luis Duran            {
13101dc1f6bdSJose Luis Duran                "src": "192.0.2.1",
13111dc1f6bdSJose Luis Duran                "dst": "192.0.2.2",
13121dc1f6bdSJose Luis Duran                "icmp_type": 3,
13131dc1f6bdSJose Luis Duran                "icmp_code": 1,
13141dc1f6bdSJose Luis Duran                "special": "udp",
13151dc1f6bdSJose Luis Duran            },
13161dc1f6bdSJose Luis Duran            {
13171dc1f6bdSJose Luis Duran                "returncode": 2,
13181dc1f6bdSJose Luis Duran                "stdout": """\
13191dc1f6bdSJose Luis DuranPATTERN: 0x01
13201dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
13211dc1f6bdSJose Luis Duran
13221dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics ---
13231dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
13241dc1f6bdSJose Luis Duran""",
13251dc1f6bdSJose Luis Duran                "stderr": """\
13261dc1f6bdSJose Luis Duranping: quoted data too short (28 bytes) from 192.0.2.2
13271dc1f6bdSJose Luis Duran""",
13281dc1f6bdSJose Luis Duran                "redacted": False,
13291dc1f6bdSJose Luis Duran            },
13301dc1f6bdSJose Luis Duran            id="_3_1_special_udp",
13311dc1f6bdSJose Luis Duran        ),
1332ea6d1692SJose Luis Duran        pytest.param(
1333ea6d1692SJose Luis Duran            {
1334ea6d1692SJose Luis Duran                "src": "192.0.2.1",
1335ea6d1692SJose Luis Duran                "dst": "192.0.2.2",
13369fc2d858SJose Luis Duran                "icmp_type": 3,
13379fc2d858SJose Luis Duran                "icmp_code": 1,
13389fc2d858SJose Luis Duran                "verbose": False,
13399fc2d858SJose Luis Duran            },
13409fc2d858SJose Luis Duran            {
13419fc2d858SJose Luis Duran                "returncode": 2,
13429fc2d858SJose Luis Duran                "stdout": """\
13439fc2d858SJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
13449fc2d858SJose Luis Duran92 bytes from 192.0.2.2: Destination Host Unreachable
13459fc2d858SJose Luis DuranVr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
13469fc2d858SJose Luis Duran 4  5  00 0054 0001   0 0000  40  01 f6a4 192.0.2.1  192.0.2.2
13479fc2d858SJose Luis Duran
13489fc2d858SJose Luis Duran
13499fc2d858SJose Luis Duran--- 192.0.2.2 ping statistics ---
13509fc2d858SJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
13519fc2d858SJose Luis Duran""",
13529fc2d858SJose Luis Duran                "stderr": "",
13539fc2d858SJose Luis Duran                "redacted": False,
13549fc2d858SJose Luis Duran            },
13559fc2d858SJose Luis Duran            id="_3_1_verbose_false",
13569fc2d858SJose Luis Duran        ),
13579fc2d858SJose Luis Duran        pytest.param(
13589fc2d858SJose Luis Duran            {
13599fc2d858SJose Luis Duran                "src": "192.0.2.1",
13609fc2d858SJose Luis Duran                "dst": "192.0.2.2",
13619fc2d858SJose Luis Duran                "icmp_type": 3,
13629fc2d858SJose Luis Duran                "icmp_code": 1,
13639fc2d858SJose Luis Duran                "special": "not-mine",
13649fc2d858SJose Luis Duran                "verbose": False,
13659fc2d858SJose Luis Duran            },
13669fc2d858SJose Luis Duran            {
13679fc2d858SJose Luis Duran                "returncode": 2,
13689fc2d858SJose Luis Duran                "stdout": """\
13699fc2d858SJose Luis DuranPATTERN: 0x01
13709fc2d858SJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
13719fc2d858SJose Luis Duran
13729fc2d858SJose Luis Duran--- 192.0.2.2 ping statistics ---
13739fc2d858SJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
13749fc2d858SJose Luis Duran""",
13759fc2d858SJose Luis Duran                "stderr": "",
13769fc2d858SJose Luis Duran                "redacted": False,
13779fc2d858SJose Luis Duran            },
13789fc2d858SJose Luis Duran            id="_3_1_special_not_mine_verbose_false",
13799fc2d858SJose Luis Duran        ),
13809fc2d858SJose Luis Duran        pytest.param(
13819fc2d858SJose Luis Duran            {
13829fc2d858SJose Luis Duran                "src": "192.0.2.1",
13839fc2d858SJose Luis Duran                "dst": "192.0.2.2",
1384ea6d1692SJose Luis Duran                "icmp_type": 0,
1385ea6d1692SJose Luis Duran                "icmp_code": 0,
1386ea6d1692SJose Luis Duran                "special": "warp",
1387ea6d1692SJose Luis Duran            },
1388ea6d1692SJose Luis Duran            {
1389ea6d1692SJose Luis Duran                "returncode": 0,
1390ea6d1692SJose Luis Duran                "stdout": """\
1391ea6d1692SJose Luis DuranPATTERN: 0x01
1392ea6d1692SJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1393ea6d1692SJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
1394ea6d1692SJose Luis Duran
1395ea6d1692SJose Luis Duran--- 192.0.2.2 ping statistics ---
1396ea6d1692SJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
1397ea6d1692SJose Luis Duranround-trip min/avg/max/stddev = /// ms
1398ea6d1692SJose Luis Duran""",
1399ea6d1692SJose Luis Duran                "stderr": """\
1400ea6d1692SJose Luis Duranping: time of day goes back (- ms), clamping time to 0
1401ea6d1692SJose Luis Duran""",
1402ea6d1692SJose Luis Duran                "redacted": True,
1403ea6d1692SJose Luis Duran            },
1404ea6d1692SJose Luis Duran            id="_0_0_special_warp",
1405ea6d1692SJose Luis Duran        ),
14065b8af90fSJose Luis Duran    ]
14075b8af90fSJose Luis Duran
14085b8af90fSJose Luis Duran    @pytest.mark.parametrize("pinger_kargs, expected", pinger_testdata)
14095b8af90fSJose Luis Duran    @pytest.mark.require_progs(["scapy"])
14105b8af90fSJose Luis Duran    @pytest.mark.require_user("root")
14115b8af90fSJose Luis Duran    def test_pinger(self, pinger_kargs, expected):
14125b8af90fSJose Luis Duran        """Test ping using pinger(), a reply faker"""
14135b8af90fSJose Luis Duran        iface = IfaceFactory().create_iface("", "tun")[0].name
14145b8af90fSJose Luis Duran        ping = pinger(iface, **pinger_kargs)
14155b8af90fSJose Luis Duran        assert ping.returncode == expected["returncode"]
14165b8af90fSJose Luis Duran        if expected["redacted"]:
14175b8af90fSJose Luis Duran            assert redact(ping.stdout) == expected["stdout"]
1418ea6d1692SJose Luis Duran            assert redact(ping.stderr) == expected["stderr"]
14195b8af90fSJose Luis Duran        else:
14205b8af90fSJose Luis Duran            assert ping.stdout == expected["stdout"]
14215b8af90fSJose Luis Duran            assert ping.stderr == expected["stderr"]
1422