From: Bob Halley Date: Tue, 12 Mar 2024 13:27:35 +0000 (-0700) Subject: We were not calling check_delete_rdataset() in one delete path. X-Git-Tag: v2.7.0rc1~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a5996b59b4bd86c88c966e90462e8c6b527d2d10;p=thirdparty%2Fdnspython.git We were not calling check_delete_rdataset() in one delete path. This commit adds comprehensive testing of checks, and also plugs a few other coverage gaps. --- diff --git a/dns/transaction.py b/dns/transaction.py index 84e54f7d..aa2e1160 100644 --- a/dns/transaction.py +++ b/dns/transaction.py @@ -486,7 +486,7 @@ class Transaction: if exact: raise DeleteNotExact(f"{method}: missing rdataset") else: - self._delete_rdataset(name, rdtype, covers) + self._checked_delete_rdataset(name, rdtype, covers) return else: rdataset = self._rdataset_from_args(method, True, args) @@ -529,8 +529,6 @@ class Transaction: def _end(self, commit): self._check_ended() - if self._ended: - raise AlreadyEnded try: self._end_transaction(commit) finally: diff --git a/tests/test_transaction.py b/tests/test_transaction.py index 80559bd6..953a86f0 100644 --- a/tests/test_transaction.py +++ b/tests/test_transaction.py @@ -6,8 +6,8 @@ import pytest import dns.name import dns.rdataclass -import dns.rdatatype import dns.rdataset +import dns.rdatatype import dns.rrset import dns.transaction import dns.versioned @@ -227,6 +227,41 @@ def test_cannot_store_non_origin_soa(db): txn.add(rrset) +def test_checks(db): + called = set() + with db.writer() as txn: + txn.check_put_rdataset(lambda t, n, r: called.add("put_rdataset")) + txn.check_delete_rdataset(lambda t, n, r, c: called.add("delete_rdataset")) + txn.check_delete_name(lambda t, n: called.add("delete_name")) + rrset = dns.rrset.from_text("foo", 300, "in", "A", "10.0.0.1", "10.0.0.2") + txn.add(rrset) + rrset = dns.rrset.from_text("foo", 300, "in", "AAAA", "::1") + txn.add(rrset) + assert "put_rdataset" in called + rrset = dns.rrset.from_text("foo", 300, "in", "txt", "foo") + txn.add(rrset) + called.clear() + txn.delete("foo", "txt") + assert "delete_rdataset" in called + called.clear() + rdata = dns.rdata.from_text("in", "a", "10.0.0.2") + txn.delete("foo", rdata) + # we get put here as we're storing an updated rrset, not deleting it + assert "put_rdataset" in called + called.clear() + rdata = dns.rdata.from_text("in", "a", "10.0.0.1") + # now we are deleting + txn.delete("foo", rdata) + assert "delete_rdataset" in called + # non-match calls nothing + called.clear() + txn.delete("foo", "rrsig", "a") + assert len(called) == 0 + # delete the name + txn.delete("foo") + assert "delete_name" in called + + example_text = """$TTL 3600 $ORIGIN example. @ soa foo bar 1 2 3 4 5 @@ -462,6 +497,11 @@ def test_update_serial(zone): txn.update_serial(0, False) rdataset = zone.find_rdataset("@", "soa") assert rdataset[0].serial == 1 + # specifying the name explicitly works + with zone.writer() as txn: + txn.update_serial(1, True, "@") + rdataset = zone.find_rdataset("@", "soa") + assert rdataset[0].serial == 2 with pytest.raises(KeyError): with zone.writer() as txn: txn.update_serial(name=dns.name.from_text("unknown", None))