commit 78e09a971b7c242dc1d0a6b95718b78edd5cb32b Author: Damian Johnson atagar@torproject.org Date: Tue Oct 9 07:56:33 2012 -0700
Adding tests for the network status document examples
Including unit tests for the header pydoc examples to check that they're runnable. I also changed the first example to show that the consensus file doesn't need to remain open when using that method. --- stem/descriptor/networkstatus.py | 21 ++++++++-------- test/mocking.py | 4 +++ test/unit/descriptor/networkstatus/document.py | 30 +++++++++++++++++++++++- 3 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py index f6116c5..ae0f0c3 100644 --- a/stem/descriptor/networkstatus.py +++ b/stem/descriptor/networkstatus.py @@ -26,14 +26,15 @@ constructor. Router entries are assigned to its 'routers' attribute...
from stem.descriptor.networkstatus import NetworkStatusDocument
- with open('.tor/cached-consensus', 'r') as consensus_file: - # Reads the full consensus into memory twice (both for the parsed and - # unparsed contents). - - consensus = NetworkStatusDocument(consensus_file.read()) - - for router in consensus.routers: - print router.nickname + # Reads the full consensus into memory twice (both for the parsed and + # unparsed contents). + + consensus_file = open('.tor/cached-consensus', 'r') + consensus = NetworkStatusDocument(consensus_file.read()) + consensus_file.close() + + for router in consensus.routers: + print router.nickname
* :func:`stem.descriptor.parse_file`
@@ -378,7 +379,7 @@ class _DocumentHeader(object):
def _parse(self, entries, validate): for keyword, values in entries.items(): - value, block_contents = values[0] + value, _ = values[0] line = "%s %s" % (keyword, value)
# all known header fields can only appear once except @@ -798,7 +799,7 @@ class DirectoryAuthority(stem.descriptor.Descriptor): raise ValueError("Authority %s shouldn't have a '%s' line:\n%s" % (type_label, keyword, content))
for keyword, values in entries.items(): - value, block_contents = values[0] + value, _ = values[0] line = "%s %s" % (keyword, value)
# all known attributes can only appear at most once diff --git a/test/mocking.py b/test/mocking.py index 7c848ad..ae74166 100644 --- a/test/mocking.py +++ b/test/mocking.py @@ -10,6 +10,7 @@ calling :func:`test.mocking.revert_mocking`. revert_mocking - reverts any changes made by the mock function get_real_function - provides the non-mocked version of a function get_all_combinations - provides all combinations of attributes + support_with - makes object be compatable for use via the 'with' keyword
Mocking Functions no_op - does nothing @@ -216,10 +217,13 @@ def support_with(obj): does nothing.
:param object obj: object to support the 'with' keyword + + :returns: input object """
obj.__dict__["__enter__"] = return_value(obj) obj.__dict__["__exit__"] = no_op() + return obj
def mock(target, mock_call, target_module=None): """ diff --git a/test/unit/descriptor/networkstatus/document.py b/test/unit/descriptor/networkstatus/document.py index 8009fbb..246f7aa 100644 --- a/test/unit/descriptor/networkstatus/document.py +++ b/test/unit/descriptor/networkstatus/document.py @@ -2,6 +2,8 @@ Unit tests for the NetworkStatusDocument of stem.descriptor.networkstatus. """
+from __future__ import with_statement + import datetime import unittest import StringIO @@ -10,7 +12,7 @@ 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, DirectoryAuthority, NetworkStatusDocument, parse_file from stem.descriptor.router_status_entry import RouterStatusEntryV3, RouterStatusEntryMicroV3 -from test.mocking import get_router_status_entry_v3, get_router_status_entry_micro_v3, get_directory_authority, get_network_status_document, CRYPTO_BLOB, DOC_SIG +from test.mocking import support_with, get_router_status_entry_v3, get_router_status_entry_micro_v3, get_directory_authority, get_network_status_document, CRYPTO_BLOB, DOC_SIG
class TestNetworkStatusDocument(unittest.TestCase): def test_minimal_consensus(self): @@ -79,6 +81,32 @@ class TestNetworkStatusDocument(unittest.TestCase): self.assertEqual([DOC_SIG], document.signatures) self.assertEqual([], document.get_unrecognized_lines())
+ def test_examples(self): + """ + Run something similar to the examples in the header pydocs. + """ + + # makes a consensus with a couple routers, both with the same nickname + + entry1 = get_router_status_entry_v3({'s': "Fast"}) + entry2 = get_router_status_entry_v3({'s': "Valid"}) + content = get_network_status_document(routers = (entry1, entry2), content = True) + + # first example: parsing via the NetworkStatusDocument constructor + + consensus_file = StringIO.StringIO(content) + consensus = NetworkStatusDocument(consensus_file.read()) + consensus_file.close() + + for router in consensus.routers: + self.assertEqual('caerSidi', router.nickname) + + # second example: using parse_file + + with support_with(StringIO.StringIO(content)) as consensus_file: + for router in parse_file(consensus_file): + self.assertEqual('caerSidi', router.nickname) + def test_parse_file(self): """ Try parsing a document via the parse_file() function.
tor-commits@lists.torproject.org