[tor-commits] [stem/master] Unit test descriptor compression

atagar at torproject.org atagar at torproject.org
Sun Apr 1 04:40:01 UTC 2018


commit 522422427ec2b8427f9eb7baefb6261941772e85
Author: Damian Johnson <atagar at 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):
     """





More information about the tor-commits mailing list