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

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


commit c1e88e4257c606593ecd2abf4212cc5266b34bf4
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Dec 2 18:24:54 2012 -0800

    Support for NEWCONSENSUS events
    
    Implementation and testing for NEWCONSENSUS events. This is pretty much the
    exact same thing from our perspective as NS events.
---
 stem/response/events.py      |   24 ++++++++++++++++++++++++
 test/unit/response/events.py |   29 +++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/stem/response/events.py b/stem/response/events.py
index 49a8169..522f9cc 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -438,6 +438,29 @@ class NetworkStatusEvent(Event):
       entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3,
     ))
 
+class NewConsensusEvent(Event):
+  """
+  Event for when we have a new consensus. This is similar to
+  :class:`~stem.response.events.NetworkStatusEvent`, except that it contains
+  the whole consensus so anything not listed is implicitly no longer
+  recommended.
+  
+  This was introduced in tor version 0.2.1.13.
+  
+  :param list desc: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the changed descriptors
+  """
+  
+  _SKIP_PARSING = True
+  
+  def _parse(self):
+    content = str(self).lstrip("NEWCONSENSUS\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.
@@ -644,6 +667,7 @@ EVENT_TYPE_TO_CLASS = {
   "ERR": LogEvent,
   "GUARD": GuardEvent,
   "INFO": LogEvent,
+  "NEWCONSENSUS": NewConsensusEvent,
   "NEWDESC": NewDescEvent,
   "NOTICE": LogEvent,
   "NS": NetworkStatusEvent,
diff --git a/test/unit/response/events.py b/test/unit/response/events.py
index 0b225d9..6f18676 100644
--- a/test/unit/response/events.py
+++ b/test/unit/response/events.py
@@ -54,6 +54,17 @@ GUARD_NEW = "650 GUARD ENTRY $36B5DBA788246E8369DBAF58577C6BC044A9A374 NEW"
 GUARD_GOOD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A GOOD"
 GUARD_BAD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A BAD"
 
+# NEWCONSENSUS event from v0.2.1.30.
+
+NEWCONSENSUS_EVENT = """650+NEWCONSENSUS
+r Beaver /96bKo4soysolMgKn5Hex2nyFSY pAJH9dSBp/CG6sPhhVY/5bLaVPM 2012-12-02 22:02:45 77.223.43.54 9001 0
+s Fast Named Running Stable Valid
+r Unnamed /+fJRWjmIGNAL2C5rRZHq3R91tA 7AnpZjfdBpYzXnMNm+w1bTsFF6Y 2012-12-02 17:51:10 91.121.184.87 9001 0
+s Fast Guard Running Stable Valid
+.
+650 OK
+"""
+
 # NS event from tor v0.2.1.30.
 
 NS_EVENT = """650+NS
@@ -405,6 +416,24 @@ class TestEvents(unittest.TestCase):
     self.assertEqual(NEWDESC_MULTIPLE.lstrip("650 "), str(event))
     self.assertEqual(expected_relays, event.relays)
   
+  def test_new_consensus_event(self):
+    expected_desc = []
+    
+    expected_desc.append(mocking.get_router_status_entry_v3({
+      "r": "Beaver /96bKo4soysolMgKn5Hex2nyFSY pAJH9dSBp/CG6sPhhVY/5bLaVPM 2012-12-02 22:02:45 77.223.43.54 9001 0",
+      "s": "Fast Named Running Stable Valid",
+    }))
+    
+    expected_desc.append(mocking.get_router_status_entry_v3({
+      "r": "Unnamed /+fJRWjmIGNAL2C5rRZHq3R91tA 7AnpZjfdBpYzXnMNm+w1bTsFF6Y 2012-12-02 17:51:10 91.121.184.87 9001 0",
+      "s": "Fast Guard Running Stable Valid",
+    }))
+    
+    event = _get_event(NEWCONSENSUS_EVENT)
+    
+    self.assertTrue(isinstance(event, stem.response.events.NewConsensusEvent))
+    self.assertEqual(expected_desc, event.desc)
+  
   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",





More information about the tor-commits mailing list