[tor-commits] [stem/master] Adding tests for the network status document examples

atagar at torproject.org atagar at torproject.org
Sat Oct 13 18:35:45 UTC 2012


commit 78e09a971b7c242dc1d0a6b95718b78edd5cb32b
Author: Damian Johnson <atagar at 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.





More information about the tor-commits mailing list