2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

Merge branch 'mnowak/pytest_rewrite_glue' into 'main'

Rewrite glue system test to pytest

See merge request isc-projects/bind9!8846
This commit is contained in:
Michal Nowak
2024-03-19 19:16:53 +00:00
7 changed files with 105 additions and 147 deletions

View File

@@ -20,7 +20,7 @@ import dns.message
def test_dialup_zone_transfer(named_port, servers, ns):
msg = dns.message.make_query("example.", "SOA")
# Drop the RD flag from the query
msg.flags -= dns.flags.RD
msg.flags &= ~dns.flags.RD
ns1response = isctest.query.tcp(msg, "10.53.0.1")
with servers[f"ns{ns}"].watch_log_from_start() as watcher:
watcher.wait_for_line(

View File

@@ -18,7 +18,6 @@
rm -f */named.conf
rm -f */named.memstats
rm -f */named.run
rm -f dig.out
rm -f ns*/K*
rm -f ns*/dsset-*
rm -f ns*/managed-keys.bind*

View File

@@ -1,27 +0,0 @@
; <<>> DiG 9.0 <<>> +norec @10.53.0.1 -p 5300 foo.bar.fi. A
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58772
;; flags: qr ad; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 7
;; QUESTION SECTION:
;foo.bar.fi. IN A
;; AUTHORITY SECTION:
fi. 172800 IN NS NS.EU.NET.
fi. 172800 IN NS NS.TELE.fi.
fi. 172800 IN NS PRIFI.EUNET.fi.
fi. 172800 IN NS NS.UU.NET.
fi. 172800 IN NS T.NS.VERIO.NET.
fi. 172800 IN NS HYDRA.HELSINKI.fi.
;; ADDITIONAL SECTION:
NS.TELE.fi. 172800 IN A 193.210.19.19
NS.TELE.fi. 172800 IN A 193.210.18.18
PRIFI.EUNET.fi. 172800 IN A 193.66.1.146
NS.UU.NET. 172800 IN A 137.39.1.3
T.NS.VERIO.NET. 172800 IN A 192.67.14.16
HYDRA.HELSINKI.fi. 172800 IN A 128.214.4.29
NS.EU.NET. 172800 IN A 192.16.202.11

View File

@@ -1,14 +0,0 @@
; <<>> DiG 9.0 <<>> @10.53.0.1 -p 5300 example.net a
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29409
;; flags: qr rd ad; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;example.net. IN A
;; AUTHORITY SECTION:
example.net. 300 IN NS ns2.example.
example.net. 300 IN NS ns1.example.

View File

@@ -1,90 +0,0 @@
#!/bin/sh
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
set -e
. ../conf.sh
dig_with_opts() {
"$DIG" +norec -p "${PORT}" "$@"
}
status=0
n=0
n=$((n + 1))
echo_i "testing that a ccTLD referral gets a full glue set from the root zone ($n)"
ret=0
dig_with_opts @10.53.0.1 foo.bar.fi. A >dig.out.$n || ret=1
digcomp --lc fi.good dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing that we don't find out-of-zone glue ($n)"
ret=0
dig_with_opts @10.53.0.1 example.net. A >dig.out.$n || ret=1
digcomp noglue.good dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for unsigned referrals close to UDP packet size limit (A glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +noedns foo.subdomain-a.tc-test-unsigned. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for unsigned referrals close to UDP packet size limit (AAAA glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +noedns foo.subdomain-aaaa.tc-test-unsigned. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for unsigned referrals close to UDP packet size limit (A+AAAA glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +noedns foo.subdomain-both.tc-test-unsigned. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for signed referrals close to UDP packet size limit (A glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +dnssec +bufsize=512 foo.subdomain-a.tc-test-signed. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for signed referrals close to UDP packet size limit (AAAA glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +dnssec +bufsize=512 foo.subdomain-aaaa.tc-test-signed. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "testing truncation for signed referrals close to UDP packet size limit (A+AAAA glue) ($n)"
ret=0
dig_with_opts @10.53.0.1 +ignore +dnssec +bufsize=512 foo.subdomain-both.tc-test-signed. >dig.out.$n || ret=1
grep -q "flags:[^;]* tc" dig.out.$n || ret=1
if [ "$ret" -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
echo_i "exit status: $status"
[ $status -eq 0 ] || exit 1

View File

@@ -0,0 +1,104 @@
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
import dns.message
import isctest
import pytest
pytest.importorskip("dns", minversion="2.0.0")
def test_glue_full_glue_set():
"""test that a ccTLD referral gets a full glue set from the root zone"""
msg = dns.message.make_query("foo.bar.fi", "A")
msg.flags &= ~dns.flags.RD
res = isctest.query.udp(msg, "10.53.0.1")
answer = """;ANSWER
;AUTHORITY
fi. 172800 IN NS HYDRA.HELSINKI.fi.
fi. 172800 IN NS NS.EU.NET.
fi. 172800 IN NS NS.UU.NET.
fi. 172800 IN NS NS.TELE.fi.
fi. 172800 IN NS T.NS.VERIO.NET.
fi. 172800 IN NS PRIFI.EUNET.fi.
;ADDITIONAL
NS.TELE.fi. 172800 IN A 193.210.18.18
NS.TELE.fi. 172800 IN A 193.210.19.19
PRIFI.EUNET.fi. 172800 IN A 193.66.1.146
HYDRA.HELSINKI.fi. 172800 IN A 128.214.4.29
NS.EU.NET. 172800 IN A 192.16.202.11
T.NS.VERIO.NET. 172800 IN A 192.67.14.16
NS.UU.NET. 172800 IN A 137.39.1.3
"""
expected_answer = dns.message.from_text(answer)
isctest.check.noerror(res)
isctest.check.rrsets_equal(res.answer, expected_answer.answer)
isctest.check.rrsets_equal(res.authority, expected_answer.authority)
isctest.check.rrsets_equal(res.additional, expected_answer.additional)
def test_glue_no_glue_set():
"""test that out-of-zone glue is not found"""
msg = dns.message.make_query("example.net.", "A")
msg.flags &= ~dns.flags.RD
res = isctest.query.udp(msg, "10.53.0.1")
answer = """;ANSWER
;AUTHORITY
example.net. 300 IN NS ns2.example.
example.net. 300 IN NS ns1.example.
;ADDITIONAL
"""
expected_answer = dns.message.from_text(answer)
isctest.check.noerror(res)
isctest.check.rrsets_equal(res.answer, expected_answer.answer)
isctest.check.rrsets_equal(res.authority, expected_answer.authority)
isctest.check.rrsets_equal(res.additional, expected_answer.additional)
@pytest.mark.parametrize(
"qname,dnssec",
[
# test truncation for unsigned referrals close to UDP packet size limit (A glue)
("foo.subdomain-a.tc-test-unsigned.", False),
# test truncation for unsigned referrals close to UDP packet size limit (AAAA glue)
("foo.subdomain-aaaa.tc-test-unsigned.", False),
# test truncation for unsigned referrals close to UDP packet size limit (A+AAAA glue)
("foo.subdomain-both.tc-test-unsigned.", False),
# test truncation for signed referrals close to UDP packet size limit (A glue)
("foo.subdomain-a.tc-test-signed.", True),
# test truncation for signed referrals close to UDP packet size limit (AAAA glue)
("foo.subdomain-aaaa.tc-test-signed.", True),
# test truncation for signed referrals close to UDP packet size limit (A+AAAA glue)
("foo.subdomain-both.tc-test-signed.", True),
],
)
def test_glue_truncation(qname, dnssec):
msg = dns.message.make_query(qname, "A")
msg.flags &= ~dns.flags.RD
if dnssec:
msg.use_edns(
payload=512,
# Zones used in this test were created with dig in mind that, unlike dnspython,
# by default, sets a cookie. Given that the message size must be close to the
# truncation limit, we also need to set a cookie here.
options=[dns.edns.GenericOption(dns.edns.OptionType.COOKIE, b"0xda13cc")],
)
msg.want_dnssec(wanted=True)
res = isctest.query.udp(msg, "10.53.0.1")
isctest.check.noerror(res)
assert res.flags & dns.flags.TC

View File

@@ -1,14 +0,0 @@
# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
#
# SPDX-License-Identifier: MPL-2.0
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, you can obtain one at https://mozilla.org/MPL/2.0/.
#
# See the COPYRIGHT file distributed with this work for additional
# information regarding copyright ownership.
def test_glue(run_tests_sh):
run_tests_sh()