Home | History | Annotate | Line # | Download | only in rrchecker
      1 # Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      2 #
      3 # SPDX-License-Identifier: MPL-2.0
      4 #
      5 # This Source Code Form is subject to the terms of the Mozilla Public
      6 # License, v. 2.0.  If a copy of the MPL was not distributed with this
      7 # file, you can obtain one at https://mozilla.org/MPL/2.0/.
      8 #
      9 # See the COPYRIGHT file distributed with this work for additional
     10 # information regarding copyright ownership.
     11 
     12 import os
     13 
     14 import pytest
     15 
     16 import isctest
     17 
     18 pytestmark = pytest.mark.extra_artifacts(
     19     [
     20         "tempzone",
     21     ]
     22 )
     23 
     24 
     25 @pytest.mark.parametrize(
     26     "option,expected_result",
     27     [
     28         ("-C", ["HS", "CH", "IN"]),
     29         (
     30             "-T",
     31             [
     32                 "A",
     33                 "A6",
     34                 "AAAA",
     35                 "AFSDB",
     36                 "AMTRELAY",
     37                 "APL",
     38                 "ATMA",
     39                 "AVC",
     40                 "BRID",
     41                 "CAA",
     42                 "CDNSKEY",
     43                 "CDS",
     44                 "CERT",
     45                 "CNAME",
     46                 "CSYNC",
     47                 "DHCID",
     48                 "DLV",
     49                 "DNAME",
     50                 "DNSKEY",
     51                 "DOA",
     52                 "DS",
     53                 "DSYNC",
     54                 "EID",
     55                 "EUI48",
     56                 "EUI64",
     57                 "GID",
     58                 "GPOS",
     59                 "HHIT",
     60                 "HINFO",
     61                 "HIP",
     62                 "HTTPS",
     63                 "IPSECKEY",
     64                 "ISDN",
     65                 "KEY",
     66                 "KX",
     67                 "L32",
     68                 "L64",
     69                 "LOC",
     70                 "LP",
     71                 "MB",
     72                 "MD",
     73                 "MF",
     74                 "MG",
     75                 "MINFO",
     76                 "MR",
     77                 "MX",
     78                 "NAPTR",
     79                 "NID",
     80                 "NIMLOC",
     81                 "NINFO",
     82                 "NS",
     83                 "NSAP",
     84                 "NSAP-PTR",
     85                 "NSEC",
     86                 "NSEC3",
     87                 "NSEC3PARAM",
     88                 "NULL",
     89                 "NXT",
     90                 "OPENPGPKEY",
     91                 "PTR",
     92                 "PX",
     93                 "RESINFO",
     94                 "RKEY",
     95                 "RP",
     96                 "RRSIG",
     97                 "RT",
     98                 "SIG",
     99                 "SINK",
    100                 "SMIMEA",
    101                 "SOA",
    102                 "SPF",
    103                 "SRV",
    104                 "SSHFP",
    105                 "SVCB",
    106                 "TA",
    107                 "TALINK",
    108                 "TLSA",
    109                 "TXT",
    110                 "UID",
    111                 "UINFO",
    112                 "UNSPEC",
    113                 "URI",
    114                 "WALLET",
    115                 "WKS",
    116                 "X25",
    117                 "ZONEMD",
    118             ],
    119         ),
    120         ("-P", []),
    121     ],
    122 )
    123 def test_rrchecker_list_standard_names(option, expected_result):
    124     cmd = isctest.run.cmd([os.environ["RRCHECKER"], option])
    125     values = [line for line in cmd.out.split("\n") if line.strip()]
    126 
    127     assert sorted(values) == sorted(expected_result)
    128 
    129 
    130 def run_rrchecker(option, rr_class, rr_type, rr_rest):
    131     cmd = isctest.run.cmd(
    132         [os.environ["RRCHECKER"], option],
    133         input_text=f"{rr_class} {rr_type} {rr_rest}".encode("utf-8"),
    134     )
    135     return cmd.out.strip().split()
    136 
    137 
    138 @pytest.mark.parametrize(
    139     "option",
    140     ["-p", "-u", "multi-line at class", " multi-line at type", "multi-line at data"],
    141 )
    142 def test_rrchecker_conversions(option):
    143     tempzone_file = "tempzone"
    144     with open(tempzone_file, "w", encoding="utf-8") as file:
    145         isctest.run.cmd(
    146             [
    147                 os.environ["SHELL"],
    148                 os.environ["TOP_SRCDIR"] + "/bin/tests/system/genzone.sh",
    149                 "0",
    150             ],
    151             stdout=file,
    152         )
    153     checkzone_output = isctest.run.cmd(
    154         [
    155             os.environ["CHECKZONE"],
    156             "-D",
    157             "-q",
    158             ".",
    159             tempzone_file,
    160         ],
    161     ).out
    162     checkzone_output = [
    163         line for line in checkzone_output.splitlines() if not line.startswith(";")
    164     ]
    165 
    166     for rr in checkzone_output:
    167         rr_parts_orig = rr.split()
    168         assert len(rr_parts_orig) >= 4, f"invalid rr: {rr}"
    169         rr_class_orig, rr_type_orig, rr_rest_orig = (
    170             rr_parts_orig[2],
    171             rr_parts_orig[3],
    172             " ".join(rr_parts_orig[4:]),
    173         )
    174         rr_class, rr_type, rr_rest = rr_class_orig, rr_type_orig, rr_rest_orig
    175         if option == "-u":
    176             rr_class, rr_type, *rr_rest = run_rrchecker(
    177                 "-u", rr_class_orig, rr_type_orig, rr_rest_orig
    178             )
    179             rr_rest = " ".join(rr_rest)
    180         elif option == "multi-line at class":
    181             rr_class = "(" + rr_class
    182             rr_rest = rr_rest + ")"
    183         elif option == "multi-line at type":
    184             rr_type = "(" + rr_type
    185             rr_rest = rr_rest + ")"
    186         elif option == "multi-line at data":
    187             rr_rest = "(" + rr_rest
    188             rr_rest = rr_rest + ")"
    189 
    190         rr_class, rr_type, *rr_rest = run_rrchecker("-p", rr_class, rr_type, rr_rest)
    191 
    192         assert rr_class_orig == rr_class
    193         assert rr_type_orig == rr_type
    194         assert rr_rest_orig == " ".join(rr_rest)
    195