From: Bob Halley Date: Thu, 28 May 2020 16:05:31 +0000 (-0700) Subject: a bit more cache coverage X-Git-Tag: v2.0.0rc1~144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a24087940bb17f2bcfcfc59d1aef3d5b3e100f1c;p=thirdparty%2Fdnspython.git a bit more cache coverage --- diff --git a/tests/test_resolver.py b/tests/test_resolver.py index 23653b1b..abc1a0f2 100644 --- a/tests/test_resolver.py +++ b/tests/test_resolver.py @@ -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