[tor-commits] [stem/master] Unit test for minimal RouterStatusEntry

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


commit be0c484de0be3cfa98a32c9ef5210b3e1d6eb6ee
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Aug 20 22:53:17 2012 -0700

    Unit test for minimal RouterStatusEntry
    
    As usual, starting the class unit testing by parsing a minimal example. Next
    gonna go through field by field to exercise interesting use cases.
---
 stem/descriptor/networkstatus.py       |   16 ++++----
 test/integ/descriptor/networkstatus.py |    8 ++--
 test/unit/descriptor/networkstatus.py  |   72 +++++++++++++++++++++++++++++--
 3 files changed, 79 insertions(+), 17 deletions(-)

diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py
index 5382c0f..96f10ce 100644
--- a/stem/descriptor/networkstatus.py
+++ b/stem/descriptor/networkstatus.py
@@ -441,7 +441,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
   :var str nickname: **\*** router's nickname
   :var str fingerprint: **\*** router's fingerprint
   :var str digest: **\*** router's digest
-  :var datetime publication: **\*** router's publication
+  :var datetime published: **\*** router's publication
   :var str address: **\*** router's IP address
   :var int or_port: **\*** router's ORPort
   :var int dir_port: **\*** router's DirPort
@@ -479,7 +479,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
     self.nickname = None
     self.fingerprint = None
     self.digest = None
-    self.publication = None
+    self.published = None
     self.address = None
     self.or_port = None
     self.dir_port = None
@@ -495,7 +495,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
     
     self.exit_policy = None
     self.microdescriptor_hashes = None
-    self.unrecognized_lines = []
+    self._unrecognized_lines = []
     
     self._parse(raw_contents, validate)
   
@@ -556,7 +556,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
         
         try:
           published = "%s %s" % (r_comp[3], r_comp[4])
-          self.publication = datetime.datetime.strptime(published, "%Y-%m-%d %H:%M:%S")
+          self.published = datetime.datetime.strptime(published, "%Y-%m-%d %H:%M:%S")
         except ValueError:
           if validate:
             raise ValueError("Publication time time wasn't parseable: %s" % line)
@@ -655,7 +655,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
         
         self.microdescriptor_hashes.append((methods, hashes))
       else:
-        self.unrecognized_lines.append(line)
+        self._unrecognized_lines.append(line)
   
   def get_unrecognized_lines(self):
     """
@@ -664,7 +664,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
     :returns: list of unrecognized lines
     """
     
