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