[tor-commits] [stem/master] Moving router status entry mocking into util
atagar at torproject.org
atagar at torproject.org
Sat Oct 13 18:35:45 UTC 2012
commit d1ed7c2f9be307d8968ba56fd1906fcd44c1ab25
Author: Damian Johnson <atagar at torproject.org>
Date: Thu Sep 27 09:40:06 2012 -0700
Moving router status entry mocking into util
---
test/mocking.py | 33 +++++++-
test/unit/descriptor/networkstatus/document.py | 12 ++--
test/unit/descriptor/networkstatus/entry.py | 98 +++++++----------------
3 files changed, 65 insertions(+), 78 deletions(-)
diff --git a/test/mocking.py b/test/mocking.py
index c867664..2dd3319 100644
--- a/test/mocking.py
+++ b/test/mocking.py
@@ -27,6 +27,7 @@ calling :func:`test.mocking.revert_mocking`.
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 - stem.descriptor.networkstatus.RouterStatusEntry
"""
import inspect
@@ -96,6 +97,11 @@ BRIDGE_EXTRAINFO_FOOTER = (
("router-digest", "006FD96BA35E7785A6A3B8B75FE2E2435A13BDB4"),
)
+ROUTER_STATUS_ENTRY_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"),
+)
+
def no_op():
def _no_op(*args): pass
return _no_op
@@ -399,7 +405,7 @@ def get_relay_server_descriptor(attr = None, exclude = (), content = False):
if content:
return desc_content
else:
- return stem.descriptor.server_descriptor.RelayDescriptor(desc_content, validate = False)
+ return stem.descriptor.server_descriptor.RelayDescriptor(desc_content, validate = True)
def get_bridge_server_descriptor(attr = None, exclude = (), content = False):
"""
@@ -418,7 +424,7 @@ def get_bridge_server_descriptor(attr = None, exclude = (), content = False):
if content:
return desc_content
else:
- return stem.descriptor.server_descriptor.BridgeDescriptor(desc_content, validate = False)
+ return stem.descriptor.server_descriptor.BridgeDescriptor(desc_content, validate = True)
def get_relay_extrainfo_descriptor(attr = None, exclude = (), content = False):
"""
@@ -437,7 +443,7 @@ def get_relay_extrainfo_descriptor(attr = None, exclude = (), content = False):
if content:
return desc_content
else:
- return stem.descriptor.extrainfo_descriptor.RelayExtraInfoDescriptor(desc_content, validate = False)
+ return stem.descriptor.extrainfo_descriptor.RelayExtraInfoDescriptor(desc_content, validate = True)
def get_bridge_extrainfo_descriptor(attr = None, exclude = (), content = False):
"""
@@ -456,5 +462,24 @@ def get_bridge_extrainfo_descriptor(attr = None, exclude = (), content = False):
if content:
return desc_content
else:
- return stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor(desc_content, validate = False)
+ return stem.descriptor.extrainfo_descriptor.BridgeExtraInfoDescriptor(desc_content, validate = True)
+
+def get_router_status_entry(attr = None, exclude = (), content = False):
+ """
+ Provides the descriptor content for...
+ stem.descriptor.networkstatus.RouterStatusEntry
+
+ :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: RouterStatusEntry for the requested descriptor content
+ """
+
+ desc_content = _get_descriptor_content(attr, exclude, ROUTER_STATUS_ENTRY_HEADER)
+
+ if content:
+ return desc_content
+ else:
+ return stem.descriptor.networkstatus.RouterStatusEntry(desc_content, validate = True)
diff --git a/test/unit/descriptor/networkstatus/document.py b/test/unit/descriptor/networkstatus/document.py
index 42d2842..80fe6f2 100644
--- a/test/unit/descriptor/networkstatus/document.py
+++ b/test/unit/descriptor/networkstatus/document.py
@@ -9,7 +9,7 @@ import StringIO
import stem.version
from stem.descriptor import Flag
from stem.descriptor.networkstatus import HEADER_STATUS_DOCUMENT_FIELDS, FOOTER_STATUS_DOCUMENT_FIELDS, DEFAULT_PARAMS, BANDWIDTH_WEIGHT_ENTRIES, RouterStatusEntry, NetworkStatusDocument, DocumentSignature, parse_file
-from test.unit.descriptor.networkstatus.entry import get_router_status_entry
+from test.mocking import get_router_status_entry
sig_block = """\
-----BEGIN SIGNATURE-----
@@ -168,8 +168,8 @@ class TestNetworkStatusDocument(unittest.TestCase):
Try parsing a document via the parse_file() function.
"""
- entry1 = RouterStatusEntry(get_router_status_entry({'s': "Fast"}))
- entry2 = RouterStatusEntry(get_router_status_entry({'s': "Valid"}))
+ entry1 = get_router_status_entry({'s': "Fast"})
+ entry2 = get_router_status_entry({'s': "Valid"})
content = get_network_status_document(routers = (entry1, entry2))
# the document that the entries refer to should actually be the minimal
@@ -719,8 +719,8 @@ class TestNetworkStatusDocument(unittest.TestCase):
document.
"""
- entry1 = RouterStatusEntry(get_router_status_entry({'s': "Fast"}))
- entry2 = RouterStatusEntry(get_router_status_entry({'s': "Valid"}))
+ entry1 = get_router_status_entry({'s': "Fast"})
+ entry2 = get_router_status_entry({'s': "Valid"})
content = get_network_status_document(routers = (entry1, entry2))
document = NetworkStatusDocument(content)
@@ -728,7 +728,7 @@ class TestNetworkStatusDocument(unittest.TestCase):
# try with an invalid RouterStatusEntry
- entry3 = RouterStatusEntry(get_router_status_entry({'r': "ugabuga"}), False)
+ entry3 = RouterStatusEntry(get_router_status_entry({'r': "ugabuga"}, content = True), False)
content = get_network_status_document(routers = (entry3,))
self.assertRaises(ValueError, NetworkStatusDocument, content)
diff --git a/test/unit/descriptor/networkstatus/entry.py b/test/unit/descriptor/networkstatus/entry.py
index 6380c62..a0ece4d 100644
--- a/test/unit/descriptor/networkstatus/entry.py
+++ b/test/unit/descriptor/networkstatus/entry.py
@@ -9,40 +9,7 @@ from stem.descriptor import Flag
from stem.descriptor.networkstatus import RouterStatusEntry, _decode_fingerprint
from stem.version import Version
from stem.exit_policy import MicrodescriptorExitPolicy
-
-ROUTER_STATUS_ENTRY_ATTR = (
- ("r", "caerSidi p1aag7VwarGxqctS7/fS0y5FU+s oQZFLYe9e4A7bOkWKR7TaNxb0JE 2012-08-06 11:19:31 71.35.150.29 9001 0"),
- ("s", "Fast Named Running Stable Valid"),
-)
-
-def get_router_status_entry(attr = None, exclude = None):
- """
- Constructs a minimal router status entry with the given attributes.
-
- :param dict attr: keyword/value mappings to be included in the entry
- :param list exclude: mandatory keywords to exclude from the entry
-
- :returns: str with customized router status entry content
- """
-
- descriptor_lines = []
- if attr is None: attr = {}
- if exclude is None: exclude = []
- attr = dict(attr) # shallow copy since we're destructive
-
- for keyword, value in ROUTER_STATUS_ENTRY_ATTR:
- if keyword in exclude: continue
- elif keyword in attr:
- value = attr[keyword]
- del attr[keyword]
-
- descriptor_lines.append("%s %s" % (keyword, value))
-
- # dump in any unused attributes
- for attr_keyword, attr_value in attr.items():
- descriptor_lines.append("%s %s" % (attr_keyword, attr_value))
-
- return "\n".join(descriptor_lines)
+from test.mocking import get_router_status_entry, ROUTER_STATUS_ENTRY_HEADER
class TestRouterStatusEntry(unittest.TestCase):
def test_fingerprint_decoding(self):
@@ -73,7 +40,7 @@ class TestRouterStatusEntry(unittest.TestCase):
Parses a minimal router status entry.
"""
- entry = RouterStatusEntry(get_router_status_entry())
+ entry = get_router_status_entry()
expected_flags = set([Flag.FAST, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.VALID])
self.assertEqual(None, entry.document)
@@ -99,13 +66,13 @@ class TestRouterStatusEntry(unittest.TestCase):
Parses a router status entry that's missing fields.
"""
- content = get_router_status_entry(exclude = ('r', 's'))
+ content = get_router_status_entry(exclude = ('r', 's'), content = True)
self._expect_invalid_attr(content, "address")
- content = get_router_status_entry(exclude = ('r',))
+ content = get_router_status_entry(exclude = ('r',), content = True)
self._expect_invalid_attr(content, "address")
- content = get_router_status_entry(exclude = ('s',))
+ content = get_router_status_entry(exclude = ('s',), content = True)
self._expect_invalid_attr(content, "flags")
def test_unrecognized_lines(self):
@@ -113,8 +80,7 @@ class TestRouterStatusEntry(unittest.TestCase):
Parses a router status entry with new keywords.
"""
- content = get_router_status_entry({'z': 'New tor feature: sparkly unicorns!'})
- entry = RouterStatusEntry(content)
+ entry = get_router_status_entry({'z': 'New tor feature: sparkly unicorns!'})
self.assertEquals(['z New tor feature: sparkly unicorns!'], entry.get_unrecognized_lines())
def test_proceeding_line(self):
@@ -122,7 +88,7 @@ class TestRouterStatusEntry(unittest.TestCase):
Includes content prior to the 'r' line.
"""
- content = 'z some stuff\n' + get_router_status_entry()
+ content = 'z some stuff\n' + get_router_status_entry(content = True)
self._expect_invalid_attr(content, "_unrecognized_lines", ['z some stuff'])
def test_blank_lines(self):
@@ -130,7 +96,7 @@ class TestRouterStatusEntry(unittest.TestCase):
Includes blank lines, which should be ignored.
"""
- content = get_router_status_entry() + "\n\nv Tor 0.2.2.35\n\n"
+ content = get_router_status_entry(content = True) + "\n\nv Tor 0.2.2.35\n\n"
entry = RouterStatusEntry(content)
self.assertEqual("Tor 0.2.2.35", entry.version_line)
@@ -155,7 +121,7 @@ class TestRouterStatusEntry(unittest.TestCase):
test_components.remove(value)
r_line = ' '.join(test_components)
- content = get_router_status_entry({'r': r_line})
+ content = get_router_status_entry({'r': r_line}, content = True)
self._expect_invalid_attr(content, attr)
def test_malformed_nickname(self):
@@ -170,8 +136,8 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for value in test_values:
- r_line = ROUTER_STATUS_ENTRY_ATTR[0][1].replace("caerSidi", value)
- content = get_router_status_entry({'r': r_line})
+ r_line = ROUTER_STATUS_ENTRY_HEADER[0][1].replace("caerSidi", value)
+ content = get_router_status_entry({'r': r_line}, content = True)
# TODO: Initial whitespace is consumed as part of the keyword/value
# divider. This is a bug in the case of V3 router status entries, but
@@ -199,8 +165,8 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for value in test_values:
- r_line = ROUTER_STATUS_ENTRY_ATTR[0][1].replace("p1aag7VwarGxqctS7/fS0y5FU+s", value)
- content = get_router_status_entry({'r': r_line})
+ r_line = ROUTER_STATUS_ENTRY_HEADER[0][1].replace("p1aag7VwarGxqctS7/fS0y5FU+s", value)
+ content = get_router_status_entry({'r': r_line}, content = True)
self._expect_invalid_attr(content, "fingerprint")
def test_malformed_published_date(self):
@@ -225,8 +191,8 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for value in test_values:
- r_line = ROUTER_STATUS_ENTRY_ATTR[0][1].replace("2012-08-06 11:19:31", value)
- content = get_router_status_entry({'r': r_line})
+ r_line = ROUTER_STATUS_ENTRY_HEADER[0][1].replace("2012-08-06 11:19:31", value)
+ content = get_router_status_entry({'r': r_line}, content = True)
self._expect_invalid_attr(content, "published")
def test_malformed_address(self):
@@ -243,8 +209,8 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for value in test_values:
- r_line = ROUTER_STATUS_ENTRY_ATTR[0][1].replace("71.35.150.29", value)
- content = get_router_status_entry({'r': r_line})
+ r_line = ROUTER_STATUS_ENTRY_HEADER[0][1].replace("71.35.150.29", value)
+ content = get_router_status_entry({'r': r_line}, content = True)
self._expect_invalid_attr(content, "address", value)
def test_malformed_port(self):
@@ -265,7 +231,7 @@ class TestRouterStatusEntry(unittest.TestCase):
if not include_or_port and not include_dir_port:
continue
- r_line = ROUTER_STATUS_ENTRY_ATTR[0][1]
+ r_line = ROUTER_STATUS_ENTRY_HEADER[0][1]
if include_or_port:
r_line = r_line.replace(" 9001 ", " %s " % value)
@@ -276,7 +242,7 @@ class TestRouterStatusEntry(unittest.TestCase):
attr = "or_port" if include_or_port else "dir_port"
expected = int(value) if value.isdigit() else None
- content = get_router_status_entry({'r': r_line})
+ content = get_router_status_entry({'r': r_line}, content = True)
self._expect_invalid_attr(content, attr, expected)
def test_flags(self):
@@ -292,8 +258,7 @@ class TestRouterStatusEntry(unittest.TestCase):
}
for s_line, expected in test_values.items():
- content = get_router_status_entry({'s': s_line})
- entry = RouterStatusEntry(content)
+ entry = get_router_status_entry({'s': s_line})
self.assertEquals(expected, entry.flags)
# tries some invalid inputs
@@ -304,7 +269,7 @@ class TestRouterStatusEntry(unittest.TestCase):
}
for s_line, expected in test_values.items():
- content = get_router_status_entry({'s': s_line})
+ content = get_router_status_entry({'s': s_line}, content = True)
self._expect_invalid_attr(content, "flags", expected)
def test_versions(self):
@@ -320,13 +285,12 @@ class TestRouterStatusEntry(unittest.TestCase):
}
for v_line, expected in test_values.items():
- content = get_router_status_entry({'v': v_line})
- entry = RouterStatusEntry(content)
+ entry = get_router_status_entry({'v': v_line})
self.assertEquals(expected, entry.version)
self.assertEquals(v_line, entry.version_line)
# tries an invalid input
- content = get_router_status_entry({'v': "Tor ugabuga"})
+ content = get_router_status_entry({'v': "Tor ugabuga"}, content = True)
self._expect_invalid_attr(content, "version")
def test_bandwidth(self):
@@ -342,8 +306,7 @@ class TestRouterStatusEntry(unittest.TestCase):
}
for w_line, expected in test_values.items():
- content = get_router_status_entry({'w': w_line})
- entry = RouterStatusEntry(content)
+ entry = get_router_status_entry({'w': w_line})
self.assertEquals(expected[0], entry.bandwidth)
self.assertEquals(expected[1], entry.measured)
self.assertEquals(expected[2], entry.unrecognized_bandwidth_entries)
@@ -363,7 +326,7 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for w_line in test_values:
- content = get_router_status_entry({'w': w_line})
+ content = get_router_status_entry({'w': w_line}, content = True)
self._expect_invalid_attr(content)
def test_exit_policy(self):
@@ -377,8 +340,7 @@ class TestRouterStatusEntry(unittest.TestCase):
}
for p_line, expected in test_values.items():
- content = get_router_status_entry({'p': p_line})
- entry = RouterStatusEntry(content)
+ entry = get_router_status_entry({'p': p_line})
self.assertEquals(expected, entry.exit_policy)
# tries some invalid inputs
@@ -390,7 +352,7 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for p_line in test_values:
- content = get_router_status_entry({'p': p_line})
+ content = get_router_status_entry({'p': p_line}, content = True)
self._expect_invalid_attr(content, "exit_policy")
def test_microdescriptor_hashes(self):
@@ -413,12 +375,12 @@ class TestRouterStatusEntry(unittest.TestCase):
mock_document.__dict__["is_consensus"] = False
for m_line, expected in test_values.items():
- content = get_router_status_entry({'m': m_line})
+ content = get_router_status_entry({'m': m_line}, content = True)
entry = RouterStatusEntry(content, document = mock_document)
self.assertEquals(expected, entry.microdescriptor_hashes)
# try without a document
- content = get_router_status_entry({'m': "8,9,10,11,12"})
+ content = get_router_status_entry({'m': "8,9,10,11,12"}, content = True)
self._expect_invalid_attr(content, "microdescriptor_hashes")
# tries some invalid inputs
@@ -429,7 +391,7 @@ class TestRouterStatusEntry(unittest.TestCase):
)
for m_line in test_values:
- content = get_router_status_entry({'m': m_line})
+ content = get_router_status_entry({'m': m_line}, content = True)
self.assertRaises(ValueError, RouterStatusEntry, content, True, mock_document)
def _expect_invalid_attr(self, content, attr = None, expected_value = None):
More information about the tor-commits
mailing list