]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Refactor LogFile into TextFile with Grep support
authorNicki Křížek <nicki@isc.org>
Thu, 2 Oct 2025 15:06:25 +0000 (17:06 +0200)
committerNicki Křížek <nicki@isc.org>
Mon, 8 Dec 2025 13:57:47 +0000 (14:57 +0100)
Add a new Grep-like interface which can be used for searching for
regular expressions in files. Replace the prior LogFile used for named
logs with the new TextFile interface.

17 files changed:
bin/tests/system/dnssec/tests_tat.py
bin/tests/system/dnssec/tests_validation.py
bin/tests/system/isctest/instance.py
bin/tests/system/isctest/kasp.py
bin/tests/system/isctest/log/__init__.py
bin/tests/system/isctest/log/watchlog.py
bin/tests/system/isctest/text.py
bin/tests/system/kasp/tests_kasp.py
bin/tests/system/multisigner/tests_multisigner.py
bin/tests/system/rollover-algo-csk/tests_rollover_algo_csk_reconfig.py
bin/tests/system/rollover-algo-ksk-zsk/tests_rollover_algo_ksk_zsk_reconfig.py
bin/tests/system/rollover-csk-roll1/tests_rollover_csk_roll1.py
bin/tests/system/rollover-csk-roll2/tests_rollover_csk_roll2.py
bin/tests/system/rollover-enable-dnssec/tests_rollover_enable_dnssec.py
bin/tests/system/rollover-ksk-doubleksk/tests_rollover_ksk_doubleksk.py
bin/tests/system/rollover-zsk-prepub/tests_rollover_zsk_prepublication.py
bin/tests/system/spf/tests_spf_zones.py

index e37644f3a9a80a15afb9721220e2b4da51e56341..543207a117de568e91448f882698c6252d01d65e 100644 (file)
@@ -60,7 +60,7 @@ def test_tat_queries(ns1, ns6):
         watcher.wait_for_line("trust-anchor-telemetry '_ta-")
 
     # check that _ta-AAAA trust-anchor-telemetry are not sent when disabled
-    ns1.log.prohibit("sending trust-anchor-telemetry query '_ta")
+    assert "sending trust-anchor-telemetry query '_ta" not in ns1.log
 
     # check that KEY-TAG (ednsopt 14) trust-anchor-telemetry queries are
     # logged. this matches "dig . dnskey +ednsopt=KEY-TAG:ffff":
index b8f6baa4f8dcf91126e7779349db49150ad3fc0d..7c3cc24d381fdb47b2b65f264b954d71a35e1de6 100644 (file)
@@ -9,8 +9,8 @@
 # See the COPYRIGHT file distributed with this work for additional
 # information regarding copyright ownership.
 
+from re import compile as Re
 import os
-import re
 import shutil
 import time
 
@@ -54,14 +54,6 @@ pytestmark = pytest.mark.extra_artifacts(
 )
 
 
-# helper functions
-def grep_q(regex, filename):
-    with open(filename, "r", encoding="utf-8") as f:
-        blob = f.read().splitlines()
-    results = [x for x in blob if re.search(regex, x)]
-    return len(results) != 0
-
-
 def getfrom(file):
     with open(file, encoding="utf-8") as f:
         return f.read().strip()
@@ -501,13 +493,10 @@ def test_negative_validation_nsec3():
     isctest.check.servfail(res2)
 
 
-def test_excessive_nsec3_iterations():
-    assert grep_q(
-        "zone too-many-iterations/IN: excessive NSEC3PARAM iterations", "ns2/named.run"
-    )
-    assert grep_q(
-        "zone too-many-iterations/IN: excessive NSEC3PARAM iterations", "ns3/named.run"
-    )
+def test_excessive_nsec3_iterations(ns2, ns3):
+    msg = "zone too-many-iterations/IN: excessive NSEC3PARAM iterations"
+    assert msg in ns2.log
+    assert msg in ns3.log
 
     # check fallback to insecure with NSEC3 iterations is too high
     msg = isctest.query.create("does-not-exist.too-many-iterations", "A")
