commit d0ec0cdc476151a4e698867a47f1c3ffc4662fdb Author: Damian Johnson atagar@torproject.org Date: Mon Dec 25 17:32:22 2017 -0800
Test index request failures --- stem/descriptor/collector.py | 14 +++++++++++--- test/unit/descriptor/collector.py | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py index 5d65fd65..2360d827 100644 --- a/stem/descriptor/collector.py +++ b/stem/descriptor/collector.py @@ -100,7 +100,11 @@ class Compression(object):
:returns: **bytes** with the decompressed content
- :raises: **ImportError** if this method if decompression is unavalable + :raises: + If unable to decompress this provide... + + * **IOError** if content isn't compressed with this + * **ImportError** if this method if decompression is unavalable """
if not self.available: @@ -190,7 +194,8 @@ class CollecTor(object): :raises: If unable to retrieve the index this provide...
- * **ValueError** if the index is malformed + * **ValueError** if json is malformed + * **IOError** if unable to decompress * **socket.timeout** if our request timed out * **urllib2.URLError** for most request failures """ @@ -201,7 +206,10 @@ class CollecTor(object): response = urllib.urlopen(url('index', self.compression), timeout = self.timeout).read()
if self.compression: - response = self.compression.decompress(response) + try: + response = self.compression.decompress(response) + except Exception as exc: + raise IOError('Unable to decompress response as %s: %s' % (self.compression, exc))
self._cached_index = json.loads(stem.util.str_tools._to_unicode(response)) self._cached_index_at = time.time() diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py index 01f8f6ee..a0f8cb2e 100644 --- a/test/unit/descriptor/collector.py +++ b/test/unit/descriptor/collector.py @@ -36,3 +36,18 @@ class TestCollector(unittest.TestCase):
collector = CollecTor(compression = None) self.assertEqual(expected, collector.index()) + + @patch(URL_OPEN, Mock(return_value = io.BytesIO(b'not json'))) + def test_index_malformed_json(self): + collector = CollecTor(compression = None) + + if stem.prereq.is_python_3(): + self.assertRaisesRegexp(ValueError, 'Expecting value: line 1 column 1', collector.index) + else: + self.assertRaisesRegexp(ValueError, 'No JSON object could be decoded', collector.index) + + def test_index_malformed_compression(self): + for compression in (GZIP, BZ2, LZMA): + with patch(URL_OPEN, Mock(return_value = io.BytesIO(b'not compressed'))): + collector = CollecTor(compression = compression) + self.assertRaisesRegexp(IOError, 'Unable to decompress response as %s' % compression, collector.index)
tor-commits@lists.torproject.org