diff --git a/bin/tests/system/isctest/asyncserver.py b/bin/tests/system/isctest/asyncserver.py index 3f9b4c2c5a..01d79e2351 100644 --- a/bin/tests/system/isctest/asyncserver.py +++ b/bin/tests/system/isctest/asyncserver.py @@ -768,13 +768,36 @@ class AsyncDnsServer(AsyncServer): self._zone_tree.add(zone) def _load_zone(self, zone_file_path: pathlib.Path) -> dns.zone.Zone: - origin = dns.name.from_text(zone_file_path.stem) logging.info("Loading zone file %s", zone_file_path) - with open(zone_file_path, encoding="utf-8") as zone_file: - zone = dns.zone.from_file(zone_file, origin, relativize=False) + zone = self._load_zone_file(zone_file_path) self._abort_if_dname_found_unless_acknowledged(zone) return zone + def _load_zone_file(self, zone_file_path: pathlib.Path) -> dns.zone.Zone: + try: + zone = self._load_zone_file_with_origin(zone_file_path) + except dns.zone.UnknownOrigin: + zone = self._load_zone_file_without_origin(zone_file_path) + + return zone + + def _load_zone_file_with_origin( + self, zone_file_path: pathlib.Path + ) -> dns.zone.Zone: + zone = dns.zone.from_file(str(zone_file_path), origin=None, relativize=False) + if zone.origin != dns.name.root: + error = "only the root zone may use $ORIGIN in the zone file; " + error += "for every other zone, its origin is determined by " + error += "the name of the file it is loaded from" + raise ValueError(error) + return zone + + def _load_zone_file_without_origin( + self, zone_file_path: pathlib.Path + ) -> dns.zone.Zone: + origin = dns.name.from_text(zone_file_path.stem) + return dns.zone.from_file(str(zone_file_path), origin=origin, relativize=False) + def _abort_if_dname_found_unless_acknowledged(self, zone: dns.zone.Zone) -> None: if self._acknowledge_manual_dname_handling: return