@@ -721,10 +710,11 @@ def test_negative_validation_optout():
 def test_cache(ns4):
     # check that key id's are logged when dumping the cache
     ns4.rndc("dumpdb -cache", log=False)
-    assert grep_q("; key id = ", "ns4/named_dump.db")
+    dumpdb = isctest.text.TextFile("ns4/named_dump.db")
+    assert "; key id = " in dumpdb
 
     # check for RRSIG covered type in negative cache
-    assert grep_q("; example. RRSIG NSEC ", "ns4/named_dump.db")
+    assert "; example. RRSIG NSEC " in dumpdb
 
     # check validated data are not cached longer than originalttl
     msg = isctest.query.create("a.ttlpatch.example", "A")
@@ -952,7 +942,8 @@ def test_validation_recovery(ns2, ns4):
     res = isctest.query.tcp(msg, "10.53.0.4")
     isctest.check.servfail(res)
     ns4.rndc("dumpdb", log=False)
-    grep_q("10.53.0.100", "ns4/named_dump.db")
+    dumpdb = isctest.text.TextFile("ns4/named_dump.db")
+    assert "10.53.0.100" in dumpdb
 
     # then reload server with properly signed zone
     shutil.copyfile(
@@ -1136,7 +1127,7 @@ def test_expired_signatures(ns4):
     isctest.check.servfail(res)
     isctest.check.noadflag(res)
     isctest.check.ede(res, EDECode.SIGNATURE_EXPIRED)
-    assert grep_q("expired.example/.*: RRSIG has expired", "ns4/named.run")
+    assert Re("expired.example/.*: RRSIG has expired") in ns4.log
 
     # check future signatures do not validate
     msg = isctest.query.create("future.example", "SOA")
@@ -1144,9 +1135,7 @@ def test_expired_signatures(ns4):
     isctest.check.servfail(res)
     isctest.check.noadflag(res)
     isctest.check.ede(res, EDECode.SIGNATURE_NOT_YET_VALID)
-    assert grep_q(
-        "future.example/.*: RRSIG validity period has not begun", "ns4/named.run"
-    )
+    assert Re("future.example/.*: RRSIG validity period has not begun") in ns4.log
 
     # check that a dynamic zone with future signatures is re-signed on load
     msg = isctest.query.create("managed-future.example", "A")
index d6400c5e39b6a84d8d33c095b9dffd8b97ce3685..9e8ac6b5dc14eb8d7d48a962d05689d4cb831968 100644 (file)
@@ -21,10 +21,11 @@ import re
 import dns.message
 import dns.rcode
 
-from .log import debug, info, LogFile, WatchLogFromStart, WatchLogFromHere
+from .log import debug, info, WatchLogFromStart, WatchLogFromHere
 from .rndc import RNDCBinaryExecutor, RNDCException, RNDCExecutor
 from .run import perl
 from .query import udp
+from .text import TextFile
 
 
 class NamedPorts(NamedTuple):
@@ -87,7 +88,7 @@ class NamedInstance:
         if ports is None:
             ports = NamedPorts.from_env()
         self.ports = ports
-        self.log = LogFile(os.path.join(identifier, "named.run"))
+        self.log = TextFile(os.path.join(identifier, "named.run"))
         self._rndc_executor = rndc_executor or RNDCBinaryExecutor()
         self._rndc_logger = rndc_logger
 
@@ -239,3 +240,6 @@ class NamedInstance:
             f"{os.environ['srcdir']}/start.pl",
             [self.system_test_name, self.identifier] + args,
         )
+
+    def __repr__(self):
+        return self.identifier
index f46ceabe73782547606fe99fecd3c4c4e0025f32..de3edc8e55fb135590b1633001f545ff980ec02b 100644 (file)
@@ -1099,9 +1099,8 @@ def check_cdslog(server, zone, key, substr):
 
 
 def check_cdslog_prohibit(server, zone, key, substr):
-    server.log.prohibit(
-        f"{substr} for key {zone}/{key.algorithm.name}/{key.tag} is now published"
-    )
+    msg = f"{substr} for key {zone}/{key.algorithm.name}/{key.tag} is now published"
+    assert msg not in server.log
 
 
 def check_cdsdelete(rrset, expected):
