[tor-commits] [bridgedb/develop] Add three unittests for parsing unparseable extrainfo files.
isis at torproject.org
isis at torproject.org
Thu Feb 19 02:21:12 UTC 2015
commit 4933866de8aff1d5bb88ac8a10099e2489e544c4
Author: Isis Lovecruft <isis at torproject.org>
Date: Fri Dec 5 09:34:36 2014 +0000
Add three unittests for parsing unparseable extrainfo files.
---
lib/bridgedb/test/test_parse_descriptors.py | 111 +++++++++++++++++++++++++++
1 file changed, 111 insertions(+)
diff --git a/lib/bridgedb/test/test_parse_descriptors.py b/lib/bridgedb/test/test_parse_descriptors.py
index 67bef6a..b017dd6 100644
--- a/lib/bridgedb/test/test_parse_descriptors.py
+++ b/lib/bridgedb/test/test_parse_descriptors.py
@@ -12,6 +12,7 @@
from __future__ import print_function
import datetime
+import glob
import io
import os
import textwrap
@@ -419,3 +420,113 @@ class ParseDescriptorsTests(unittest.TestCase):
routers = descriptors.parseBridgeExtraInfoFiles(descFileOne,
validate=False)
self.assertGreaterEqual(len(routers), 1)
+
+ def test_parse_descriptosrs_parseBridgeExtraInfoFiles_unparseable(self):
+ """Test parsing three extrainfo descriptors: one is a valid descriptor,
+ one is an older duplicate, and one is unparseable (it has a bad
+ geoip-db-digest line). There should be only one descriptor returned
+ after parsing.
+ """
+ # Give it a bad geoip-db-digest:
+ unparseable = BRIDGE_EXTRA_INFO_DESCRIPTOR.replace(
+ "MiserLandfalls E08B324D20AD0A13E114F027AB9AC3F32CA696A0",
+ "DontParseMe F373CC1D86D82267F1F1F5D39470F0E0A022122E").replace(
+ "geoip-db-digest 09A0E093100B279AD9CFF47A67B13A21C6E1483F",
+ "geoip-db-digest FOOOOOOOOOOOOOOOOOOBAAAAAAAAAAAAAAAAAARR")
+
+ descFileOne = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR_NEWEST_DUPLICATE)
+ descFileTwo = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR)
+ # This must be a "real" file or _copyUnparseableDescriptorFile() will
+ # raise an AttributeError saying:
+ # '_io.BytesIO' object has no attribute 'rpartition'"
+ descFileThree = self.writeTestDescriptorsToFile(
+ "unparseable-descriptor", unparseable)
+ routers = descriptors.parseBridgeExtraInfoFiles(descFileOne,
+ descFileTwo,
+ descFileThree)
+ self.assertIsInstance(routers, dict)
+ self.assertEqual(len(routers), 1, (
+ "There were three extrainfo descriptors: one was a duplicate, "
+ "and one was unparseable, so that should only leave one "
+ "descriptor remaining."))
+
+ bridge = routers.values()[0]
+ self.assertEqual(
+ bridge.fingerprint,
+ "E08B324D20AD0A13E114F027AB9AC3F32CA696A0",
+ ("It looks like the (supposedly) unparseable bridge was returned "
+ "instead of the valid one!"))
+ self.assertEqual(
+ bridge.published,
+ datetime.datetime.strptime("2014-12-04 03:10:25", "%Y-%m-%d %H:%M:%S"),
+ "We should have the newest available descriptor for this router.")
+
+ def test_parse_descriptosrs_parseBridgeExtraInfoFiles_unparseable_and_parseable(self):
+ """Test parsing four extrainfo descriptors: two are valid descriptors,
+ one is an older duplicate of one of the valid descriptors, and one is
+ unparseable (it has a line we shouldn't recognise). There should be
+ only two descriptors returned after parsing.
+ """
+ # Mess up the bridge-ip-transports line:
+ unparseable = BRIDGE_EXTRA_INFO_DESCRIPTOR.replace(
+ "MiserLandfalls E08B324D20AD0A13E114F027AB9AC3F32CA696A0",
+ "DontParseMe F373CC1D86D82267F1F1F5D39470F0E0A022122E").replace(
+ "bridge-ip-transports <OR>=8",
+ "bridge-ip-transports <OR>")
+
+ parseable = BRIDGE_EXTRA_INFO_DESCRIPTOR.replace(
+ "MiserLandfalls E08B324D20AD0A13E114F027AB9AC3F32CA696A0",
+ "ImOkWithBeingParsed 2B5DA67FBA13A6449DE625673B7AE9E3AA7DF75F")
+
+ descFileOne = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR)
+ descFileTwo = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR_NEWEST_DUPLICATE)
+ # This must be a "real" file or _copyUnparseableDescriptorFile() will
+ # raise an AttributeError saying:
+ # '_io.BytesIO' object has no attribute 'rpartition'"
+ descFileThree = self.writeTestDescriptorsToFile(
+ "unparseable-descriptor.new", unparseable)
+ descFileFour = io.BytesIO(parseable)
+ routers = descriptors.parseBridgeExtraInfoFiles(descFileOne,
+ descFileTwo,
+ descFileThree,
+ descFileFour)
+ self.assertIsInstance(routers, dict)
+ self.assertEqual(len(routers), 2, (
+ "There were four extrainfo descriptors: one was a duplicate, "
+ "and one was unparseable, so that should only leave two "
+ "descriptors remaining."))
+
+ self.assertNotIn("F373CC1D86D82267F1F1F5D39470F0E0A022122E", routers.keys(),
+ "The 'unparseable' descriptor was returned by the parser.")
+
+ self.assertIn("E08B324D20AD0A13E114F027AB9AC3F32CA696A0", routers.keys(),
+ ("A bridge extrainfo which had duplicates was completely missing "
+ "from the data which the parser returned."))
+ self.assertEqual(
+ routers["E08B324D20AD0A13E114F027AB9AC3F32CA696A0"].published,
+ datetime.datetime.strptime("2014-12-04 03:10:25", "%Y-%m-%d %H:%M:%S"),
+ "We should have the newest available descriptor for this router.")
+
+ self.assertIn("2B5DA67FBA13A6449DE625673B7AE9E3AA7DF75F", routers.keys(),
+ "The 'parseable' descriptor wasn't returned by the parser.")
+
+ def test_parse_descriptosrs_parseBridgeExtraInfoFiles_unparseable_BytesIO(self):
+ """Test parsing three extrainfo descriptors: one is a valid descriptor,
+ one is an older duplicate, and one is unparseable (it has a bad
+ geoip-db-digest line). The parsing should raise an unhandled
+ AttributeError because _copyUnparseableDescriptorFile() tries to
+ manipulate the io.BytesIO object's filename, and it doesn't have one.
+ """
+ # Give it a bad geoip-db-digest:
+ unparseable = BRIDGE_EXTRA_INFO_DESCRIPTOR.replace(
+ "MiserLandfalls E08B324D20AD0A13E114F027AB9AC3F32CA696A0",
+ "DontParseMe F373CC1D86D82267F1F1F5D39470F0E0A022122E").replace(
+ "geoip-db-digest 09A0E093100B279AD9CFF47A67B13A21C6E1483F",
+ "geoip-db-digest FOOOOOOOOOOOOOOOOOOBAAAAAAAAAAAAAAAAAARR")
+
+ descFileOne = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR)
+ descFileTwo = io.BytesIO(BRIDGE_EXTRA_INFO_DESCRIPTOR_NEWEST_DUPLICATE)
+ descFileThree = io.BytesIO(unparseable)
+ self.assertRaises(AttributeError,
+ descriptors.parseBridgeExtraInfoFiles,
+ descFileOne, descFileTwo, descFileThree)
More information about the tor-commits
mailing list