Commit c1730ab208 for bind
commit c1730ab208f2b3037d6d9b73792ee8f0f16c5f39
Author: Andoni Duarte Pintado <andoni@isc.org>
Date: Wed Oct 21 18:05:27 2026 +0200
Mark intermediate asyncserver base classes as abstract
These classes are not meant for direct use, only their subclasses are.
Make this explicit by inheriting from abc.ABC.
diff --git a/bin/tests/system/cookie/cookie_ans.py b/bin/tests/system/cookie/cookie_ans.py
index 108cac2ff3..8dbf523adb 100644
--- a/bin/tests/system/cookie/cookie_ans.py
+++ b/bin/tests/system/cookie/cookie_ans.py
@@ -11,6 +11,8 @@
from collections.abc import AsyncGenerator
+import abc
+
import dns.edns
import dns.name
import dns.rcode
@@ -86,7 +88,7 @@ def _spoofed_a(qctx: QueryContext) -> dns.rrset.RRset:
)
-class _SpoofableHandler(ResponseHandler):
+class _SpoofableHandler(ResponseHandler, abc.ABC):
def __init__(self, evil_server: bool) -> None:
self.evil_server = evil_server
diff --git a/bin/tests/system/isctest/asyncserver/handlers.py b/bin/tests/system/isctest/asyncserver/handlers.py
index 72efb287fd..7f701eb57b 100644
--- a/bin/tests/system/isctest/asyncserver/handlers.py
+++ b/bin/tests/system/isctest/asyncserver/handlers.py
@@ -268,7 +268,7 @@ class StaticResponseHandler(ResponseHandler):
)
-class ForwarderHandler(ResponseHandler):
+class ForwarderHandler(ResponseHandler, abc.ABC):
"""
A handler forwarding all received queries to another DNS server with an
optional delay and then relaying the responses back to the original client.
@@ -370,7 +370,7 @@ class ForwarderHandler(ResponseHandler):
yield BytesResponseSend(response.result())
-class AxfrHandler(ResponseHandler):
+class AxfrHandler(ResponseHandler, abc.ABC):
"""
Base class for AXFR response handlers.
diff --git a/bin/tests/system/isctest/asyncserver/matchers.py b/bin/tests/system/isctest/asyncserver/matchers.py
index 5d2a302890..c11a932a3e 100644
--- a/bin/tests/system/isctest/asyncserver/matchers.py
+++ b/bin/tests/system/isctest/asyncserver/matchers.py
@@ -66,7 +66,7 @@ class Matcher(abc.ABC):
return f"{self.__class__.__name__}()"
-class _Combinator(Matcher):
+class _Combinator(Matcher, abc.ABC):
"""
Base class for matchers combining other matchers.
"""
diff --git a/bin/tests/system/ixfr/ans2/ans.py b/bin/tests/system/ixfr/ans2/ans.py
index 64e3ad8182..38a1b8f5c2 100644
--- a/bin/tests/system/ixfr/ans2/ans.py
+++ b/bin/tests/system/ixfr/ans2/ans.py
@@ -84,7 +84,7 @@ class SoaHandler(ResponseHandler):
yield DnsResponseSend(qctx.response)
-class IxfrHandler(ResponseHandler):
+class IxfrHandler(ResponseHandler, abc.ABC):
@property
@abc.abstractmethod
def answer(self) -> Collection[dns.rrset.RRset]:
diff --git a/bin/tests/system/qmin/qmin_ans.py b/bin/tests/system/qmin/qmin_ans.py
index 44c33a9bd8..75d5ca2795 100644
--- a/bin/tests/system/qmin/qmin_ans.py
+++ b/bin/tests/system/qmin/qmin_ans.py
@@ -48,7 +48,7 @@ class QueryLogHandler(ResponseHandler):
yield DnsResponseSend(qctx.response)
-class EntRcodeChanger(ResponseHandler):
+class EntRcodeChanger(ResponseHandler, abc.ABC):
"""
Log all received DNS queries to a text file. Use the zone file for
preparing responses, but override the RCODE returned for empty
@@ -79,7 +79,7 @@ class EntRcodeChanger(ResponseHandler):
yield DnsResponseSend(qctx.response)
-class DelayedResponseHandler(ResponseHandler):
+class DelayedResponseHandler(ResponseHandler, abc.ABC):
"""
Log all received DNS queries to a text file. Use the zone file for
preparing responses, but delay sending every answer by the amount of time
diff --git a/bin/tests/system/reclimit/reclimit_ans.py b/bin/tests/system/reclimit/reclimit_ans.py
index c989590cfd..2572e1ebe1 100644
--- a/bin/tests/system/reclimit/reclimit_ans.py
+++ b/bin/tests/system/reclimit/reclimit_ans.py
@@ -67,7 +67,7 @@ class ReclimitStateHandler(ResponseHandler):
self.indirect_send_response = self._indirect_send_response_default
-class ReclimitHandler(ResponseHandler):
+class ReclimitHandler(ResponseHandler, abc.ABC):
"""
Base class for handlers in this test.
diff --git a/bin/tests/system/resolver/ans8/ans.py b/bin/tests/system/resolver/ans8/ans.py
index bea20ff04c..14905fb3fb 100644
--- a/bin/tests/system/resolver/ans8/ans.py
+++ b/bin/tests/system/resolver/ans8/ans.py
@@ -31,7 +31,7 @@ from isctest.asyncserver.matchers import Domain, Protocol, Qname, Qtype
from ..resolver_ans import rrset
-class HeaderOnlyHandler(ResponseHandler):
+class HeaderOnlyHandler(ResponseHandler, abc.ABC):
"""
Return an empty DNS message with only header flags set.
"""
diff --git a/bin/tests/system/resolver/resolver_ans.py b/bin/tests/system/resolver/resolver_ans.py
index ca8a925de5..60d102b475 100644
--- a/bin/tests/system/resolver/resolver_ans.py
+++ b/bin/tests/system/resolver/resolver_ans.py
@@ -71,7 +71,7 @@ def setup_delegation(
qctx.response.additional.append(delegation.a_rrset)
-class DelegationHandler(ResponseHandler):
+class DelegationHandler(ResponseHandler, abc.ABC):
@property
@abc.abstractmethod
def domains(self) -> list[str]:
diff --git a/bin/tests/system/srtt/srtt_ans.py b/bin/tests/system/srtt/srtt_ans.py
index 55f9d88bd1..ab9eb0f255 100644
--- a/bin/tests/system/srtt/srtt_ans.py
+++ b/bin/tests/system/srtt/srtt_ans.py
@@ -22,7 +22,7 @@ from isctest.asyncserver.actions import DnsResponseSend
from isctest.asyncserver.matchers import Qname, Qtype
-class DelayedQnameRangeHandler(ResponseHandler):
+class DelayedQnameRangeHandler(ResponseHandler, abc.ABC):
"""
Respond to queries for QNAMEs "foo1.example." through "foo<N>.example."
with QTYPE=A, where <N> must be defined by the subclass. Every response is
diff --git a/bin/tests/system/xfer/ans11/ans.py b/bin/tests/system/xfer/ans11/ans.py
index 8d558217a8..847711c750 100644
--- a/bin/tests/system/xfer/ans11/ans.py
+++ b/bin/tests/system/xfer/ans11/ans.py
@@ -11,6 +11,8 @@
from collections.abc import AsyncGenerator
+import abc
+
import dns.flags
import dns.rcode
import dns.rdataclass
@@ -110,7 +112,7 @@ class InitialAxfrServed(Matcher):
return "after the initial AXFR"
-class TransferHandler(ResponseHandler):
+class TransferHandler(ResponseHandler, abc.ABC):
"""
Base for the handlers that share a single TransferState.
"""
diff --git a/bin/tests/system/xfer/ans9/ans.py b/bin/tests/system/xfer/ans9/ans.py
index dbe4b8b392..c9d2b2ccd2 100644
--- a/bin/tests/system/xfer/ans9/ans.py
+++ b/bin/tests/system/xfer/ans9/ans.py
@@ -11,6 +11,8 @@
from collections.abc import AsyncGenerator, Collection
+import abc
+
import dns.name
import dns.rcode
import dns.rdataclass
@@ -72,7 +74,7 @@ class SerialCounter:
self.serial = 0
-class SerialCounted(ResponseHandler):
+class SerialCounted(ResponseHandler, abc.ABC):
def __init__(self, serials: SerialCounter) -> None:
super().__init__()
self._serials = serials
@@ -88,7 +90,7 @@ class SoaHandler(SerialCounted):
yield DnsResponseSend(qctx.response)
-class ZoneAxfrHandler(AxfrHandler, SerialCounted):
+class ZoneAxfrHandler(AxfrHandler, SerialCounted, abc.ABC):
"""
Serve an AXFR for a single zone whose SOA serial is drawn from a shared
SerialCounter, bumping it once the transfer completes. Subclasses set