index 5975ae789269d7771bec45d3c7228b5c1cdce73f..228f69e5bfa7bdadb6479b99d9a5f44f49f9b66f 100644 (file)
@@ -23,4 +23,4 @@ from .basic import (
     critical,
 )
 
-from .watchlog import LogFile, WatchLogFromStart, WatchLogFromHere
+from .watchlog import WatchLogFromStart, WatchLogFromHere
index 3504452964a4b1d063f3d4d1ec548d670f7379f7..447879662a0d7c662d40ab644e9ea4e0c8f51b0f 100644 (file)
@@ -15,7 +15,7 @@ import abc
 import os
 import time
 
-from isctest.text import compile_pattern, FlexPattern, LineReader, LogFile
+from isctest.text import compile_pattern, FlexPattern, LineReader
 
 
 T = TypeVar("T")
index 902917ce19e9fd3a1f2e72a89eb662a225e1025b..46b710e454f5461b69c9b798c4c8a6fe0166a33c 100644 (file)
@@ -14,7 +14,7 @@
 import abc
 import re
 from re import compile as Re
-from typing import Iterator, Match, Optional, Pattern, TextIO, Union
+from typing import Iterator, List, Match, Optional, Pattern, TextIO, Union
 
 
 FlexPattern = Union[str, Pattern]
@@ -28,41 +28,60 @@ def compile_pattern(string: FlexPattern) -> Pattern:
     raise TypeError("only string and re.Pattern allowed")
 
 
-class LogFile:
+class Grep(abc.ABC):
     """
-    Log file wrapper with a path and means to find a string in its contents.
+    Implement a grep-like interface for pattern matching in texts and files.
     """
 
-    def __init__(self, path: str):
-        self.path = path
+    @abc.abstractmethod
+    def readlines(self) -> Iterator[str]:
+        raise NotImplementedError
 
-    @property
-    def _lines(self) -> Iterator[str]:
-        with open(self.path, encoding="utf-8") as f:
-            yield from f
+    def igrep(self, pattern: FlexPattern) -> Iterator[Match]:
+        """
+        Iterate over the lines matching the pattern.
+        """
+        regex = compile_pattern(pattern)
+
+        for line in self.readlines():
+            match = regex.search(line)
+            if match:
+                yield match
+
+    def grep(self, pattern: FlexPattern) -> List[Match]:
+        """
+        Get list of lines matching the pattern.
+        """
+        return list(self.igrep(pattern))
 
-    def __contains__(self, substring: str) -> bool:
+    def __contains__(self, pattern: FlexPattern) -> bool:
         """
-        Return whether any of the lines in the log contains a given string.
+        Return whether any of the lines in the log contains matches the pattern.
         """
-        for line in self._lines:
-            if substring in line:
-                return True
-        return False
+        try:
+            next(self.igrep(pattern))
+        except StopIteration:
+            return False
+        return True
 
-    def expect(self, msg: str):
-        """Check the string is present anywhere in the log file."""
-        if msg in self:
-            return
-        assert False, f"log message not found in log {self.path}: {msg}"
 
