]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
a bit more cache coverage
authorBob Halley <halley@dnspython.org>
Thu, 28 May 2020 16:05:31 +0000 (09:05 -0700)
committerBob Halley <halley@dnspython.org>
Thu, 28 May 2020 16:05:31 +0000 (09:05 -0700)
tests/test_resolver.py

index 23653b1b50ede0adfec9cca2f83b7f997e6c5770..abc1a0f2fdf9fc1b22f6722178a0fabb2af929d3 100644 (file)
@@ -220,6 +220,61 @@ class BaseResolverTests(unittest.TestCase):
                                        dns.rdataclass.IN))
                             is None)
 
+    def test_cache_flush(self):
+        name1 = dns.name.from_text('name1')
+        name2 = dns.name.from_text('name2')
+        basic_cache = dns.resolver.Cache()
+        lru_cache = dns.resolver.LRUCache(100)
+        for cache in [basic_cache, lru_cache]:
+            answer1 = FakeAnswer(time.time() + 10)
+            answer2 = FakeAnswer(time.time() + 10)
+            cache.put((name1, dns.rdatatype.A, dns.rdataclass.IN), answer1)
+            cache.put((name2, dns.rdatatype.A, dns.rdataclass.IN), answer2)
+            canswer = cache.get((name1, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is answer1)
+            canswer = cache.get((name2, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is answer2)
+            # explicit flush
+            cache.flush((name1, dns.rdatatype.A, dns.rdataclass.IN))
+            canswer = cache.get((name1, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is None)
+            canswer = cache.get((name2, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is answer2)
+            # flush all
+            cache.flush()
+            canswer = cache.get((name1, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is None)
+            canswer = cache.get((name2, dns.rdatatype.A, dns.rdataclass.IN))
+            self.assertTrue(canswer is None)
+
+    def test_LRUCache_set_max_size(self):
+        cache = dns.resolver.LRUCache(4)
+        self.assertEqual(cache.max_size, 4)
+        cache.set_max_size(0)
+        self.assertEqual(cache.max_size, 1)
+
+    def test_LRUCache_overwrite(self):
+        def on_lru_list(cache, key, value):
+            cnode = cache.sentinel.next
+            while cnode != cache.sentinel:
+                if cnode.key == key and cnode.value is value:
+                    return True
+                cnode = cnode.next
+            return False
+        cache = dns.resolver.LRUCache(4)
+        answer1 = FakeAnswer(time.time() + 10)
+        answer2 = FakeAnswer(time.time() + 10)
+        key = (dns.name.from_text('key.'), dns.rdatatype.A, dns.rdataclass.IN)
+        cache.put(key, answer1)
+        canswer = cache.get(key)
+        self.assertTrue(canswer is answer1)
+        self.assertTrue(on_lru_list(cache, key, answer1))
+        cache.put(key, answer2)
+        canswer = cache.get(key)
+        self.assertTrue(canswer is answer2)
+        self.assertFalse(on_lru_list(cache, key, answer1))
+        self.assertTrue(on_lru_list(cache, key, answer2))
+
     def testEmptyAnswerSection(self):
         # TODO: dangling_cname_0_message_text was the only sample message
         #       with an empty answer section. Other than that it doesn't