commit 522422427ec2b8427f9eb7baefb6261941772e85 Author: Damian Johnson atagar@torproject.org Date: Sat Mar 31 12:00:54 2018 -0700
Unit test descriptor compression
Mocking download responses so we can add unit test coverage of our compression support. --- test/unit/descriptor/__init__.py | 9 +++ test/unit/descriptor/data/compressed_gzip | Bin 0 -> 1543 bytes test/unit/descriptor/data/compressed_identity | 52 +++++++++++++++++ test/unit/descriptor/data/compressed_lzma | 0 test/unit/descriptor/data/compressed_zstd | Bin 0 -> 1550 bytes test/unit/descriptor/remote.py | 77 +++++++++++++++++++++++++- 6 files changed, 136 insertions(+), 2 deletions(-)
diff --git a/test/unit/descriptor/__init__.py b/test/unit/descriptor/__init__.py index bf0e8619..bce8d3d0 100644 --- a/test/unit/descriptor/__init__.py +++ b/test/unit/descriptor/__init__.py @@ -25,6 +25,15 @@ def get_resource(filename): return os.path.join(DESCRIPTOR_TEST_DATA, filename)
+def read_resource(filename): + """ + Provides test data. + """ + + with open(get_resource(filename), 'rb') as resource_file: + return resource_file.read() + + def base_expect_invalid_attr(cls, default_attr, default_value, test, desc_attrs, attr = None, expected_value = None): return base_expect_invalid_attr_for_text(cls, default_attr, default_value, test, cls.content(desc_attrs), attr, expected_value)
diff --git a/test/unit/descriptor/data/compressed_gzip b/test/unit/descriptor/data/compressed_gzip new file mode 100644 index 00000000..2b2dc642 Binary files /dev/null and b/test/unit/descriptor/data/compressed_gzip differ diff --git a/test/unit/descriptor/data/compressed_identity b/test/unit/descriptor/data/compressed_identity new file mode 100644 index 00000000..cd5b56b4 --- /dev/null +++ b/test/unit/descriptor/data/compressed_identity @@ -0,0 +1,52 @@ +router moria1 128.31.0.34 9101 0 9131 +identity-ed25519 +-----BEGIN ED25519 CERT----- +AQQABnxNAQS9ja600v/ZodOUiu7NepTkbPIOrFPgEVQE+03rGBtPAQAgBADKnR/C +2nhpr9UzJkkbPy83sqbfNh63VgFnCpkSTULAcq52z8xM7raRDCiTJTu/FK/BJGgE +dJcFQ8MgZJOuYgFKcMVyQ6j2FGbhDI0zQTK1+TAPNRG4ixiF7h7wqDT9Ugw= +-----END ED25519 CERT----- +master-key-ed25519 yp0fwtp4aa/VMyZJGz8vN7Km3zYet1YBZwqZEk1CwHI +platform Tor 0.3.4.0-alpha-dev on Linux +proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2 +published 2018-03-31 04:17:41 +fingerprint 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31 +uptime 295196 +bandwidth 512000 62914560 3403447 +extra-info-digest 393861CB4D9A0480E5A58A3005A88DD7F09271E3 CCbwxMembtsEKAVkU2bqCiBhKaokRlJv6077uy5kI4Q +caches-extra-info +onion-key +-----BEGIN RSA PUBLIC KEY----- +MIGJAoGBAKsNybH/i/nMLDwSr6WYd77EV6IgiuhfD7UBbsifsDywTe+YrZU3Z4O+ +DY9jemMPRA7wYioJrmXyMVTsbktjWUtWFge1oUj2xsxO3cufCavLmmkmqpkHL3Wn +xRJraupgfLK72/UN8wXB0duSAU/DH9hTg7WRhkFZdRJK7rostJvZAgMBAAE= +-----END RSA PUBLIC KEY----- +signing-key +-----BEGIN RSA PUBLIC KEY----- +MIGJAoGBALtJ9uD7cD7iHjqNA3AgsX9prES5QN+yFQyr2uOkxzhvunnaf6SNhzWW +bkfylnMrRm/qCz/czcjZO6N6EKHcXmypehvP566B7gAQ9vDsb+l7VZVWgXvzNc2s +tl3P7qpC08rgyJh1GqmtQTCesIDqkEyWxwToympCt09ZQRq+fIttAgMBAAE= +-----END RSA PUBLIC KEY----- +onion-key-crosscert +-----BEGIN CROSSCERT----- +A9x30r1LTl6rRUe4/irB6/cdNGmd95+bOuArjrmuwSI8Crerx3uNbbN8/iRlRSec +fBqElxb8SvEGONvtyjGVxp+t5QQS381Bah7DRMz7MfRvOgD8UoZ4DEcpMBnJnA+O +5OnAoBVOProdfUvFfEnBWJY+ELB3ShG4A3TL4c8QrwA= +-----END CROSSCERT----- +ntor-onion-key-crosscert 0 +-----BEGIN ED25519 CERT----- +AQoABnadAcqdH8LaeGmv1TMmSRs/Lzeypt82HrdWAWcKmRJNQsByAEnIlLlEtELa +EZA/y3Q5wXxA20upqmSKoCt1s8a6cXHqnsbha61MVbRLVCgWlWmKNjBSu+GiXeXC +IJ9Tr+aYawM= +-----END ED25519 CERT----- +hidden-service-dir +contact 1024D/28988BF5 arma mit edu +ntor-onion-key a3r4k2huGP4YdHTQ8ldJhZkm5O+1tLaKE//o5DSibU0= +reject *:* +tunnelled-dir-server +router-sig-ed25519 FkY6h3SMPWPt1fQlU8jsFllGWIy+lw7SGTjTV2FZVNlrHYHcS1F2L7bMGu38ljZ7J+VIBssRZnaiQVEXbI9uDQ +router-signature +-----BEGIN SIGNATURE----- +UzHGCcQK1XGntL3MVvcgcj0kpCsEMf5UIEj4eWOtCjWyriOX7nqwayc5vWOubZLN +pAZ27MjVmMbVGgtS0xFZ/UQrGEeznITaZwjLNd1IOliadKPdOp4w4OFcjbkCytk6 +MdAEyxwnZzxUwCex0Kj+3FWXQTr09VnXMg5/+vdbCUY= +-----END SIGNATURE----- diff --git a/test/unit/descriptor/data/compressed_lzma b/test/unit/descriptor/data/compressed_lzma new file mode 100644 index 00000000..e69de29b diff --git a/test/unit/descriptor/data/compressed_zstd b/test/unit/descriptor/data/compressed_zstd new file mode 100644 index 00000000..b3c3269b Binary files /dev/null and b/test/unit/descriptor/data/compressed_zstd differ diff --git a/test/unit/descriptor/remote.py b/test/unit/descriptor/remote.py index 41585fc2..05cf1d57 100644 --- a/test/unit/descriptor/remote.py +++ b/test/unit/descriptor/remote.py @@ -11,6 +11,7 @@ import stem.prereq import stem.util.conf
from stem.descriptor.remote import Compression +from test.unit.descriptor import read_resource
try: # added in python 2.7 @@ -110,14 +111,18 @@ FALLBACK_ENTRY = b"""\ """
-def _urlopen_mock(data): +def _urlopen_mock(data, encoding = 'identity'): urlopen_mock = Mock() urlopen_mock().read.return_value = data - urlopen_mock().info().getheader.return_value = 'identity' + urlopen_mock().info().getheader.return_value = encoding return urlopen_mock
class TestDescriptorDownloader(unittest.TestCase): + def tearDown(self): + # prevent our mocks from impacting other tests + stem.descriptor.remote.SINGLETON_DOWNLOADER = None + def test_gzip_url_override(self): query = stem.descriptor.remote.Query(TEST_RESOURCE, start = False) self.assertEqual([Compression.PLAINTEXT], query.compression) @@ -145,6 +150,74 @@ class TestDescriptorDownloader(unittest.TestCase): query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.LZMA, start = False) self.assertEqual([Compression.PLAINTEXT], query.compression)
+ @patch(URL_OPEN, _urlopen_mock(read_resource('compressed_identity'), encoding = 'identity')) + def test_compression_plaintext(self): + """ + Download a plaintext descriptor. + """ + + descriptors = list(stem.descriptor.remote.get_server_descriptors( + '9695DFC35FFEB861329B9F1AB04C46397020CE31', + compression = Compression.PLAINTEXT, + validate = True, + )) + + self.assertEqual(1, len(descriptors)) + self.assertEqual('moria1', descriptors[0].nickname) + + @patch(URL_OPEN, _urlopen_mock(read_resource('compressed_gzip'), encoding = 'gzip')) + def test_compression_gzip(self): + """ + Download a gip compressed descriptor. + """ + + descriptors = list(stem.descriptor.remote.get_server_descriptors( + '9695DFC35FFEB861329B9F1AB04C46397020CE31', + compression = Compression.GZIP, + validate = True, + )) + + self.assertEqual(1, len(descriptors)) + self.assertEqual('moria1', descriptors[0].nickname) + + @patch(URL_OPEN, _urlopen_mock(read_resource('compressed_zstd'), encoding = 'x-zstd')) + def test_compression_zstd(self): + """ + Download a zstd compressed descriptor. + """ + + if not stem.descriptor.remote.ZSTD_SUPPORTED: + self.skipTest('(requires zstd module)') + return + + descriptors = list(stem.descriptor.remote.get_server_descriptors( + '9695DFC35FFEB861329B9F1AB04C46397020CE31', + compression = Compression.ZSTD, + validate = True, + )) + + self.assertEqual(1, len(descriptors)) + self.assertEqual('moria1', descriptors[0].nickname) + + @patch(URL_OPEN, _urlopen_mock(read_resource('compressed_lzma'), encoding = 'x-tor-lzma')) + def test_compression_lzma(self): + """ + Download a lzma compressed descriptor. + """ + + if not stem.descriptor.remote.LZMA_SUPPORTED: + self.skipTest('(requires lzma module)') + return + + descriptors = list(stem.descriptor.remote.get_server_descriptors( + '9695DFC35FFEB861329B9F1AB04C46397020CE31', + compression = Compression.LZMA, + validate = True, + )) + + self.assertEqual(1, len(descriptors)) + self.assertEqual('moria1', descriptors[0].nickname) + @patch(URL_OPEN, _urlopen_mock(TEST_DESCRIPTOR)) def test_query_download(self): """
tor-commits@lists.torproject.org