-    def prohibit(self, msg: str):
-        """Check the string is not present in the entire log file."""
-        if msg in self:
-            assert False, f"forbidden message appeared in log {self.path}: {msg}"
+class TextFile(Grep):
+    """
+    Text file wrapper with grep support.
+    """
+
+    def __init__(self, path: str):
+        self.path = path
+
+    def readlines(self) -> Iterator[str]:
+        with open(self.path, encoding="utf-8") as f:
+            yield from f
+
+    def __repr__(self):
+        return self.path
 
 
-class LineReader:
+class LineReader(Grep):
     """
     >>> import io
 
index d5acb31c154fd3c040566ef37fb19c71c97c1ff7..2e8d038e2945fb80906bc79bcd1c939013d4566c 100644 (file)
@@ -1601,7 +1601,7 @@ def test_kasp_zsk_retired(ns3):
         watcher.wait_for_line(f"keymgr: {zone} done")
 
     msg = f"zone {zone}/IN (signed): zone_rekey:zone_verifykeys failed: some key files are missing"
-    ns3.log.prohibit(msg)
+    assert msg not in ns3.log
 
 
 def test_kasp_purge_keys(ns4):
@@ -1625,10 +1625,10 @@ def test_kasp_purge_keys(ns4):
         watcher.wait_for_line(f"keymgr: {zone} done")
 
     msg = f"zone {zone}/IN/example1 (signed): zone_rekey:zone_verifykeys failed: some key files are missing"
-    ns4.log.prohibit(msg)
+    assert msg not in ns4.log
 
     msg = f"zone {zone}/IN/example2 (signed): zone_rekey:zone_verifykeys failed: some key files are missing"
-    ns4.log.prohibit(msg)
+    assert msg not in ns4.log
 
 
 def test_kasp_reload_restart(ns6):
@@ -1730,7 +1730,7 @@ def test_kasp_manual_mode(ns3):
     # Key rollover should have been be blocked.
     tag = expected[1].key.tag
     blockmsg = f"keymgr-manual-mode: block ZSK rollover for key {zone}/ECDSAP256SHA256/{tag} (policy {policy})"
-    ns3.log.expect(blockmsg)
+    assert blockmsg in ns3.log
 
     # Remove files.
     for key in ksks + zsks:
index 900cc7e7b46972400eed65bce0de8308d15a0cb9..40f6d9e04ccb676366eb4a02286a0227683abc48 100644 (file)
@@ -179,7 +179,7 @@ def check_add_zsk(server, zone, keys, expected, extra_keys, extra, primary=None)
     isctest.log.info(
         f"- zone {zone} {server.identifier}: make sure we did not try to sign with the keys added with nsupdate"
     )
-    server.log.prohibit(f"dns_zone_findkeys: error reading ./K{zone}")
+    assert f"dns_zone_findkeys: error reading ./K{zone}" not in server.log
 
     # Trigger keymgr.
     with server.watch_log_from_here() as watcher:
@@ -189,7 +189,7 @@ def check_add_zsk(server, zone, keys, expected, extra_keys, extra, primary=None)
     # Check again.
     isctest.log.info(f"- zone {zone} {server.identifier}: check again after keymgr run")
     check_dnssec(server, zone, keys + extra_keys, expected + extra)
-    server.log.prohibit(f"dns_zone_findkeys: error reading ./K{zone}")
+    assert f"dns_zone_findkeys: error reading ./K{zone}" not in server.log
 
 
 def _check_remove_zsk_fail(
index 2fcbd6290af2400d50cad8fa4880267bb3cba919..f9d5edb455f8355d4df5b5f2a9e502314d87ca37 100644 (file)
@@ -82,8 +82,8 @@ def test_algoroll_csk_reconfig_step1(tld, ns6, alg, size):
         tag = keys[0].key.tag
         msg1 = f"keymgr-manual-mode: block retire DNSKEY {zone}/RSASHA256/{tag} (CSK)"
         msg2 = f"keymgr-manual-mode: block new key generation for zone {zone} (policy {policy})"
-        ns6.log.expect(msg1)
-        ns6.log.expect(msg2)
+        assert msg1 in ns6.log
+        assert msg2 in ns6.log
 
         # Force step.
         with ns6.watch_log_from_here() as watcher:
@@ -175,7 +175,7 @@ def test_algoroll_csk_reconfig_step3(tld, ns6, alg, size):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type DS state HIDDEN to state RUMOURED"
-        ns6.log.expect(msg)
+        assert msg in ns6.log
 
         # Force step.
         with ns6.watch_log_from_here() as watcher:
@@ -244,7 +244,7 @@ def test_algoroll_csk_reconfig_step4(tld, ns6, alg, size):
         # Check logs.
         tag = keys[0].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/RSASHA256/{tag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
-        ns6.log.expect(msg)
+        assert msg in ns6.log
 
         # Force step.
         tag = keys[1].key.tag
index 590dc4ec3ca00362dd866b6b1da3cea18f9a220a..228e65045e016375dceda4028380c35257705764 100644 (file)
@@ -85,9 +85,9 @@ def test_algoroll_ksk_zsk_reconfig_step1(tld, ns6, alg, size):
         msg1 = f"keymgr-manual-mode: block retire DNSKEY {zone}/RSASHA256/{ktag} (KSK)"
         msg2 = f"keymgr-manual-mode: block retire DNSKEY {zone}/RSASHA256/{ztag} (ZSK)"
         msg3 = f"keymgr-manual-mode: block new key generation for zone {zone} (policy {policy})"  # twice
-        ns6.log.expect(msg1)
-        ns6.log.expect(msg2)
-        ns6.log.expect(msg3)
+        assert msg1 in ns6.log
+        assert msg2 in ns6.log
+        assert len(ns6.log.grep(msg3)) >= 2
 
         # Force step.
         with ns6.watch_log_from_here() as watcher:
@@ -184,7 +184,7 @@ def test_algoroll_ksk_zsk_reconfig_step3(tld, ns6, alg, size):
         # Check logs.
         tag = keys[2].key.tag
         msg = f"keymgr-manual-mode: block transition KSK {zone}/ECDSAP256SHA256/{tag} type DS state HIDDEN to state RUMOURED"
-        ns6.log.expect(msg)
+        assert msg in ns6.log
 
         # Force step.
         with ns6.watch_log_from_here() as watcher:
@@ -259,8 +259,8 @@ def test_algoroll_ksk_zsk_reconfig_step4(tld, ns6, alg, size):
         ztag = keys[1].key.tag
         msg1 = f"keymgr-manual-mode: block transition KSK {zone}/RSASHA256/{ktag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
         msg2 = f"keymgr-manual-mode: block transition ZSK {zone}/RSASHA256/{ztag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
-        ns6.log.expect(msg1)
-        ns6.log.expect(msg2)
+        assert msg1 in ns6.log
+        assert msg2 in ns6.log
 
         # Force step.
         ktag = keys[3].key.tag
index b4b31df6fde0be51c5cdd61cd0ef5816e9491f09..fcf4876b905da6b8e39facfca47fff6b259af9ec 100644 (file)
@@ -125,7 +125,7 @@ def test_csk_roll1_step2(tld, alg, size, ns3):
         # Check logs.
         tag = keys[0].key.tag
         msg = f"keymgr-manual-mode: block CSK rollover for key {zone}/ECDSAP256SHA256/{tag} (policy {policy})"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -185,7 +185,7 @@ def test_csk_roll1_step3(tld, alg, size, ns3):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type ZRRSIG state HIDDEN to state RUMOURED"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -274,8 +274,7 @@ def test_csk_roll1_step4(tld, alg, size, ns3):
         # Check logs.
         tag = keys[0].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type KRRSIG state OMNIPRESENT to state UNRETENTIVE"
-
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         tag = keys[1].key.tag
index d18b13fe5d2d50da197ac76089da477be05f7a5a..5a3ae2205f4dd14ed9ccc90d2febec4975c9078a 100644 (file)
@@ -128,7 +128,7 @@ def test_csk_roll2_step2(tld, alg, size, ns3):
         # Check logs.
         tag = keys[0].key.tag
         msg = f"keymgr-manual-mode: block CSK rollover for key {zone}/ECDSAP256SHA256/{tag} (policy {policy})"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -188,7 +188,7 @@ def test_csk_roll2_step3(tld, alg, size, ns3):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type ZRRSIG state HIDDEN to state RUMOURED"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -315,8 +315,8 @@ def test_csk_roll2_step5(tld, alg, size, ns3):
         tag = keys[0].key.tag
         msg1 = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
         msg2 = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type KRRSIG state OMNIPRESENT to state UNRETENTIVE"
-        ns3.log.expect(msg1)
-        ns3.log.expect(msg2)
+        assert msg1 in ns3.log
+        assert msg2 in ns3.log
 
         # Force step.
         tag = keys[1].key.tag
index e4d83be42f29b8d94b2aa3bd658245bf12699b06..ddcb6a5c797c06b2ce759414868b148b77b06b41 100644 (file)
@@ -74,7 +74,7 @@ def test_rollover_enable_dnssec_step1(tld, alg, size, ns3):
 
         # Check logs.
         msg = f"keymgr-manual-mode: block new key generation for zone {zone} (policy {policy})"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -155,7 +155,7 @@ def test_rollover_enable_dnssec_step3(tld, alg, size, ns3):
         # Check logs.
         tag = keys[0].key.tag
         msg = f"keymgr-manual-mode: block transition CSK {zone}/ECDSAP256SHA256/{tag} type DS state HIDDEN to state RUMOURED"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
index 68dc712b0be36a3935f9ef8dc875fad30cda3e93..26653a6b534f0234a079852d03017e56144955c5 100644 (file)
@@ -110,7 +110,7 @@ def test_ksk_doubleksk_step2(tld, alg, size, ns3):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block KSK rollover for key {zone}/ECDSAP256SHA256/{tag} (policy {policy})"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -171,7 +171,7 @@ def test_ksk_doubleksk_step3(tld, alg, size, ns3):
         # Check logs.
         tag = keys[2].key.tag
         msg = f"keymgr-manual-mode: block transition KSK {zone}/ECDSAP256SHA256/{tag} type DS state HIDDEN to state RUMOURED"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -252,8 +252,8 @@ def test_ksk_doubleksk_step4(tld, alg, size, ns3):
         tag = keys[1].key.tag
         msg1 = f"keymgr-manual-mode: block transition KSK {zone}/ECDSAP256SHA256/{tag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
         msg2 = f"keymgr-manual-mode: block transition KSK {zone}/ECDSAP256SHA256/{tag} type KRRSIG state OMNIPRESENT to state UNRETENTIVE"
-        ns3.log.expect(msg1)
-        ns3.log.expect(msg2)
+        assert msg1 in ns3.log
+        assert msg2 in ns3.log
 
         # Force step.
         tag = keys[2].key.tag
index 73f249b2586e4daca39eed1da1b2bfa6800cf451..17b7d38a57eafab3eae288f5ed384f6b1c7bb7c9 100644 (file)
@@ -117,7 +117,7 @@ def test_zsk_prepub_step2(tld, alg, size, ns3):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block ZSK rollover for key {zone}/ECDSAP256SHA256/{tag} (policy {policy})"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -176,7 +176,7 @@ def test_zsk_prepub_step3(tld, alg, size, ns3):
         # Check logs.
         tag = keys[2].key.tag
         msg = f"keymgr-manual-mode: block transition ZSK {zone}/ECDSAP256SHA256/{tag} type ZRRSIG state HIDDEN to state RUMOURED"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         with ns3.watch_log_from_here() as watcher:
@@ -263,7 +263,7 @@ def test_zsk_prepub_step4(tld, alg, size, ns3):
         # Check logs.
         tag = keys[1].key.tag
         msg = f"keymgr-manual-mode: block transition ZSK {zone}/ECDSAP256SHA256/{tag} type DNSKEY state OMNIPRESENT to state UNRETENTIVE"
-        ns3.log.expect(msg)
+        assert msg in ns3.log
 
         # Force step.
         tag = keys[2].key.tag
index bcb08e9e5bf4e47f42298d5b5c606ecba14cd078..5cb7348c3c0cd47d10f667581add9a9e38400b8e 100644 (file)
@@ -21,7 +21,7 @@ def test_spf_log(ns1):
         "zone warn/IN: loaded serial 0",
         "zone nowarn/IN: loaded serial 0",
     ):
-        ns1.log.expect(msg)
+        assert msg in ns1.log
 
     for msg in (
         "zone nowarn/IN: 'y.nowarn' found type SPF record but no SPF TXT record found",
@@ -29,4 +29,4 @@ def test_spf_log(ns1):
         "zone warn/IN: 'warn' found type SPF record but no SPF TXT record found",
         "zone nowarn/IN: 'nowarn' found type SPF record but no SPF TXT record found",
     ):
-        ns1.log.prohibit(msg)
+        assert msg not in ns1.log