[tor-commits] [stem/master] Support for the ADDRMAP event's CACHED flag

atagar at torproject.org atagar at torproject.org
Sat Apr 6 23:54:08 UTC 2013


commit 46d39df76cc51132c8e38c4fcbaabd45844e0c1c
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Apr 6 16:52:09 2013 -0700

    Support for the ADDRMAP event's CACHED flag
    
    Adding support for the new CACHED flag added by Desoxy...
    
    https://trac.torproject.org/8596
    https://gitweb.torproject.org/torspec.git/commitdiff/25b0d43a9ebe89541625e9f1a090e4a701748c76
---
 stem/response/events.py      |   11 +++++++++++
 test/unit/response/events.py |   29 +++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/stem/response/events.py b/stem/response/events.py
index 7ae4854..d9e3493 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -166,12 +166,15 @@ class AddrMapEvent(Event):
   :var datetime expiry: expiration time of the resolution in local time
   :var str error: error code if the resolution failed
   :var datetime utc_expiry: expiration time of the resolution in UTC
+  :var bool cached: **True** if the resolution will be kept until it expires,
+    **False** otherwise or **None** if undefined
   """
 
   _POSITIONAL_ARGS = ("hostname", "destination", "expiry")
   _KEYWORD_ARGS = {
     "error": "error",
     "EXPIRES": "utc_expiry",
+    "CACHED": "cached",
   }
   _OPTIONALLY_QUOTED = ("expiry")
 
@@ -191,6 +194,14 @@ class AddrMapEvent(Event):
     if self.utc_expiry is not None:
       self.utc_expiry = datetime.datetime.strptime(self.utc_expiry, "%Y-%m-%d %H:%M:%S")
 
+    if self.cached is not None:
+      if self.cached == "YES":
+        self.cached = True
+      elif self.cached == "NO":
+        self.cached = False
+      else:
+        raise stem.ProtocolError("An ADDRMAP event's CACHED mapping can only be 'YES' or 'NO': %s" % self)
+
 
 class AuthDirNewDescEvent(Event):
   """
diff --git a/test/unit/response/events.py b/test/unit/response/events.py
index 98e7f95..e41c80c 100644
--- a/test/unit/response/events.py
+++ b/test/unit/response/events.py
@@ -29,6 +29,17 @@ EXPIRES="2012-11-19 08:50:13"'
 ADDRMAP_BAD_2 = '650 ADDRMAP www.atagar.com 75.119.206.243 "2012-11-19 00:50:13 \
 EXPIRES="2012-11-19 08:50:13"'
 
+ADDRMAP_CACHED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:31:22" \
+EXPIRES="2013-04-03 20:31:22" \
+CACHED="YES"'
+
+ADDRMAP_NOT_CACHED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:29:11" \
+EXPIRES="2013-04-03 20:29:11" \
+CACHED="NO"'
+
+ADDRMAP_CACHED_MALFORMED = '650 ADDRMAP example.com 192.0.43.10 "2013-04-03 22:29:11" \
+CACHED="KINDA"'
+
 # BUILDTIMEOUT_SET event from tor 0.2.3.16.
 
 BUILD_TIMEOUT_EVENT = "650 BUILDTIMEOUT_SET COMPUTED \
@@ -401,11 +412,29 @@ class TestEvents(unittest.TestCase):
     self.assertEqual(datetime.datetime(2012, 11, 19, 0, 50, 13), event.expiry)
     self.assertEqual("yes", event.error)
     self.assertEqual(datetime.datetime(2012, 11, 19, 8, 50, 13), event.utc_expiry)
+    self.assertEqual(None, event.cached)
 
     # malformed content where quotes are missing
     self.assertRaises(ProtocolError, _get_event, ADDRMAP_BAD_1)
     self.assertRaises(ProtocolError, _get_event, ADDRMAP_BAD_2)
 
+    # check the CACHED flag
+
+    event = _get_event(ADDRMAP_CACHED)
+
+    self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent))
+    self.assertEqual("example.com", event.hostname)
+    self.assertEqual(True, event.cached)
+
+    event = _get_event(ADDRMAP_NOT_CACHED)
+
+    self.assertTrue(isinstance(event, stem.response.events.AddrMapEvent))
+    self.assertEqual("example.com", event.hostname)
+    self.assertEqual(False, event.cached)
+
+    # the CACHED argument should only allow YES or NO
+    self.assertRaises(ProtocolError, _get_event, ADDRMAP_CACHED_MALFORMED)
+
   def test_authdir_newdesc_event(self):
     # TODO: awaiting test data - https://trac.torproject.org/7534
 



More information about the tor-commits mailing list