-    return self.unrecognized_lines
+    return list(self._unrecognized_lines)
 
 class MicrodescriptorConsensus(NetworkStatusDocument):
   """
@@ -706,7 +706,7 @@ class RouterMicrodescriptor(RouterStatusEntry):
   
   :var str nickname: **\*** router's nickname
   :var str fingerprint: **\*** router's fingerprint
-  :var datetime publication: **\*** router's publication
+  :var datetime published: **\*** router's publication
   :var str ip: **\*** router's IP address
   :var int or_port: **\*** router's ORPort
   :var int dir_port: **\*** router's DirPort
@@ -758,7 +758,7 @@ class RouterMicrodescriptor(RouterStatusEntry):
       seen_keywords.add("r")
       values = r.split(" ")
       self.nickname, self.fingerprint = values[0], _decode_fingerprint(values[1], validate)
-      self.publication = _strptime(" ".join((values[2], values[3])), validate)
+      self.published = _strptime(" ".join((values[2], values[3])), validate)
       self.ip, self.or_port, self.dir_port = values[4], int(values[5]), int(values[6])
       if self.dir_port == 0: self.dir_port = None
     elif validate: raise ValueError("Invalid router descriptor: empty 'r' line")
diff --git a/test/integ/descriptor/networkstatus.py b/test/integ/descriptor/networkstatus.py
index 4c626e9..c21b4a2 100644
--- a/test/integ/descriptor/networkstatus.py
+++ b/test/integ/descriptor/networkstatus.py
@@ -68,7 +68,7 @@ class TestNetworkStatus(unittest.TestCase):
       self.assertEquals("sumkledi", router.nickname)
       self.assertEquals("0013D22389CD50D0B784A3E4061CB31E8CE8CEB5", router.fingerprint)
       self.assertEquals("8mCr8Sl7RF4ENU4jb0FZFA/3do8", router.digest)
-      self.assertEquals(_strptime("2012-07-12 04:01:55"), router.publication)
+      self.assertEquals(_strptime("2012-07-12 04:01:55"), router.published)
       self.assertEquals("178.218.213.229", router.address)
       self.assertEquals(80, router.or_port)
       self.assertEquals(None, router.dir_port)
@@ -113,7 +113,7 @@ class TestNetworkStatus(unittest.TestCase):
     self.assertEquals("sumkledi", router1.nickname)
     self.assertEquals("0013D22389CD50D0B784A3E4061CB31E8CE8CEB5", router1.fingerprint)
     self.assertEquals("8mCr8Sl7RF4ENU4jb0FZFA/3do8", router1.digest)
-    self.assertEquals(_strptime("2012-07-12 04:01:55"), router1.publication)
+    self.assertEquals(_strptime("2012-07-12 04:01:55"), router1.published)
     self.assertEquals("178.218.213.229", router1.address)
     self.assertEquals(80, router1.or_port)
     self.assertEquals(None, router1.dir_port)
@@ -161,7 +161,7 @@ I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY=
       self.assertEquals("sumkledi", router.nickname)
       self.assertEquals("0013D22389CD50D0B784A3E4061CB31E8CE8CEB5", router.fingerprint)
       self.assertEquals("B5n4BiALAF8B5AqafxohyYiuj7E", router.digest)
-      self.assertEquals(_strptime("2012-07-11 04:22:53"), router.publication)
+      self.assertEquals(_strptime("2012-07-11 04:22:53"), router.published)
       self.assertEquals("178.218.213.229", router.address)
       self.assertEquals(80, router.or_port)
       self.assertEquals(None, router.dir_port)
@@ -198,7 +198,7 @@ I/TJmV928na7RLZe2mGHCAW3VQOvV+QkCfj05VZ8CsY=
     self.assertEquals("sumkledi", router1.nickname)
     self.assertEquals("0013D22389CD50D0B784A3E4061CB31E8CE8CEB5", router1.fingerprint)
     self.assertEquals("B5n4BiALAF8B5AqafxohyYiuj7E", router1.digest)
-    self.assertEquals(_strptime("2012-07-11 04:22:53"), router1.publication)
+    self.assertEquals(_strptime("2012-07-11 04:22:53"), router1.published)
     self.assertEquals("178.218.213.229", router1.address)
     self.assertEquals(80, router1.or_port)
     self.assertEquals(None, router1.dir_port)
diff --git a/test/unit/descriptor/networkstatus.py b/test/unit/descriptor/networkstatus.py
index f14c2be..e6a8514 100644
--- a/test/unit/descriptor/networkstatus.py
+++ b/test/unit/descriptor/networkstatus.py
@@ -2,9 +2,44 @@
 Unit tests for stem.descriptor.networkstatus.
 """
 
+import datetime
 import unittest
 
-from stem.descriptor import networkstatus
+from stem.descriptor.networkstatus import Flag, RouterStatusEntry, _decode_fingerprint
+
+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)
 
 class TestNetworkStatus(unittest.TestCase):
   def test_fingerprint_decoding(self):
@@ -23,9 +58,36 @@ class TestNetworkStatus(unittest.TestCase):
     }
     
     for arg, expected in test_values.items():
-      self.assertEqual(expected, networkstatus._decode_fingerprint(arg))
+      self.assertEqual(expected, _decode_fingerprint(arg, True))
+    
+    # checks with some malformed inputs
+    for arg in ('', '20wYcb', '20wYcb' * 30):
+      self.assertRaises(ValueError, _decode_fingerprint, arg, True)
+      self.assertEqual(None, _decode_fingerprint(arg, False))
+  
+  def test_rse_minimal(self):
+    """
+    Parses a minimal router status entry.
+    """
+    
+    entry = RouterStatusEntry(get_router_status_entry(), None)
     
-    self.assertRaises(ValueError, networkstatus._decode_fingerprint, '')
-    self.assertRaises(ValueError, networkstatus._decode_fingerprint, '20wYcb')
-    self.assertRaises(ValueError, networkstatus._decode_fingerprint, '20wYcb' * 30)
+    expected_flags = set([Flag.FAST, Flag.NAMED, Flag.RUNNING, Flag.STABLE, Flag.VALID])
+    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(expected_flags, set(entry.flags))
+    self.assertEqual(None, entry.version_line)
+    self.assertEqual(None, entry.version)
+    self.assertEqual(None, entry.bandwidth)
+    self.assertEqual(None, entry.measured)
+    self.assertEqual([], entry.unrecognized_bandwidth_entries)
+    self.assertEqual(None, entry.exit_policy)
+    self.assertEqual(None, entry.microdescriptor_hashes)
+    self.assertEqual([], entry.get_unrecognized_lines())
 





More information about the tor-commits mailing list