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