|
| 1 | +import socket |
1 | 2 | import unittest |
2 | 3 |
|
| 4 | +from dns.name import from_text |
| 5 | +from dns.rdataclass import IN |
| 6 | +from dns.rdatatype import A |
| 7 | +from dns.resolver import restore_system_resolver |
| 8 | + |
| 9 | +from dns_cache import override_system_resolver |
| 10 | +from dns_cache.block import dnspython_resolver_socket_block |
3 | 11 | from dns_cache.hosts import loads |
| 12 | +from dns_cache.persistence import _LayeredCache |
| 13 | +from dns_cache.resolver import DNSPYTHON_2 |
| 14 | + |
| 15 | +from .test_upstream import orig_gethostbyname |
4 | 16 |
|
5 | 17 |
|
6 | 18 | class TestHostsSerializer(unittest.TestCase): |
7 | 19 | def test_loads(self): |
8 | 20 | data = loads() |
9 | 21 | assert data |
| 22 | + |
| 23 | + |
| 24 | +class TestHostsCache(unittest.TestCase): |
| 25 | + |
| 26 | + def test_hit_localhost(self): |
| 27 | + name = "localhost" |
| 28 | + assert socket.gethostbyname == orig_gethostbyname |
| 29 | + |
| 30 | + try: |
| 31 | + socket.gethostbyname(name) |
| 32 | + except Exception as e: |
| 33 | + raise unittest.SkipTest("gethostbyname: {}".format(e)) |
| 34 | + |
| 35 | + resolver = override_system_resolver() |
| 36 | + assert isinstance(resolver.cache, _LayeredCache) |
| 37 | + |
| 38 | + if DNSPYTHON_2: |
| 39 | + query = resolver.resolve |
| 40 | + else: |
| 41 | + query = resolver.query |
| 42 | + |
| 43 | + q1 = query(name) |
| 44 | + |
| 45 | + assert len(resolver.cache._read_only_cache.data) >= 1 |
| 46 | + # The layering does a put, which pushes localhost into cache2 |
| 47 | + # TODO this needs to be blocked |
| 48 | + assert len(resolver.cache._writable_cache.data) == 1 |
| 49 | + |
| 50 | + assert q1 |
| 51 | + |
| 52 | + name = from_text(name) |
| 53 | + |
| 54 | + assert (name, A, IN) in resolver.cache.data |
| 55 | + assert resolver.cache.get((name, A, IN)) |
| 56 | + |
| 57 | + with dnspython_resolver_socket_block(): |
| 58 | + q2 = query(name) |
| 59 | + |
| 60 | + assert q2 is q1 |
| 61 | + |
| 62 | + with dnspython_resolver_socket_block(): |
| 63 | + ip = socket.gethostbyname(name) |
| 64 | + assert ip == "127.0.0.1" |
| 65 | + |
| 66 | + restore_system_resolver() |
| 67 | + assert socket.gethostbyname == orig_gethostbyname |
0 commit comments