]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pytest: dns_aging tests deletions using DNS update
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Mon, 14 Jun 2021 11:39:53 +0000 (23:39 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 20 Jun 2021 23:26:32 +0000 (23:26 +0000)
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/tests/dns_aging.py

index d196fa1a65c9f815d861bac2ea3cc270de5f7828..df1ea026393945e4302e09af8f80af980df7ce35 100644 (file)
@@ -2183,5 +2183,100 @@ class TestDNSAging(DNSTest):
     def test_AAAA_5_days_AAAA_6_days_no_aging(self):
         self._test_A_and_AAAA_records(IPv6_ADDR, IPv6_ADDR_2, 5, 6, aging=False)
 
+    def _test_dns_delete_times(self, n_days, aging=True):
+        # In these tests, Windows replaces the records with
+        # tombstones, while Samba just removes them. Both are
+        # reasonable approaches (there is no reanimation pathway for
+        # tombstones), but this means self.ldap_get_records() gets
+        # different numbers for each. So we use
+        # self.ldap_get_non_tombstoned_record().
+        name = 'test'
+        A = ['A']
+        B = ['B']
+        C = ['C']
+        D = ['D']
+        self.set_aging(aging)
+        now = dsdb_dns.unix_to_dns_timestamp(int(time.time()))
+        n_days_ago = max(now - n_days * 24, 0)
+
+        self.dns_update_record(name, A)
+        self.ldap_update_record(name, A, dwTimeStamp=n_days_ago)
+        self.ldap_update_record(name, B, dwTimeStamp=n_days_ago)
+        self.ldap_update_record(name, C, dwTimeStamp=n_days_ago)
+        self.dns_update_record(name, D)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(rset, set('ABCD'))
+
+        atime = self.get_unique_txt_record(name, A).dwTimeStamp
+        btime = self.get_unique_txt_record(name, B).dwTimeStamp
+        ctime = self.get_unique_txt_record(name, C).dwTimeStamp
+        dtime = self.get_unique_txt_record(name, D).dwTimeStamp
+        recs = self.ldap_get_records(name)
+        self.assertEqual(len(recs), 4)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(rset, set('ABCD'))
+
+        self.dns_delete(name, D)
+        self.assert_timestamps_equal(atime, self.get_unique_txt_record(name, A))
+        self.assert_timestamps_equal(btime, self.get_unique_txt_record(name, B))
+        self.assert_timestamps_equal(ctime, self.get_unique_txt_record(name, C))
+        recs = self.ldap_get_non_tombstoned_records(name)
+        self.assertEqual(len(recs), 3)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(rset, set('ABC'))
+
+        self.rpc_delete_txt(name, C)
+        self.assert_timestamps_equal(atime, self.get_unique_txt_record(name, A))
+        self.assert_timestamps_equal(btime, self.get_unique_txt_record(name, B))
+        recs = self.ldap_get_non_tombstoned_records(name)
+        self.assertEqual(len(recs), 2)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(rset, set('AB'))
+
+        self.dns_delete(name, A)
+        self.assert_timestamps_equal(btime, self.get_unique_txt_record(name, B))
+        recs = self.ldap_get_records(name)
+        self.assertEqual(len(recs), 1)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(rset, {'B'})
+
+        self.dns_delete(name, B)
+        recs = self.ldap_get_non_tombstoned_records(name)
+        # Windows leaves the node with zero records. Samba ends up
+        # with a tombstone.
+        self.assertEqual(len(recs), 0)
+        r = self.dns_query(name, dns.DNS_QTYPE_TXT)
+        rset = set(x.rdata.txt.str[0] for x in r.answers)
+        self.assertEqual(len(rset), 0)
+
+    def test_dns_delete_times_5_days_aging(self):
+        self._test_dns_delete_times(5, True)
+
+    def test_dns_delete_times_11_days_aging(self):
+        self._test_dns_delete_times(11, True)
+
+    def test_dns_delete_times_366_days_aging(self):
+        self._test_dns_delete_times(366, True)
+
+    def test_dns_delete_times_static_aging(self):
+        self._test_dns_delete_times(1e10, True)
+
+    def test_dns_delete_times_5_days_no_aging(self):
+        self._test_dns_delete_times(5, False)
+
+    def test_dns_delete_times_11_days_no_aging(self):
+        self._test_dns_delete_times(11, False)
+
+    def test_dns_delete_times_366_days_no_aging(self):
+        self._test_dns_delete_times(366, False)
+
+    def test_dns_delete_times_static_no_aging(self):
+        self._test_dns_delete_times(1e10, False)
+
 
 TestProgram(module=__name__, opts=subunitopts)