commit a1d2a0ffffd5aeec96c37fbbf1b4134c9b34b631 Author: Damian Johnson atagar@torproject.org Date: Sun Oct 7 18:18:14 2012 -0700
Unit tests for minimal v2 and microdescriptor v3 router status entries
Tests to exercise basic parsing for the v2 and microdescriptor v3 RouterStatusEntry subclasses. They're both largely a subset of the v3 RouterStatusEntry so I don't plan to add additional tests for the moment. --- stem/descriptor/router_status_entry.py | 2 +- test/mocking.py | 74 ++++++++++++++++++++++++--- test/unit/descriptor/router_status_entry.py | 47 ++++++++++++++++- 3 files changed, 111 insertions(+), 12 deletions(-)
diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py index 50f0825..f663f07 100644 --- a/stem/descriptor/router_status_entry.py +++ b/stem/descriptor/router_status_entry.py @@ -285,7 +285,7 @@ class RouterStatusEntryMicroV3(RouterStatusEntry):
self.digest = None
- super(RouterStatusEntryMicroV3, self).__init__(content) + super(RouterStatusEntryMicroV3, self).__init__(content, validate, document)
def _parse(self, entries, validate): for keyword, values in entries.items(): diff --git a/test/mocking.py b/test/mocking.py index 808cb8d..7c848ad 100644 --- a/test/mocking.py +++ b/test/mocking.py @@ -23,14 +23,24 @@ calling :func:`test.mocking.revert_mocking`. Instance Constructors get_message - stem.socket.ControlMessage get_protocolinfo_response - stem.response.protocolinfo.ProtocolInfoResponse - get_relay_server_descriptor - stem.descriptor.server_descriptor.RelayDescriptor - get_bridge_server_descriptor - stem.descriptor.server_descriptor.BridgeDescriptor - get_relay_extrainfo_descriptor - stem.descriptor.extrainfo_descriptor.RelayExtraInfoDescriptor - get_bridge_extrainfo_descriptor - stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor - get_router_status_entry_v3 - stem.descriptor.router_status_entry.RouterStatusEntryV3 - get_directory_authority - stem.descriptor.networkstatus.DirectoryAuthority - get_key_certificate - stem.descriptor.networkstatus.KeyCertificate - get_network_status_document - stem.descriptor.networkstatus.NetworkStatusDocument + + stem.descriptor.server_descriptor + get_relay_server_descriptor - RelayDescriptor + get_bridge_server_descriptor - BridgeDescriptor + + stem.descriptor.extrainfo_descriptor + get_relay_extrainfo_descriptor - RelayExtraInfoDescriptor + get_bridge_extrainfo_descriptor - BridgeExtraInfoDescriptor + + stem.descriptor.networkstatus + get_directory_authority - DirectoryAuthority + get_key_certificate - KeyCertificate + get_network_status_document - NetworkStatusDocument + + stem.descriptor.router_status_entry + get_router_status_entry_v2 - RouterStatusEntryV2 + get_router_status_entry_v3 - RouterStatusEntryV3 + get_router_status_entry_micro_v3 - RouterStatusEntryMicroV3 """
import inspect @@ -107,11 +117,21 @@ BRIDGE_EXTRAINFO_FOOTER = ( ("router-digest", "006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4"), )
+ROUTER_STATUS_ENTRY_V2_HEADER = ( + ("r", "caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0"), +) + ROUTER_STATUS_ENTRY_V3_HEADER = ( ("r", "caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0"), ("s", "Fast Named Running Stable Valid"), )
+ROUTER_STATUS_ENTRY_MICRO_V3_HEADER = ( + ("r", "Konata ARIJF2zbqirB9IwsW0mQznccWww 2012-09-24 13:40:40 69.64.48.168 9001 9030"), + ("m", "aiUklwBrua82obG5AsTX+iEpkjQA2+AQHxZ7GwMfY70"), + ("s", "Fast Guard HSDir Named Running Stable V2Dir Valid"), +) + AUTHORITY_HEADER = ( ("dir-source", "turtles 27B6B5996C426270A5C95488AA5BCEB6BCC86956 no.place.com 76.73.17.194 9030 9090"), ("contact", "Mike Perry <email>"), @@ -523,6 +543,25 @@ def get_bridge_extrainfo_descriptor(attr = None, exclude = (), content = False): else: return stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor(desc_content, validate = True)
+def get_router_status_entry_v2(attr = None, exclude = (), content = False): + """ + Provides the descriptor content for... + stem.descriptor.router_status_entry.RouterStatusEntryV2 + + :param dict attr: keyword/value mappings to be included in the descriptor + :param list exclude: mandatory keywords to exclude from the descriptor + :param bool content: provides the str content of the descriptor rather than the class if True + + :returns: RouterStatusEntryV2 for the requested descriptor content + """ + + desc_content = _get_descriptor_content(attr, exclude, ROUTER_STATUS_ENTRY_V2_HEADER) + + if content: + return desc_content + else: + return stem.descriptor.router_status_entry.RouterStatusEntryV2(desc_content, validate = True) + def get_router_status_entry_v3(attr = None, exclude = (), content = False): """ Provides the descriptor content for... @@ -542,6 +581,25 @@ def get_router_status_entry_v3(attr = None, exclude = (), content = False): else: return stem.descriptor.router_status_entry.RouterStatusEntryV3(desc_content, validate = True)
+def get_router_status_entry_micro_v3(attr = None, exclude = (), content = False): + """ + Provides the descriptor content for... + stem.descriptor.router_status_entry.RouterStatusEntryMicroV3 + + :param dict attr: keyword/value mappings to be included in the descriptor + :param list exclude: mandatory keywords to exclude from the descriptor + :param bool content: provides the str content of the descriptor rather than the class if True + + :returns: RouterStatusEntryMicroV3 for the requested descriptor content + """ + + desc_content = _get_descriptor_content(attr, exclude, ROUTER_STATUS_ENTRY_MICRO_V3_HEADER) + + if content: + return desc_content + else: + return stem.descriptor.router_status_entry.RouterStatusEntryMicroV3(desc_content, validate = True) + def get_directory_authority(attr = None, exclude = (), is_vote = False, content = False): """ Provides the descriptor content for... diff --git a/test/unit/descriptor/router_status_entry.py b/test/unit/descriptor/router_status_entry.py index 6816656..d971906 100644 --- a/test/unit/descriptor/router_status_entry.py +++ b/test/unit/descriptor/router_status_entry.py @@ -9,7 +9,7 @@ from stem.descriptor import Flag from stem.descriptor.router_status_entry import RouterStatusEntryV3, _decode_fingerprint from stem.version import Version from stem.exit_policy import MicrodescriptorExitPolicy -from test.mocking import get_router_status_entry_v3, ROUTER_STATUS_ENTRY_V3_HEADER +from test.mocking import get_router_status_entry_v2, get_router_status_entry_v3, get_router_status_entry_micro_v3, ROUTER_STATUS_ENTRY_V3_HEADER
class TestRouterStatusEntry(unittest.TestCase): def test_fingerprint_decoding(self): @@ -35,9 +35,29 @@ class TestRouterStatusEntry(unittest.TestCase): self.assertRaises(ValueError, _decode_fingerprint, arg, True) self.assertEqual(None, _decode_fingerprint(arg, False))
- def test_minimal(self): + def test_minimal_v2(self): """ - Parses a minimal router status entry. + Parses a minimal v2 router status entry. + """ + + entry = get_router_status_entry_v2() + + self.assertEqual(None, entry.document) + self.assertEqual("caerSidi", entry.nickname) + self.assertEqual("A7569A83B5706AB1B1A9CB52EFF7D2D32E4553EB", entry.fingerprint) + self.assertEqual("oQZFLYe9e4A7bOkWKR7TaNxb0JE", entry.digest) + self.assertEqual(datetime.datetime(2012, 8, 6, 11, 19, 31), entry.published) + self.assertEqual("71.35.150.29", entry.address) + self.assertEqual(9001, entry.or_port) + self.assertEqual(None, entry.dir_port) + self.assertEqual(None, entry.flags) + self.assertEqual(None, entry.version_line) + self.assertEqual(None, entry.version) + self.assertEqual([], entry.get_unrecognized_lines()) + + def test_minimal_v3(self): + """ + Parses a minimal v3 router status entry. """
entry = get_router_status_entry_v3() @@ -61,6 +81,27 @@ class TestRouterStatusEntry(unittest.TestCase): self.assertEqual(None, entry.microdescriptor_hashes) self.assertEqual([], entry.get_unrecognized_lines())
+ def test_minimal_micro_v3(self): + """ + Parses a minimal microdescriptor v3 router status entry. + """ + + entry = get_router_status_entry_micro_v3() + + expected_flags = set([Flag.FAST, Flag.GUARD, Flag.HSDIR, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.V2DIR, Flag.VALID]) + self.assertEqual(None, entry.document) + self.assertEqual("Konata", entry.nickname) + self.assertEqual("011209176CDBAA2AC1F48C2C5B4990CE771C5B0C", entry.fingerprint) + self.assertEqual(datetime.datetime(2012, 9, 24, 13, 40, 40), entry.published) + self.assertEqual("69.64.48.168", entry.address) + self.assertEqual(9001, entry.or_port) + self.assertEqual(9030, entry.dir_port) + self.assertEqual(expected_flags, set(entry.flags)) + self.assertEqual(None, entry.version_line) + self.assertEqual(None, entry.version) + self.assertEqual("aiUklwBrua82obG5AsTX+iEpkjQA2+AQHxZ7GwMfY70", entry.digest) + self.assertEqual([], entry.get_unrecognized_lines()) + def test_missing_fields(self): """ Parses a router status entry that's missing fields.