[tor-commits] [stem/master] Support for NS events

atagar at torproject.org atagar at torproject.org
Mon Dec 3 02:35:44 UTC 2012


commit 92af0a5c0f9c6924cfddfb6388f581f3b6014732
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Dec 2 16:16:20 2012 -0800

    Support for NS events
    
    Implementation and testing for NS events. To get test data I wiped my
    cached_consensus, then listened for NS events while bootstraping. The first
    time I did this it provided a flood of entries (probably the whole consensus),
    but then when I restarted tor and tried again it just proved one.
---
 stem/control.py              |    1 +
 stem/response/events.py      |   22 ++++++++++++++++++++++
 test/unit/response/events.py |   20 ++++++++++++++++++++
 3 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/stem/control.py b/stem/control.py
index c2c014d..5fd69c7 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -89,6 +89,7 @@ providing its own for interacting at a higher level.
   **INFO**              :class:`stem.response.events.LogEvent`
   **NEWDESC**           :class:`stem.response.events.NewDescEvent`
   **NOTICE**            :class:`stem.response.events.LogEvent`
+  **NS**                :class:`stem.response.events.NetworkStatusEvent`
   **ORCONN**            :class:`stem.response.events.ORConnEvent`
   **STATUS_CLIENT**     :class:`stem.response.events.StatusEvent`
   **STATUS_GENERAL**    :class:`stem.response.events.StatusEvent`
diff --git a/stem/response/events.py b/stem/response/events.py
index bca9557..1bdfd02 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -1,9 +1,11 @@
 import re
 import datetime
+import StringIO
 
 import stem
 import stem.control
 import stem.response
+import stem.descriptor.router_status_entry
 
 from stem.util import connection, log, str_tools, tor_tools
 
@@ -360,6 +362,25 @@ class LogEvent(Event):
       log_id = "event.logging.unknown_runlevel.%s" % self.runlevel
       log.log_once(log_id, log.INFO, unrecognized_msg % ('runlevel', self.runlevel))
 
+class NetworkStatusEvent(Event):
+  """
+  Event for when our copy of the consensus has changed. This was introduced in
+  tor version 0.1.2.3.
+  
+  :param list desc: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the changed descriptors
+  """
+  
+  _SKIP_PARSING = True
+  
+  def _parse(self):
+    content = str(self).lstrip("NS\n")
+    
+    self.desc = list(stem.descriptor.router_status_entry.parse_file(
+      StringIO.StringIO(content),
+      True,
+      entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3,
+    ))
+
 class NewDescEvent(Event):
   """
   Event that indicates that a new descriptor is available.
@@ -567,6 +588,7 @@ EVENT_TYPE_TO_CLASS = {
   "INFO": LogEvent,
   "NEWDESC": NewDescEvent,
   "NOTICE": LogEvent,
+  "NS": NetworkStatusEvent,
   "ORCONN": ORConnEvent,
   "STATUS_CLIENT": StatusEvent,
   "STATUS_GENERAL": StatusEvent,
diff --git a/test/unit/response/events.py b/test/unit/response/events.py
index 2a64a27..84a1e7b 100644
--- a/test/unit/response/events.py
+++ b/test/unit/response/events.py
@@ -47,6 +47,15 @@ GUARD_NEW = "650 GUARD ENTRY $36B5DBA788246E8369DBAF58577C6BC044A9A374 NEW"
 GUARD_GOOD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A GOOD"
 GUARD_BAD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A BAD"
 
+# NS event from tor v0.2.1.30.
+
+NS_EVENT = """650+NS
+r whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030
+s Fast HSDir Named Stable V2Dir Valid
+.
+650 OK
+"""
+
 # STATUS_* events that I was able to easily trigger. Most came from starting
 # TBB, then listening while it bootstrapped.
 
@@ -380,6 +389,17 @@ class TestEvents(unittest.TestCase):
     self.assertEqual(NEWDESC_MULTIPLE.lstrip("650 "), str(event))
     self.assertEqual(expected_relays, event.relays)
   
+  def test_ns_event(self):
+    expected_desc = mocking.get_router_status_entry_v3({
+      "r": "whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030",
+      "s": "Fast HSDir Named Stable V2Dir Valid",
+    })
+    
+    event = _get_event(NS_EVENT)
+    
+    self.assertTrue(isinstance(event, stem.response.events.NetworkStatusEvent))
+    self.assertEqual([expected_desc], event.desc)
+  
   def test_orconn_event(self):
     event = _get_event(ORCONN_CONNECTED)
     





More information about the tor-commits mailing list