xref: /freebsd/sbin/ping/tests/test_ping.py (revision ea6d16926666a717e2c0a898b954d1477ac34804)
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="),
271*ea6d1692SJose Luis Duran        ("\(-[0-9\.]+[0-9]+ ms\)", "(- ms)"),
2725b8af90fSJose Luis Duran        ("[0-9\.]+/[0-9.]+", "/"),
2735b8af90fSJose Luis Duran    ]
2745b8af90fSJose Luis Duran    for pattern, repl in pattern_replacements:
2755b8af90fSJose Luis Duran        output = re.sub(pattern, repl, output)
2765b8af90fSJose Luis Duran    return output
2775b8af90fSJose Luis Duran
2785b8af90fSJose Luis Duran
2795b8af90fSJose Luis Duranclass TestPing(SingleVnetTestTemplate):
2805b8af90fSJose Luis Duran    IPV6_PREFIXES: List[str] = ["2001:db8::1/64"]
2815b8af90fSJose Luis Duran    IPV4_PREFIXES: List[str] = ["192.0.2.1/24"]
2825b8af90fSJose Luis Duran
2835b8af90fSJose Luis Duran    # Each param in testdata contains a dictionary with the command,
2845b8af90fSJose Luis Duran    # and the expected outcome (returncode, redacted stdout, and stderr)
2855b8af90fSJose Luis Duran    testdata = [
2865b8af90fSJose Luis Duran        pytest.param(
2875b8af90fSJose Luis Duran            {
2885b8af90fSJose Luis Duran                "args": "ping -4 -c1 -s56 -t1 localhost",
2895b8af90fSJose Luis Duran                "returncode": 0,
2905b8af90fSJose Luis Duran                "stdout": """\
2915b8af90fSJose Luis DuranPING localhost: 56 data bytes
2925b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
2935b8af90fSJose Luis Duran
2945b8af90fSJose Luis Duran--- localhost ping statistics ---
2955b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
2965b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
2975b8af90fSJose Luis Duran""",
2985b8af90fSJose Luis Duran                "stderr": "",
2995b8af90fSJose Luis Duran            },
3005b8af90fSJose Luis Duran            id="_4_c1_s56_t1_localhost",
3015b8af90fSJose Luis Duran        ),
3025b8af90fSJose Luis Duran        pytest.param(
3035b8af90fSJose Luis Duran            {
3045b8af90fSJose Luis Duran                "args": "ping -6 -c1 -s8 -t1 localhost",
3055b8af90fSJose Luis Duran                "returncode": 0,
3065b8af90fSJose Luis Duran                "stdout": """\
3075b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1
3085b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms
3095b8af90fSJose Luis Duran
3105b8af90fSJose Luis Duran--- localhost ping6 statistics ---
3115b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3125b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
3135b8af90fSJose Luis Duran""",
3145b8af90fSJose Luis Duran                "stderr": "",
3155b8af90fSJose Luis Duran            },
3165b8af90fSJose Luis Duran            id="_6_c1_s8_t1_localhost",
3175b8af90fSJose Luis Duran        ),
3185b8af90fSJose Luis Duran        pytest.param(
3195b8af90fSJose Luis Duran            {
3205b8af90fSJose Luis Duran                "args": "ping -A -c1 192.0.2.1",
3215b8af90fSJose Luis Duran                "returncode": 0,
3225b8af90fSJose Luis Duran                "stdout": """\
3235b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
3245b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
3255b8af90fSJose Luis Duran
3265b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
3275b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3285b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
3295b8af90fSJose Luis Duran""",
3305b8af90fSJose Luis Duran                "stderr": "",
3315b8af90fSJose Luis Duran            },
3325b8af90fSJose Luis Duran            id="_A_c1_192_0_2_1",
3335b8af90fSJose Luis Duran        ),
3345b8af90fSJose Luis Duran        pytest.param(
3355b8af90fSJose Luis Duran            {
3365b8af90fSJose Luis Duran                "args": "ping -A -c1 192.0.2.2",
3375b8af90fSJose Luis Duran                "returncode": 2,
3385b8af90fSJose Luis Duran                "stdout": """\
3395b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
3405b8af90fSJose Luis Duran
3415b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
3425b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
3435b8af90fSJose Luis Duran""",
3445b8af90fSJose Luis Duran                "stderr": "",
3455b8af90fSJose Luis Duran            },
3465b8af90fSJose Luis Duran            id="_A_c1_192_0_2_2",
3475b8af90fSJose Luis Duran        ),
3485b8af90fSJose Luis Duran        pytest.param(
3495b8af90fSJose Luis Duran            {
3505b8af90fSJose Luis Duran                "args": "ping -A -c1 2001:db8::1",
3515b8af90fSJose Luis Duran                "returncode": 0,
3525b8af90fSJose Luis Duran                "stdout": """\
3535b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
3545b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
3555b8af90fSJose Luis Duran
3565b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
3575b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
3585b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
3595b8af90fSJose Luis Duran""",
3605b8af90fSJose Luis Duran                "stderr": "",
3615b8af90fSJose Luis Duran            },
3625b8af90fSJose Luis Duran            id="_A_c1_2001_db8__1",
3635b8af90fSJose Luis Duran        ),
3645b8af90fSJose Luis Duran        pytest.param(
3655b8af90fSJose Luis Duran            {
3665b8af90fSJose Luis Duran                "args": "ping -A -c1 2001:db8::2",
3675b8af90fSJose Luis Duran                "returncode": 2,
3685b8af90fSJose Luis Duran                "stdout": """\
3695b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
3705b8af90fSJose Luis Duran
3715b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
3725b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
3735b8af90fSJose Luis Duran""",
3745b8af90fSJose Luis Duran                "stderr": "",
3755b8af90fSJose Luis Duran            },
3765b8af90fSJose Luis Duran            id="_A_c1_2001_db8__2",
3775b8af90fSJose Luis Duran        ),
3785b8af90fSJose Luis Duran        pytest.param(
3795b8af90fSJose Luis Duran            {
3805b8af90fSJose Luis Duran                "args": "ping -A -c3 192.0.2.1",
3815b8af90fSJose Luis Duran                "returncode": 0,
3825b8af90fSJose Luis Duran                "stdout": """\
3835b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
3845b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
3855b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms
3865b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms
3875b8af90fSJose Luis Duran
3885b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
3895b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
3905b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
3915b8af90fSJose Luis Duran""",
3925b8af90fSJose Luis Duran                "stderr": "",
3935b8af90fSJose Luis Duran            },
3945b8af90fSJose Luis Duran            id="_A_3_192_0.2.1",
3955b8af90fSJose Luis Duran        ),
3965b8af90fSJose Luis Duran        pytest.param(
3975b8af90fSJose Luis Duran            {
3985b8af90fSJose Luis Duran                "args": "ping -A -c3 192.0.2.2",
3995b8af90fSJose Luis Duran                "returncode": 2,
4005b8af90fSJose Luis Duran                "stdout": """\
4015b8af90fSJose Luis Duran\x07\x07PING 192.0.2.2 (192.0.2.2): 56 data bytes
4025b8af90fSJose Luis Duran
4035b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
4045b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
4055b8af90fSJose Luis Duran""",
4065b8af90fSJose Luis Duran                "stderr": "",
4075b8af90fSJose Luis Duran            },
4085b8af90fSJose Luis Duran            id="_A_c3_192_0_2_2",
4095b8af90fSJose Luis Duran        ),
4105b8af90fSJose Luis Duran        pytest.param(
4115b8af90fSJose Luis Duran            {
4125b8af90fSJose Luis Duran                "args": "ping -A -c3 2001:db8::1",
4135b8af90fSJose Luis Duran                "returncode": 0,
4145b8af90fSJose Luis Duran                "stdout": """\
4155b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
4165b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
4175b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms
4185b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms
4195b8af90fSJose Luis Duran
4205b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
4215b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
4225b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
4235b8af90fSJose Luis Duran""",
4245b8af90fSJose Luis Duran                "stderr": "",
4255b8af90fSJose Luis Duran            },
4265b8af90fSJose Luis Duran            id="_A_c3_2001_db8__1",
4275b8af90fSJose Luis Duran        ),
4285b8af90fSJose Luis Duran        pytest.param(
4295b8af90fSJose Luis Duran            {
4305b8af90fSJose Luis Duran                "args": "ping -A -c3 2001:db8::2",
4315b8af90fSJose Luis Duran                "returncode": 2,
4325b8af90fSJose Luis Duran                "stdout": """\
4335b8af90fSJose Luis Duran\x07\x07PING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
4345b8af90fSJose Luis Duran
4355b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
4365b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
4375b8af90fSJose Luis Duran""",
4385b8af90fSJose Luis Duran                "stderr": "",
4395b8af90fSJose Luis Duran            },
4405b8af90fSJose Luis Duran            id="_A_c3_2001_db8__2",
4415b8af90fSJose Luis Duran        ),
4425b8af90fSJose Luis Duran        pytest.param(
4435b8af90fSJose Luis Duran            {
4445b8af90fSJose Luis Duran                "args": "ping -c1 192.0.2.1",
4455b8af90fSJose Luis Duran                "returncode": 0,
4465b8af90fSJose Luis Duran                "stdout": """\
4475b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
4485b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
4495b8af90fSJose Luis Duran
4505b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
4515b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
4525b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
4535b8af90fSJose Luis Duran""",
4545b8af90fSJose Luis Duran                "stderr": "",
4555b8af90fSJose Luis Duran            },
4565b8af90fSJose Luis Duran            id="_c1_192_0_2_1",
4575b8af90fSJose Luis Duran        ),
4585b8af90fSJose Luis Duran        pytest.param(
4595b8af90fSJose Luis Duran            {
4605b8af90fSJose Luis Duran                "args": "ping -c1 192.0.2.2",
4615b8af90fSJose Luis Duran                "returncode": 2,
4625b8af90fSJose Luis Duran                "stdout": """\
4635b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
4645b8af90fSJose Luis Duran
4655b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
4665b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
4675b8af90fSJose Luis Duran""",
4685b8af90fSJose Luis Duran                "stderr": "",
4695b8af90fSJose Luis Duran            },
4705b8af90fSJose Luis Duran            id="_c1_192_0_2_2",
4715b8af90fSJose Luis Duran        ),
4725b8af90fSJose Luis Duran        pytest.param(
4735b8af90fSJose Luis Duran            {
4745b8af90fSJose Luis Duran                "args": "ping -c1 2001:db8::1",
4755b8af90fSJose Luis Duran                "returncode": 0,
4765b8af90fSJose Luis Duran                "stdout": """\
4775b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
4785b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
4795b8af90fSJose Luis Duran
4805b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
4815b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
4825b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
4835b8af90fSJose Luis Duran""",
4845b8af90fSJose Luis Duran                "stderr": "",
4855b8af90fSJose Luis Duran            },
4865b8af90fSJose Luis Duran            id="_c1_2001_db8__1",
4875b8af90fSJose Luis Duran        ),
4885b8af90fSJose Luis Duran        pytest.param(
4895b8af90fSJose Luis Duran            {
4905b8af90fSJose Luis Duran                "args": "ping -c1 2001:db8::2",
4915b8af90fSJose Luis Duran                "returncode": 2,
4925b8af90fSJose Luis Duran                "stdout": """\
4935b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
4945b8af90fSJose Luis Duran
4955b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
4965b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
4975b8af90fSJose Luis Duran""",
4985b8af90fSJose Luis Duran                "stderr": "",
4995b8af90fSJose Luis Duran            },
5005b8af90fSJose Luis Duran            id="_c1_2001_db8__2",
5015b8af90fSJose Luis Duran        ),
5025b8af90fSJose Luis Duran        pytest.param(
5035b8af90fSJose Luis Duran            {
5045b8af90fSJose Luis Duran                "args": "ping -c1 -S127.0.0.1 -s56 -t1 localhost",
5055b8af90fSJose Luis Duran                "returncode": 0,
5065b8af90fSJose Luis Duran                "stdout": """\
5075b8af90fSJose Luis DuranPING localhost from: 56 data bytes
5085b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
5095b8af90fSJose Luis Duran
5105b8af90fSJose Luis Duran--- localhost ping statistics ---
5115b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
5125b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
5135b8af90fSJose Luis Duran""",
5145b8af90fSJose Luis Duran                "stderr": "",
5155b8af90fSJose Luis Duran            },
5165b8af90fSJose Luis Duran            id="_c1_S127_0_0_1_s56_t1_localhost",
5175b8af90fSJose Luis Duran        ),
5185b8af90fSJose Luis Duran        pytest.param(
5195b8af90fSJose Luis Duran            {
5205b8af90fSJose Luis Duran                "args": "ping -c1 -S::1 -s8 -t1 localhost",
5215b8af90fSJose Luis Duran                "returncode": 0,
5225b8af90fSJose Luis Duran                "stdout": """\
5235b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) ::1 --> ::1
5245b8af90fSJose Luis Duran16 bytes from ::1, icmp_seq=0 hlim= time= ms
5255b8af90fSJose Luis Duran
5265b8af90fSJose Luis Duran--- localhost ping6 statistics ---
5275b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
5285b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
5295b8af90fSJose Luis Duran""",
5305b8af90fSJose Luis Duran                "stderr": "",
5315b8af90fSJose Luis Duran            },
5325b8af90fSJose Luis Duran            id="_c1_S__1_s8_t1_localhost",
5335b8af90fSJose Luis Duran        ),
5345b8af90fSJose Luis Duran        pytest.param(
5355b8af90fSJose Luis Duran            {
5365b8af90fSJose Luis Duran                "args": "ping -c3 192.0.2.1",
5375b8af90fSJose Luis Duran                "returncode": 0,
5385b8af90fSJose Luis Duran                "stdout": """\
5395b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
5405b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
5415b8af90fSJose Luis Duran64 bytes from: icmp_seq=1 ttl= time= ms
5425b8af90fSJose Luis Duran64 bytes from: icmp_seq=2 ttl= time= ms
5435b8af90fSJose Luis Duran
5445b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
5455b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
5465b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
5475b8af90fSJose Luis Duran""",
5485b8af90fSJose Luis Duran                "stderr": "",
5495b8af90fSJose Luis Duran            },
5505b8af90fSJose Luis Duran            id="_c3_192_0_2_1",
5515b8af90fSJose Luis Duran        ),
5525b8af90fSJose Luis Duran        pytest.param(
5535b8af90fSJose Luis Duran            {
5545b8af90fSJose Luis Duran                "args": "ping -c3 192.0.2.2",
5555b8af90fSJose Luis Duran                "returncode": 2,
5565b8af90fSJose Luis Duran                "stdout": """\
5575b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
5585b8af90fSJose Luis Duran
5595b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
5605b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
5615b8af90fSJose Luis Duran""",
5625b8af90fSJose Luis Duran                "stderr": "",
5635b8af90fSJose Luis Duran            },
5645b8af90fSJose Luis Duran            id="_c3_192_0_2_2",
5655b8af90fSJose Luis Duran        ),
5665b8af90fSJose Luis Duran        pytest.param(
5675b8af90fSJose Luis Duran            {
5685b8af90fSJose Luis Duran                "args": "ping -c3 2001:db8::1",
5695b8af90fSJose Luis Duran                "returncode": 0,
5705b8af90fSJose Luis Duran                "stdout": """\
5715b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
5725b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=0 hlim= time= ms
5735b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=1 hlim= time= ms
5745b8af90fSJose Luis Duran16 bytes from 2001:db8::1, icmp_seq=2 hlim= time= ms
5755b8af90fSJose Luis Duran
5765b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
5775b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
5785b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
5795b8af90fSJose Luis Duran""",
5805b8af90fSJose Luis Duran                "stderr": "",
5815b8af90fSJose Luis Duran            },
5825b8af90fSJose Luis Duran            id="_c3_2001_db8__1",
5835b8af90fSJose Luis Duran        ),
5845b8af90fSJose Luis Duran        pytest.param(
5855b8af90fSJose Luis Duran            {
5865b8af90fSJose Luis Duran                "args": "ping -c3 2001:db8::2",
5875b8af90fSJose Luis Duran                "returncode": 2,
5885b8af90fSJose Luis Duran                "stdout": """\
5895b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
5905b8af90fSJose Luis Duran
5915b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
5925b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
5935b8af90fSJose Luis Duran""",
5945b8af90fSJose Luis Duran                "stderr": "",
5955b8af90fSJose Luis Duran            },
5965b8af90fSJose Luis Duran            id="_c3_2001_db8__2",
5975b8af90fSJose Luis Duran        ),
5985b8af90fSJose Luis Duran        pytest.param(
5995b8af90fSJose Luis Duran            {
6005b8af90fSJose Luis Duran                "args": "ping -q -c1 192.0.2.1",
6015b8af90fSJose Luis Duran                "returncode": 0,
6025b8af90fSJose Luis Duran                "stdout": """\
6035b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
6045b8af90fSJose Luis Duran
6055b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
6065b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
6075b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
6085b8af90fSJose Luis Duran""",
6095b8af90fSJose Luis Duran                "stderr": "",
6105b8af90fSJose Luis Duran            },
6115b8af90fSJose Luis Duran            id="_q_c1_192_0_2_1",
6125b8af90fSJose Luis Duran        ),
6135b8af90fSJose Luis Duran        pytest.param(
6145b8af90fSJose Luis Duran            {
6155b8af90fSJose Luis Duran                "args": "ping -q -c1 192.0.2.2",
6165b8af90fSJose Luis Duran                "returncode": 2,
6175b8af90fSJose Luis Duran                "stdout": """\
6185b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
6195b8af90fSJose Luis Duran
6205b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
6215b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
6225b8af90fSJose Luis Duran""",
6235b8af90fSJose Luis Duran                "stderr": "",
6245b8af90fSJose Luis Duran            },
6255b8af90fSJose Luis Duran            id="_q_c1_192_0_2_2",
6265b8af90fSJose Luis Duran        ),
6275b8af90fSJose Luis Duran        pytest.param(
6285b8af90fSJose Luis Duran            {
6295b8af90fSJose Luis Duran                "args": "ping -q -c1 2001:db8::1",
6305b8af90fSJose Luis Duran                "returncode": 0,
6315b8af90fSJose Luis Duran                "stdout": """\
6325b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
6335b8af90fSJose Luis Duran
6345b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
6355b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
6365b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
6375b8af90fSJose Luis Duran""",
6385b8af90fSJose Luis Duran                "stderr": "",
6395b8af90fSJose Luis Duran            },
6405b8af90fSJose Luis Duran            id="_q_c1_2001_db8__1",
6415b8af90fSJose Luis Duran        ),
6425b8af90fSJose Luis Duran        pytest.param(
6435b8af90fSJose Luis Duran            {
6445b8af90fSJose Luis Duran                "args": "ping -q -c1 2001:db8::2",
6455b8af90fSJose Luis Duran                "returncode": 2,
6465b8af90fSJose Luis Duran                "stdout": """\
6475b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
6485b8af90fSJose Luis Duran
6495b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
6505b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
6515b8af90fSJose Luis Duran""",
6525b8af90fSJose Luis Duran                "stderr": "",
6535b8af90fSJose Luis Duran            },
6545b8af90fSJose Luis Duran            id="_q_c1_2001_db8__2",
6555b8af90fSJose Luis Duran        ),
6565b8af90fSJose Luis Duran        pytest.param(
6575b8af90fSJose Luis Duran            {
6585b8af90fSJose Luis Duran                "args": "ping -q -c3 192.0.2.1",
6595b8af90fSJose Luis Duran                "returncode": 0,
6605b8af90fSJose Luis Duran                "stdout": """\
6615b8af90fSJose Luis DuranPING 192.0.2.1 (192.0.2.1): 56 data bytes
6625b8af90fSJose Luis Duran
6635b8af90fSJose Luis Duran--- 192.0.2.1 ping statistics ---
6645b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
6655b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
6665b8af90fSJose Luis Duran""",
6675b8af90fSJose Luis Duran                "stderr": "",
6685b8af90fSJose Luis Duran            },
6695b8af90fSJose Luis Duran            id="_q_c3_192_0_2_1",
6705b8af90fSJose Luis Duran        ),
6715b8af90fSJose Luis Duran        pytest.param(
6725b8af90fSJose Luis Duran            {
6735b8af90fSJose Luis Duran                "args": "ping -q -c3 192.0.2.2",
6745b8af90fSJose Luis Duran                "returncode": 2,
6755b8af90fSJose Luis Duran                "stdout": """\
6765b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
6775b8af90fSJose Luis Duran
6785b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
6795b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
6805b8af90fSJose Luis Duran""",
6815b8af90fSJose Luis Duran                "stderr": "",
6825b8af90fSJose Luis Duran            },
6835b8af90fSJose Luis Duran            id="_q_c3_192_0_2_2",
6845b8af90fSJose Luis Duran        ),
6855b8af90fSJose Luis Duran        pytest.param(
6865b8af90fSJose Luis Duran            {
6875b8af90fSJose Luis Duran                "args": "ping -q -c3 2001:db8::1",
6885b8af90fSJose Luis Duran                "returncode": 0,
6895b8af90fSJose Luis Duran                "stdout": """\
6905b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::1
6915b8af90fSJose Luis Duran
6925b8af90fSJose Luis Duran--- 2001:db8::1 ping6 statistics ---
6935b8af90fSJose Luis Duran3 packets transmitted, 3 packets received, 0.0% packet loss
6945b8af90fSJose Luis Duranround-trip min/avg/max/std-dev = /// ms
6955b8af90fSJose Luis Duran""",
6965b8af90fSJose Luis Duran                "stderr": "",
6975b8af90fSJose Luis Duran            },
6985b8af90fSJose Luis Duran            id="_q_c3_2001_db8__1",
6995b8af90fSJose Luis Duran        ),
7005b8af90fSJose Luis Duran        pytest.param(
7015b8af90fSJose Luis Duran            {
7025b8af90fSJose Luis Duran                "args": "ping -q -c3 2001:db8::2",
7035b8af90fSJose Luis Duran                "returncode": 2,
7045b8af90fSJose Luis Duran                "stdout": """\
7055b8af90fSJose Luis DuranPING6(56=40+8+8 bytes) 2001:db8::1 --> 2001:db8::2
7065b8af90fSJose Luis Duran
7075b8af90fSJose Luis Duran--- 2001:db8::2 ping6 statistics ---
7085b8af90fSJose Luis Duran3 packets transmitted, 0 packets received, 100.0% packet loss
7095b8af90fSJose Luis Duran""",
7105b8af90fSJose Luis Duran                "stderr": "",
7115b8af90fSJose Luis Duran            },
7125b8af90fSJose Luis Duran            id="_q_c3_2001_db8__2",
7135b8af90fSJose Luis Duran        ),
7145b8af90fSJose Luis Duran    ]
7155b8af90fSJose Luis Duran
7165b8af90fSJose Luis Duran    @pytest.mark.parametrize("expected", testdata)
7175b8af90fSJose Luis Duran    def test_ping(self, expected):
7185b8af90fSJose Luis Duran        """Test ping"""
7195b8af90fSJose Luis Duran        ping = subprocess.run(
7205b8af90fSJose Luis Duran            expected["args"].split(),
7215b8af90fSJose Luis Duran            capture_output=True,
7225b8af90fSJose Luis Duran            timeout=15,
7235b8af90fSJose Luis Duran            text=True,
7245b8af90fSJose Luis Duran        )
7255b8af90fSJose Luis Duran        assert ping.returncode == expected["returncode"]
7265b8af90fSJose Luis Duran        assert redact(ping.stdout) == expected["stdout"]
7275b8af90fSJose Luis Duran        assert ping.stderr == expected["stderr"]
7285b8af90fSJose Luis Duran
7295b8af90fSJose Luis Duran    # Each param in ping46_testdata contains a dictionary with the arguments
7305b8af90fSJose Luis Duran    # and the expected outcome (returncode, redacted stdout, and stderr)
7315b8af90fSJose Luis Duran    # common to `ping -4` and `ping -6`
7325b8af90fSJose Luis Duran    ping46_testdata = [
7335b8af90fSJose Luis Duran        pytest.param(
7345b8af90fSJose Luis Duran            {
7355b8af90fSJose Luis Duran                "args": "-Wx localhost",
7365b8af90fSJose Luis Duran                "returncode": os.EX_USAGE,
7375b8af90fSJose Luis Duran                "stdout": "",
7385b8af90fSJose Luis Duran                "stderr": "ping: invalid timing interval: `x'\n",
7395b8af90fSJose Luis Duran            },
7405b8af90fSJose Luis Duran            id="_Wx_localhost",
7415b8af90fSJose Luis Duran        ),
7425b8af90fSJose Luis Duran    ]
7435b8af90fSJose Luis Duran
7445b8af90fSJose Luis Duran    @pytest.mark.parametrize("expected", ping46_testdata)
7455b8af90fSJose Luis Duran    def test_ping_46(self, expected):
7465b8af90fSJose Luis Duran        """Test ping -4/ping -6"""
7475b8af90fSJose Luis Duran        for version in [4, 6]:
7485b8af90fSJose Luis Duran            ping = subprocess.run(
7495b8af90fSJose Luis Duran                ["ping", f"-{version}"] + expected["args"].split(),
7505b8af90fSJose Luis Duran                capture_output=True,
7515b8af90fSJose Luis Duran                timeout=15,
7525b8af90fSJose Luis Duran                text=True,
7535b8af90fSJose Luis Duran            )
7545b8af90fSJose Luis Duran            assert ping.returncode == expected["returncode"]
7555b8af90fSJose Luis Duran            assert redact(ping.stdout) == expected["stdout"]
7565b8af90fSJose Luis Duran            assert ping.stderr == expected["stderr"]
7575b8af90fSJose Luis Duran
7585b8af90fSJose Luis Duran    # Each param in pinger_testdata contains a dictionary with the keywords to
7595b8af90fSJose Luis Duran    # `pinger()` and a dictionary with the expected outcome (returncode,
7605b8af90fSJose Luis Duran    # stdout, stderr, and if ping's output is redacted)
7615b8af90fSJose Luis Duran    pinger_testdata = [
7625b8af90fSJose Luis Duran        pytest.param(
7635b8af90fSJose Luis Duran            {
7645b8af90fSJose Luis Duran                "src": "192.0.2.1",
7655b8af90fSJose Luis Duran                "dst": "192.0.2.2",
7665b8af90fSJose Luis Duran                "icmp_type": 0,
7675b8af90fSJose Luis Duran                "icmp_code": 0,
7685b8af90fSJose Luis Duran            },
7695b8af90fSJose Luis Duran            {
7705b8af90fSJose Luis Duran                "returncode": 0,
7715b8af90fSJose Luis Duran                "stdout": """\
7725b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
7735b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
7745b8af90fSJose Luis Duran
7755b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
7765b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
7775b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
7785b8af90fSJose Luis Duran""",
7795b8af90fSJose Luis Duran                "stderr": "",
7805b8af90fSJose Luis Duran                "redacted": True,
7815b8af90fSJose Luis Duran            },
7825b8af90fSJose Luis Duran            id="_0_0",
7835b8af90fSJose Luis Duran        ),
7845b8af90fSJose Luis Duran        pytest.param(
7855b8af90fSJose Luis Duran            {
7865b8af90fSJose Luis Duran                "src": "192.0.2.1",
7875b8af90fSJose Luis Duran                "dst": "192.0.2.2",
7885b8af90fSJose Luis Duran                "icmp_type": 0,
7895b8af90fSJose Luis Duran                "icmp_code": 0,
790076b718dSJose Luis Duran                "opts": "EOL",
791076b718dSJose Luis Duran            },
792076b718dSJose Luis Duran            {
793076b718dSJose Luis Duran                "returncode": 0,
794076b718dSJose Luis Duran                "stdout": """\
795076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
796076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
797076b718dSJose Luis Duranwrong total length 88 instead of 84
798076b718dSJose Luis Duran
799076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
800076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
801076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
802076b718dSJose Luis Duran""",
803076b718dSJose Luis Duran                "stderr": "",
804076b718dSJose Luis Duran                "redacted": True,
805076b718dSJose Luis Duran            },
806076b718dSJose Luis Duran            id="_0_0_opts_EOL",
807076b718dSJose Luis Duran        ),
808076b718dSJose Luis Duran        pytest.param(
809076b718dSJose Luis Duran            {
810076b718dSJose Luis Duran                "src": "192.0.2.1",
811076b718dSJose Luis Duran                "dst": "192.0.2.2",
812076b718dSJose Luis Duran                "icmp_type": 0,
813076b718dSJose Luis Duran                "icmp_code": 0,
814076b718dSJose Luis Duran                "opts": "LSRR",
815076b718dSJose Luis Duran            },
816076b718dSJose Luis Duran            {
817076b718dSJose Luis Duran                "returncode": 0,
818076b718dSJose Luis Duran                "stdout": """\
819076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
820076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
821076b718dSJose Luis DuranLSRR: 	192.0.2.10
822076b718dSJose Luis Duran	192.0.2.20
823076b718dSJose Luis Duran	192.0.2.30
824076b718dSJose Luis Duran	192.0.2.40
825076b718dSJose Luis Duran	192.0.2.50
826076b718dSJose Luis Duran	192.0.2.60
827076b718dSJose Luis Duran	192.0.2.70
828076b718dSJose Luis Duran	192.0.2.80
829076b718dSJose Luis Duran	192.0.2.90
830076b718dSJose Luis Duran
831076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
832076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
833076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
834076b718dSJose Luis Duran""",
835076b718dSJose Luis Duran                "stderr": "",
836076b718dSJose Luis Duran                "redacted": True,
837076b718dSJose Luis Duran            },
838076b718dSJose Luis Duran            id="_0_0_opts_LSRR",
839076b718dSJose Luis Duran        ),
840076b718dSJose Luis Duran        pytest.param(
841076b718dSJose Luis Duran            {
842076b718dSJose Luis Duran                "src": "192.0.2.1",
843076b718dSJose Luis Duran                "dst": "192.0.2.2",
844076b718dSJose Luis Duran                "icmp_type": 0,
845076b718dSJose Luis Duran                "icmp_code": 0,
846076b718dSJose Luis Duran                "opts": "LSRR-trunc",
847076b718dSJose Luis Duran            },
848076b718dSJose Luis Duran            {
849076b718dSJose Luis Duran                "returncode": 0,
850076b718dSJose Luis Duran                "stdout": """\
851076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
852076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
853076b718dSJose Luis DuranLSRR: 	(truncated route)
854076b718dSJose Luis Duran
855076b718dSJose Luis Duran
856076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
857076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
858076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
859076b718dSJose Luis Duran""",
860076b718dSJose Luis Duran                "stderr": "",
861076b718dSJose Luis Duran                "redacted": True,
862076b718dSJose Luis Duran            },
863076b718dSJose Luis Duran            id="_0_0_opts_LSRR_trunc",
864076b718dSJose Luis Duran        ),
865076b718dSJose Luis Duran        pytest.param(
866076b718dSJose Luis Duran            {
867076b718dSJose Luis Duran                "src": "192.0.2.1",
868076b718dSJose Luis Duran                "dst": "192.0.2.2",
869076b718dSJose Luis Duran                "icmp_type": 0,
870076b718dSJose Luis Duran                "icmp_code": 0,
871076b718dSJose Luis Duran                "opts": "SSRR",
872076b718dSJose Luis Duran            },
873076b718dSJose Luis Duran            {
874076b718dSJose Luis Duran                "returncode": 0,
875076b718dSJose Luis Duran                "stdout": """\
876076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
877076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
878076b718dSJose Luis DuranSSRR: 	192.0.2.10
879076b718dSJose Luis Duran	192.0.2.20
880076b718dSJose Luis Duran	192.0.2.30
881076b718dSJose Luis Duran	192.0.2.40
882076b718dSJose Luis Duran	192.0.2.50
883076b718dSJose Luis Duran	192.0.2.60
884076b718dSJose Luis Duran	192.0.2.70
885076b718dSJose Luis Duran	192.0.2.80
886076b718dSJose Luis Duran	192.0.2.90
887076b718dSJose Luis Duran
888076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
889076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
890076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
891076b718dSJose Luis Duran""",
892076b718dSJose Luis Duran                "stderr": "",
893076b718dSJose Luis Duran                "redacted": True,
894076b718dSJose Luis Duran            },
895076b718dSJose Luis Duran            id="_0_0_opts_SSRR",
896076b718dSJose Luis Duran        ),
897076b718dSJose Luis Duran        pytest.param(
898076b718dSJose Luis Duran            {
899076b718dSJose Luis Duran                "src": "192.0.2.1",
900076b718dSJose Luis Duran                "dst": "192.0.2.2",
901076b718dSJose Luis Duran                "icmp_type": 0,
902076b718dSJose Luis Duran                "icmp_code": 0,
903076b718dSJose Luis Duran                "opts": "SSRR-trunc",
904076b718dSJose Luis Duran            },
905076b718dSJose Luis Duran            {
906076b718dSJose Luis Duran                "returncode": 0,
907076b718dSJose Luis Duran                "stdout": """\
908076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
909076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
910076b718dSJose Luis DuranSSRR: 	(truncated route)
911076b718dSJose Luis Duran
912076b718dSJose Luis Duran
913076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
914076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
915076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
916076b718dSJose Luis Duran""",
917076b718dSJose Luis Duran                "stderr": "",
918076b718dSJose Luis Duran                "redacted": True,
919076b718dSJose Luis Duran            },
920076b718dSJose Luis Duran            id="_0_0_opts_SSRR_trunc",
921076b718dSJose Luis Duran        ),
922076b718dSJose Luis Duran        pytest.param(
923076b718dSJose Luis Duran            {
924076b718dSJose Luis Duran                "src": "192.0.2.1",
925076b718dSJose Luis Duran                "dst": "192.0.2.2",
926076b718dSJose Luis Duran                "icmp_type": 0,
927076b718dSJose Luis Duran                "icmp_code": 0,
928076b718dSJose Luis Duran                "opts": "RR",
929076b718dSJose Luis Duran            },
930076b718dSJose Luis Duran            {
931076b718dSJose Luis Duran                "returncode": 0,
932076b718dSJose Luis Duran                "stdout": """\
933076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
934076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
935076b718dSJose Luis DuranRR: 	192.0.2.10
936076b718dSJose Luis Duran	192.0.2.20
937076b718dSJose Luis Duran	192.0.2.30
938076b718dSJose Luis Duran	192.0.2.40
939076b718dSJose Luis Duran	192.0.2.50
940076b718dSJose Luis Duran	192.0.2.60
941076b718dSJose Luis Duran	192.0.2.70
942076b718dSJose Luis Duran	192.0.2.80
943076b718dSJose Luis Duran	192.0.2.90
944076b718dSJose Luis Duran
945076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
946076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
947076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
948076b718dSJose Luis Duran""",
949076b718dSJose Luis Duran                "stderr": "",
950076b718dSJose Luis Duran                "redacted": True,
951076b718dSJose Luis Duran            },
952076b718dSJose Luis Duran            id="_0_0_opts_RR",
953076b718dSJose Luis Duran        ),
954076b718dSJose Luis Duran        pytest.param(
955076b718dSJose Luis Duran            {
956076b718dSJose Luis Duran                "src": "192.0.2.1",
957076b718dSJose Luis Duran                "dst": "192.0.2.2",
958076b718dSJose Luis Duran                "icmp_type": 0,
959076b718dSJose Luis Duran                "icmp_code": 0,
960076b718dSJose Luis Duran                "opts": "RR-same",
961076b718dSJose Luis Duran            },
962076b718dSJose Luis Duran            {
963076b718dSJose Luis Duran                "returncode": 0,
964076b718dSJose Luis Duran                "stdout": """\
965076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
966076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms	(same route)
967076b718dSJose Luis Duran
968076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
969076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
970076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
971076b718dSJose Luis Duran""",
972076b718dSJose Luis Duran                "stderr": "",
973076b718dSJose Luis Duran                "redacted": True,
974076b718dSJose Luis Duran            },
975076b718dSJose Luis Duran            id="_0_0_opts_RR_same",
976076b718dSJose Luis Duran        ),
977076b718dSJose Luis Duran        pytest.param(
978076b718dSJose Luis Duran            {
979076b718dSJose Luis Duran                "src": "192.0.2.1",
980076b718dSJose Luis Duran                "dst": "192.0.2.2",
981076b718dSJose Luis Duran                "icmp_type": 0,
982076b718dSJose Luis Duran                "icmp_code": 0,
983076b718dSJose Luis Duran                "opts": "RR-trunc",
984076b718dSJose Luis Duran            },
985076b718dSJose Luis Duran            {
986076b718dSJose Luis Duran                "returncode": 0,
987076b718dSJose Luis Duran                "stdout": """\
988076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
989076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
990076b718dSJose Luis DuranRR: 	(truncated route)
991076b718dSJose Luis Duran
992076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
993076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
994076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
995076b718dSJose Luis Duran""",
996076b718dSJose Luis Duran                "stderr": "",
997076b718dSJose Luis Duran                "redacted": True,
998076b718dSJose Luis Duran            },
999076b718dSJose Luis Duran            id="_0_0_opts_RR_trunc",
1000076b718dSJose Luis Duran        ),
1001076b718dSJose Luis Duran        pytest.param(
1002076b718dSJose Luis Duran            {
1003076b718dSJose Luis Duran                "src": "192.0.2.1",
1004076b718dSJose Luis Duran                "dst": "192.0.2.2",
1005076b718dSJose Luis Duran                "icmp_type": 0,
1006076b718dSJose Luis Duran                "icmp_code": 0,
1007076b718dSJose Luis Duran                "opts": "NOP",
1008076b718dSJose Luis Duran            },
1009076b718dSJose Luis Duran            {
1010076b718dSJose Luis Duran                "returncode": 0,
1011076b718dSJose Luis Duran                "stdout": """\
1012076b718dSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1013076b718dSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
1014076b718dSJose Luis Duranwrong total length 88 instead of 84
1015076b718dSJose Luis DuranNOP
1016076b718dSJose Luis Duran
1017076b718dSJose Luis Duran--- 192.0.2.2 ping statistics ---
1018076b718dSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
1019076b718dSJose Luis Duranround-trip min/avg/max/stddev = /// ms
1020076b718dSJose Luis Duran""",
1021076b718dSJose Luis Duran                "stderr": "",
1022076b718dSJose Luis Duran                "redacted": True,
1023076b718dSJose Luis Duran            },
1024076b718dSJose Luis Duran            id="_0_0_opts_NOP",
1025076b718dSJose Luis Duran        ),
1026076b718dSJose Luis Duran        pytest.param(
1027076b718dSJose Luis Duran            {
1028076b718dSJose Luis Duran                "src": "192.0.2.1",
1029076b718dSJose Luis Duran                "dst": "192.0.2.2",
1030076b718dSJose Luis Duran                "icmp_type": 0,
1031076b718dSJose Luis Duran                "icmp_code": 0,
10325b8af90fSJose Luis Duran                "opts": "NOP-40",
10335b8af90fSJose Luis Duran            },
10345b8af90fSJose Luis Duran            {
10355b8af90fSJose Luis Duran                "returncode": 0,
10365b8af90fSJose Luis Duran                "stdout": """\
10375b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
10385b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
10395b8af90fSJose Luis Duranwrong total length 124 instead of 84
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 DuranNOP
10805b8af90fSJose Luis Duran
10815b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
10825b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
10835b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
10845b8af90fSJose Luis Duran""",
10855b8af90fSJose Luis Duran                "stderr": "",
10865b8af90fSJose Luis Duran                "redacted": True,
10875b8af90fSJose Luis Duran            },
10885b8af90fSJose Luis Duran            id="_0_0_opts_NOP_40",
10895b8af90fSJose Luis Duran        ),
10905b8af90fSJose Luis Duran        pytest.param(
10915b8af90fSJose Luis Duran            {
10925b8af90fSJose Luis Duran                "src": "192.0.2.1",
10935b8af90fSJose Luis Duran                "dst": "192.0.2.2",
10945b8af90fSJose Luis Duran                "icmp_type": 0,
10955b8af90fSJose Luis Duran                "icmp_code": 0,
10965b8af90fSJose Luis Duran                "opts": "unk",
10975b8af90fSJose Luis Duran            },
10985b8af90fSJose Luis Duran            {
10995b8af90fSJose Luis Duran                "returncode": 0,
11005b8af90fSJose Luis Duran                "stdout": """\
11015b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
11025b8af90fSJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
11035b8af90fSJose Luis Duranwrong total length 88 instead of 84
11045b8af90fSJose Luis Duranunknown option 9f
11055b8af90fSJose Luis Duran
11065b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
11075b8af90fSJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
11085b8af90fSJose Luis Duranround-trip min/avg/max/stddev = /// ms
11095b8af90fSJose Luis Duran""",
11105b8af90fSJose Luis Duran                "stderr": "",
11115b8af90fSJose Luis Duran                "redacted": True,
11125b8af90fSJose Luis Duran            },
11135b8af90fSJose Luis Duran            id="_0_0_opts_unk",
11145b8af90fSJose Luis Duran        ),
11155b8af90fSJose Luis Duran        pytest.param(
11165b8af90fSJose Luis Duran            {
11175b8af90fSJose Luis Duran                "src": "192.0.2.1",
11185b8af90fSJose Luis Duran                "dst": "192.0.2.2",
11195b8af90fSJose Luis Duran                "icmp_type": 3,
11205b8af90fSJose Luis Duran                "icmp_code": 1,
11215b8af90fSJose Luis Duran                "opts": "NOP-40",
11225b8af90fSJose Luis Duran            },
11235b8af90fSJose Luis Duran            {
11245b8af90fSJose Luis Duran                "returncode": 2,
11255b8af90fSJose Luis Duran                "stdout": """\
11265b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
11275b8af90fSJose Luis Duran132 bytes from 192.0.2.2: Destination Host Unreachable
11285b8af90fSJose Luis DuranVr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
11295b8af90fSJose Luis Duran 4  f  00 007c 0001   0 0000  40  01 d868 192.0.2.1  192.0.2.2 01010101010101010101010101010101010101010101010101010101010101010101010101010101
11305b8af90fSJose Luis Duran
11315b8af90fSJose Luis Duran
11325b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
11335b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
11345b8af90fSJose Luis Duran""",
11355b8af90fSJose Luis Duran                "stderr": "",
11365b8af90fSJose Luis Duran                "redacted": False,
11375b8af90fSJose Luis Duran            },
11385b8af90fSJose Luis Duran            id="_3_1_opts_NOP_40",
11395b8af90fSJose Luis Duran        ),
11405b8af90fSJose Luis Duran        pytest.param(
11415b8af90fSJose Luis Duran            {
11425b8af90fSJose Luis Duran                "src": "192.0.2.1",
11435b8af90fSJose Luis Duran                "dst": "192.0.2.2",
11445b8af90fSJose Luis Duran                "icmp_type": 3,
11455b8af90fSJose Luis Duran                "icmp_code": 1,
11465b8af90fSJose Luis Duran                "flags": "DF",
11475b8af90fSJose Luis Duran            },
11485b8af90fSJose Luis Duran            {
11495b8af90fSJose Luis Duran                "returncode": 2,
11505b8af90fSJose Luis Duran                "stdout": """\
11515b8af90fSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
11525b8af90fSJose Luis Duran92 bytes from 192.0.2.2: Destination Host Unreachable
11535b8af90fSJose Luis DuranVr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
11545b8af90fSJose Luis Duran 4  5  00 0054 0001   2 0000  40  01 b6a4 192.0.2.1  192.0.2.2
11555b8af90fSJose Luis Duran
11565b8af90fSJose Luis Duran
11575b8af90fSJose Luis Duran--- 192.0.2.2 ping statistics ---
11585b8af90fSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
11595b8af90fSJose Luis Duran""",
11605b8af90fSJose Luis Duran                "stderr": "",
11615b8af90fSJose Luis Duran                "redacted": False,
11625b8af90fSJose Luis Duran            },
11635b8af90fSJose Luis Duran            id="_3_1_flags_DF",
11645b8af90fSJose Luis Duran        ),
11651dc1f6bdSJose Luis Duran        pytest.param(
11661dc1f6bdSJose Luis Duran            {
11671dc1f6bdSJose Luis Duran                "src": "192.0.2.1",
11681dc1f6bdSJose Luis Duran                "dst": "192.0.2.2",
11691dc1f6bdSJose Luis Duran                "icmp_type": 3,
11701dc1f6bdSJose Luis Duran                "icmp_code": 1,
11711dc1f6bdSJose Luis Duran                "special": "tcp",
11721dc1f6bdSJose Luis Duran            },
11731dc1f6bdSJose Luis Duran            {
11741dc1f6bdSJose Luis Duran                "returncode": 2,
11751dc1f6bdSJose Luis Duran                "stdout": """\
11761dc1f6bdSJose Luis DuranPATTERN: 0x01
11771dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
11781dc1f6bdSJose Luis Duran
11791dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics ---
11801dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
11811dc1f6bdSJose Luis Duran""",
11821dc1f6bdSJose Luis Duran                "stderr": """\
11831dc1f6bdSJose Luis Duranping: quoted data too short (40 bytes) from 192.0.2.2
11841dc1f6bdSJose Luis Duran""",
11851dc1f6bdSJose Luis Duran                "redacted": False,
11861dc1f6bdSJose Luis Duran            },
11871dc1f6bdSJose Luis Duran            id="_3_1_special_tcp",
11881dc1f6bdSJose Luis Duran        ),
11891dc1f6bdSJose Luis Duran        pytest.param(
11901dc1f6bdSJose Luis Duran            {
11911dc1f6bdSJose Luis Duran                "src": "192.0.2.1",
11921dc1f6bdSJose Luis Duran                "dst": "192.0.2.2",
11931dc1f6bdSJose Luis Duran                "icmp_type": 3,
11941dc1f6bdSJose Luis Duran                "icmp_code": 1,
11951dc1f6bdSJose Luis Duran                "special": "udp",
11961dc1f6bdSJose Luis Duran            },
11971dc1f6bdSJose Luis Duran            {
11981dc1f6bdSJose Luis Duran                "returncode": 2,
11991dc1f6bdSJose Luis Duran                "stdout": """\
12001dc1f6bdSJose Luis DuranPATTERN: 0x01
12011dc1f6bdSJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
12021dc1f6bdSJose Luis Duran
12031dc1f6bdSJose Luis Duran--- 192.0.2.2 ping statistics ---
12041dc1f6bdSJose Luis Duran1 packets transmitted, 0 packets received, 100.0% packet loss
12051dc1f6bdSJose Luis Duran""",
12061dc1f6bdSJose Luis Duran                "stderr": """\
12071dc1f6bdSJose Luis Duranping: quoted data too short (28 bytes) from 192.0.2.2
12081dc1f6bdSJose Luis Duran""",
12091dc1f6bdSJose Luis Duran                "redacted": False,
12101dc1f6bdSJose Luis Duran            },
12111dc1f6bdSJose Luis Duran            id="_3_1_special_udp",
12121dc1f6bdSJose Luis Duran        ),
1213*ea6d1692SJose Luis Duran        pytest.param(
1214*ea6d1692SJose Luis Duran            {
1215*ea6d1692SJose Luis Duran                "src": "192.0.2.1",
1216*ea6d1692SJose Luis Duran                "dst": "192.0.2.2",
1217*ea6d1692SJose Luis Duran                "icmp_type": 0,
1218*ea6d1692SJose Luis Duran                "icmp_code": 0,
1219*ea6d1692SJose Luis Duran                "special": "warp",
1220*ea6d1692SJose Luis Duran            },
1221*ea6d1692SJose Luis Duran            {
1222*ea6d1692SJose Luis Duran                "returncode": 0,
1223*ea6d1692SJose Luis Duran                "stdout": """\
1224*ea6d1692SJose Luis DuranPATTERN: 0x01
1225*ea6d1692SJose Luis DuranPING 192.0.2.2 (192.0.2.2): 56 data bytes
1226*ea6d1692SJose Luis Duran64 bytes from: icmp_seq=0 ttl= time= ms
1227*ea6d1692SJose Luis Duran
1228*ea6d1692SJose Luis Duran--- 192.0.2.2 ping statistics ---
1229*ea6d1692SJose Luis Duran1 packets transmitted, 1 packets received, 0.0% packet loss
1230*ea6d1692SJose Luis Duranround-trip min/avg/max/stddev = /// ms
1231*ea6d1692SJose Luis Duran""",
1232*ea6d1692SJose Luis Duran                "stderr": """\
1233*ea6d1692SJose Luis Duranping: time of day goes back (- ms), clamping time to 0
1234*ea6d1692SJose Luis Duran""",
1235*ea6d1692SJose Luis Duran                "redacted": True,
1236*ea6d1692SJose Luis Duran            },
1237*ea6d1692SJose Luis Duran            id="_0_0_special_warp",
1238*ea6d1692SJose Luis Duran        ),
12395b8af90fSJose Luis Duran    ]
12405b8af90fSJose Luis Duran
12415b8af90fSJose Luis Duran    @pytest.mark.parametrize("pinger_kargs, expected", pinger_testdata)
12425b8af90fSJose Luis Duran    @pytest.mark.require_progs(["scapy"])
12435b8af90fSJose Luis Duran    @pytest.mark.require_user("root")
12445b8af90fSJose Luis Duran    def test_pinger(self, pinger_kargs, expected):
12455b8af90fSJose Luis Duran        """Test ping using pinger(), a reply faker"""
12465b8af90fSJose Luis Duran        iface = IfaceFactory().create_iface("", "tun")[0].name
12475b8af90fSJose Luis Duran        ping = pinger(iface, **pinger_kargs)
12485b8af90fSJose Luis Duran        assert ping.returncode == expected["returncode"]
12495b8af90fSJose Luis Duran        if expected["redacted"]:
12505b8af90fSJose Luis Duran            assert redact(ping.stdout) == expected["stdout"]
1251*ea6d1692SJose Luis Duran            assert redact(ping.stderr) == expected["stderr"]
12525b8af90fSJose Luis Duran        else:
12535b8af90fSJose Luis Duran            assert ping.stdout == expected["stdout"]
12545b8af90fSJose Luis Duran            assert ping.stderr == expected["stderr"]
1255