mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 07:35:26 +00:00
Adjust type hints for the "nsec3-answer" test
Add missing type hints in the tests_nsec3.py module. Tweak the syntax used for type hints for better consistency with other Python code in bin/tests/system/.
This commit is contained in:
committed by
Petr Špaček
parent
fc3d5e5918
commit
adb931f700
@@ -14,7 +14,7 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, Tuple
|
from typing import Optional, Set, Tuple
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ ZONE = isctest.name.ZoneAnalyzer.read_path(
|
|||||||
|
|
||||||
|
|
||||||
def do_test_query(
|
def do_test_query(
|
||||||
qname, qtype, server, named_port
|
qname: dns.name.Name, qtype: dns.rdatatype.RdataType, server: str, named_port: int
|
||||||
) -> Tuple[dns.message.QueryMessage, "NSEC3Checker"]:
|
) -> Tuple[dns.message.QueryMessage, "NSEC3Checker"]:
|
||||||
query = dns.message.make_query(qname, qtype, use_edns=True, want_dnssec=True)
|
query = dns.message.make_query(qname, qtype, use_edns=True, want_dnssec=True)
|
||||||
response = isctest.query.tcp(query, server, named_port, timeout=TIMEOUT)
|
response = isctest.query.tcp(query, server, named_port, timeout=TIMEOUT)
|
||||||
@@ -63,7 +63,7 @@ def do_test_query(
|
|||||||
sorted(ZONE.reachable - ZONE.get_names_with_type(dns.rdatatype.CNAME))
|
sorted(ZONE.reachable - ZONE.get_names_with_type(dns.rdatatype.CNAME))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
def test_nodata(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_nodata(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""An existing name, no wildcards, but a query type for RRset which does not exist"""
|
"""An existing name, no wildcards, but a query type for RRset which does not exist"""
|
||||||
_, nsec3check = do_test_query(qname, dns.rdatatype.HINFO, server, named_port)
|
_, nsec3check = do_test_query(qname, dns.rdatatype.HINFO, server, named_port)
|
||||||
check_nodata(qname, nsec3check)
|
check_nodata(qname, nsec3check)
|
||||||
@@ -75,7 +75,7 @@ def test_nodata(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
suffix=(ZONE.delegations - ZONE.get_names_with_type(dns.rdatatype.DS))
|
suffix=(ZONE.delegations - ZONE.get_names_with_type(dns.rdatatype.DS))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
def test_nodata_ds(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_nodata_ds(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""Auth sends proof of nonexistance with referral without DS RR. Opt-out is not supported."""
|
"""Auth sends proof of nonexistance with referral without DS RR. Opt-out is not supported."""
|
||||||
response, nsec3check = do_test_query(qname, dns.rdatatype.HINFO, server, named_port)
|
response, nsec3check = do_test_query(qname, dns.rdatatype.HINFO, server, named_port)
|
||||||
|
|
||||||
@@ -90,14 +90,14 @@ def test_nodata_ds(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
check_nodata(nsrr.name, nsec3check)
|
check_nodata(nsrr.name, nsec3check)
|
||||||
|
|
||||||
|
|
||||||
def check_nodata(name: dns.name.Name, nsec3check: "NSEC3Checker"):
|
def check_nodata(name: dns.name.Name, nsec3check: "NSEC3Checker") -> None:
|
||||||
assert nsec3check.response.rcode() is dns.rcode.NOERROR
|
assert nsec3check.response.rcode() is dns.rcode.NOERROR
|
||||||
|
|
||||||
nsec3check.prove_name_exists(name)
|
nsec3check.prove_name_exists(name)
|
||||||
nsec3check.check_extraneous_rrs()
|
nsec3check.check_extraneous_rrs()
|
||||||
|
|
||||||
|
|
||||||
def assume_nx_and_no_delegation(qname):
|
def assume_nx_and_no_delegation(qname: dns.name.Name) -> None:
|
||||||
assume(qname not in ZONE.all_existing_names)
|
assume(qname not in ZONE.all_existing_names)
|
||||||
|
|
||||||
# name must not be under a delegation or DNAME:
|
# name must not be under a delegation or DNAME:
|
||||||
@@ -115,7 +115,7 @@ def assume_nx_and_no_delegation(qname):
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=dns_names(suffix=SUFFIX))
|
@given(qname=dns_names(suffix=SUFFIX))
|
||||||
def test_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_nxdomain(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""A real NXDOMAIN, no wildcards involved"""
|
"""A real NXDOMAIN, no wildcards involved"""
|
||||||
assume_nx_and_no_delegation(qname)
|
assume_nx_and_no_delegation(qname)
|
||||||
wname = ZONE.source_of_synthesis(qname)
|
wname = ZONE.source_of_synthesis(qname)
|
||||||
@@ -129,7 +129,7 @@ def test_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=sampled_from(sorted(ZONE.get_names_with_type(dns.rdatatype.CNAME))))
|
@given(qname=sampled_from(sorted(ZONE.get_names_with_type(dns.rdatatype.CNAME))))
|
||||||
def test_cname_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_cname_nxdomain(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""CNAME which terminates by NXDOMAIN, no wildcards involved"""
|
"""CNAME which terminates by NXDOMAIN, no wildcards involved"""
|
||||||
response, nsec3check = do_test_query(qname, dns.rdatatype.A, server, named_port)
|
response, nsec3check = do_test_query(qname, dns.rdatatype.A, server, named_port)
|
||||||
chain = response.resolve_chaining()
|
chain = response.resolve_chaining()
|
||||||
@@ -145,7 +145,7 @@ def test_cname_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=dns_names(suffix=ZONE.get_names_with_type(dns.rdatatype.DNAME)))
|
@given(qname=dns_names(suffix=ZONE.get_names_with_type(dns.rdatatype.DNAME)))
|
||||||
def test_dname_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_dname_nxdomain(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""DNAME which terminates by NXDOMAIN, no wildcards involved"""
|
"""DNAME which terminates by NXDOMAIN, no wildcards involved"""
|
||||||
assume(qname not in ZONE.reachable)
|
assume(qname not in ZONE.reachable)
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ def test_dname_nxdomain(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=dns_names(suffix=ZONE.ents))
|
@given(qname=dns_names(suffix=ZONE.ents))
|
||||||
def test_ents(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_ents(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
"""ENT can have a wildcard under it"""
|
"""ENT can have a wildcard under it"""
|
||||||
assume_nx_and_no_delegation(qname)
|
assume_nx_and_no_delegation(qname)
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ def test_ents(server, qname: dns.name.Name, named_port: int) -> None:
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=dns_names(suffix=ZONE.reachable_wildcard_parents))
|
@given(qname=dns_names(suffix=ZONE.reachable_wildcard_parents))
|
||||||
def test_wildcard_synthesis(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_wildcard_synthesis(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
assume(qname not in ZONE.all_existing_names)
|
assume(qname not in ZONE.all_existing_names)
|
||||||
|
|
||||||
wname = ZONE.source_of_synthesis(qname)
|
wname = ZONE.source_of_synthesis(qname)
|
||||||
@@ -195,7 +195,7 @@ def test_wildcard_synthesis(server, qname: dns.name.Name, named_port: int) -> No
|
|||||||
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
"server", [pytest.param(AUTH, id="ns1"), pytest.param(RESOLVER, id="ns2")]
|
||||||
)
|
)
|
||||||
@given(qname=dns_names(suffix=ZONE.reachable_wildcard_parents))
|
@given(qname=dns_names(suffix=ZONE.reachable_wildcard_parents))
|
||||||
def test_wildcard_nodata(server, qname: dns.name.Name, named_port: int) -> None:
|
def test_wildcard_nodata(server: str, qname: dns.name.Name, named_port: int) -> None:
|
||||||
assume(qname not in ZONE.all_existing_names)
|
assume(qname not in ZONE.all_existing_names)
|
||||||
|
|
||||||
wname = ZONE.source_of_synthesis(qname)
|
wname = ZONE.source_of_synthesis(qname)
|
||||||
@@ -331,10 +331,10 @@ class NSEC3Checker:
|
|||||||
self.rrsets.append(rrset)
|
self.rrsets.append(rrset)
|
||||||
|
|
||||||
assert attrs_seen["algorithm"] is not None, f"no NSEC3 found\n{response}"
|
assert attrs_seen["algorithm"] is not None, f"no NSEC3 found\n{response}"
|
||||||
self.params = NSEC3Params(**attrs_seen) # type: NSEC3Params
|
self.params: NSEC3Params = NSEC3Params(**attrs_seen)
|
||||||
self.response = response # type: dns.message.Message
|
self.response: dns.message.Message = response
|
||||||
self.owners_present = owners_seen
|
self.owners_present: Set[dns.name.Name] = owners_seen
|
||||||
self.owners_used = set()
|
self.owners_used: Set[dns.name.Name] = set()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def nsec3_covers(rrset: dns.rrset.RRset, hashed_name: dns.name.Name) -> bool:
|
def nsec3_covers(rrset: dns.rrset.RRset, hashed_name: dns.name.Name) -> bool:
|
||||||
@@ -403,7 +403,7 @@ class NSEC3Checker:
|
|||||||
False
|
False
|
||||||
), f"Expected matching NSEC3 for {owner} (hash={nsec3_owner}) not found:\n{self.response}"
|
), f"Expected matching NSEC3 for {owner} (hash={nsec3_owner}) not found:\n{self.response}"
|
||||||
|
|
||||||
def check_extraneous_rrs(self):
|
def check_extraneous_rrs(self) -> None:
|
||||||
"""Check that all NSEC3 RRs present in the message were actually needed for proofs"""
|
"""Check that all NSEC3 RRs present in the message were actually needed for proofs"""
|
||||||
assert (
|
assert (
|
||||||
self.owners_used == self.owners_present
|
self.owners_used == self.owners_present
|
||||||
|
Reference in New Issue
Block a user