[tor-commits] [stem/master] Supporting 'Unmeasured' in router status entries

atagar at torproject.org atagar at torproject.org
Sat Mar 16 23:06:29 UTC 2013


commit a124b62f26c8ae1cee01f780a0383389275ee873
Author: Damian Johnson <atagar at torproject.org>
Date:   Sat Mar 16 10:12:57 2013 -0700

    Supporting 'Unmeasured' in router status entries
    
    Spec commit c3860e3 added a new 'Unmeasured' key/value entry to the 'w' lines
    of v3 router status entries.
---
 stem/descriptor/router_status_entry.py      |   18 +++++++++++++++---
 test/unit/descriptor/router_status_entry.py |   18 +++++++++++++-----
 2 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py
index 68c1b38..69b8fa2 100644
--- a/stem/descriptor/router_status_entry.py
+++ b/stem/descriptor/router_status_entry.py
@@ -307,6 +307,8 @@ class RouterStatusEntryV3(RouterStatusEntry):
 
   :var int bandwidth: bandwidth claimed by the relay (in kb/s)
   :var int measured: bandwidth measured to be available by the relay
+  :var bool is_unmeasured: bandwidth measurement isn't based on three or more
+    measurements
   :var list unrecognized_bandwidth_entries: **\*** bandwidth weighting
     information that isn't yet recognized
 
@@ -326,6 +328,7 @@ class RouterStatusEntryV3(RouterStatusEntry):
 
     self.bandwidth = None
     self.measured = None
+    self.is_unmeasured = False
     self.unrecognized_bandwidth_entries = []
 
     self.exit_policy = None
@@ -394,6 +397,8 @@ class RouterStatusEntryMicroV3(RouterStatusEntry):
 
   :var int bandwidth: bandwidth claimed by the relay (in kb/s)
   :var int measured: bandwidth measured to be available by the relay
+  :var bool is_unmeasured: bandwidth measurement isn't based on three or more
+    measurements
   :var list unrecognized_bandwidth_entries: **\*** bandwidth weighting
     information that isn't yet recognized
 
@@ -404,8 +409,10 @@ class RouterStatusEntryMicroV3(RouterStatusEntry):
   """
 
   def __init__(self, content, validate = True, document = None):
-    self.version_line = None
-    self.version = None
+    self.bandwidth = None
+    self.measured = None
+    self.is_unmeasured = False
+    self.unrecognized_bandwidth_entries = []
 
     self.digest = None
 
@@ -581,7 +588,7 @@ def _parse_v_line(desc, value, validate):
 
 
 def _parse_w_line(desc, value, validate):
-  # "w" "Bandwidth=" INT ["Measured=" INT]
+  # "w" "Bandwidth=" INT ["Measured=" INT] ["Unmeasured=1"]
   # example: w Bandwidth=7980
 
   w_comp = value.split(" ")
@@ -619,6 +626,11 @@ def _parse_w_line(desc, value, validate):
         raise ValueError("%s 'Measured=' entry needs to have a numeric value: w %s" % (desc._name(), value))
 
       desc.measured = int(w_value)
+    elif w_key == "Unmeasured":
+      if validate and w_value != "1":
+        raise ValueError("%s 'Unmeasured=' should only have the value of '1': w %s" % (desc._name(), value))
+
+      desc.is_unmeasured = True
     else:
       desc.unrecognized_bandwidth_entries.append(w_entry)
 
diff --git a/test/unit/descriptor/router_status_entry.py b/test/unit/descriptor/router_status_entry.py
index 23baaeb..b61f5e8 100644
--- a/test/unit/descriptor/router_status_entry.py
+++ b/test/unit/descriptor/router_status_entry.py
@@ -81,6 +81,7 @@ class TestRouterStatusEntry(unittest.TestCase):
     self.assertEqual(None, entry.version)
     self.assertEqual(None, entry.bandwidth)
     self.assertEqual(None, entry.measured)
+    self.assertEqual(False, entry.is_unmeasured)
     self.assertEqual([], entry.unrecognized_bandwidth_entries)
     self.assertEqual(None, entry.exit_policy)
     self.assertEqual([], entry.microdescriptor_hashes)
@@ -403,17 +404,19 @@ class TestRouterStatusEntry(unittest.TestCase):
     """
 
     test_values = {
-      "Bandwidth=0": (0, None, []),
-      "Bandwidth=63138": (63138, None, []),
-      "Bandwidth=11111 Measured=482": (11111, 482, []),
-      "Bandwidth=11111 Measured=482 Blarg!": (11111, 482, ["Blarg!"]),
+      "Bandwidth=0": (0, None, False, []),
+      "Bandwidth=63138": (63138, None, False, []),
+      "Bandwidth=11111 Measured=482": (11111, 482, False, []),
+      "Bandwidth=11111 Measured=482 Blarg!": (11111, 482, False, ["Blarg!"]),
+      "Bandwidth=11111 Measured=482 Unmeasured=1 Blarg!": (11111, 482, True, ["Blarg!"]),
     }
 
     for w_line, expected in test_values.items():
       entry = get_router_status_entry_v3({'w': w_line})
       self.assertEquals(expected[0], entry.bandwidth)
       self.assertEquals(expected[1], entry.measured)
-      self.assertEquals(expected[2], entry.unrecognized_bandwidth_entries)
+      self.assertEquals(expected[2], entry.is_unmeasured)
+      self.assertEquals(expected[3], entry.unrecognized_bandwidth_entries)
 
     # tries some invalid inputs
     test_values = (
@@ -427,6 +430,11 @@ class TestRouterStatusEntry(unittest.TestCase):
       "Bandwidth=10 Measured",
       "Bandwidth=10 Measured=",
       "Bandwidth=10 Measured=-50",
+      "Bandwidth=10 Measured=482 Unmeasured",
+      "Bandwidth=10 Measured=482 Unmeasured=",
+      "Bandwidth=10 Measured=482 Unmeasured=0",
+      "Bandwidth=10 Measured=482 Unmeasured=842",
+      "Bandwidth=10 Measured=482 Unmeasured=-5",
     )
 
     for w_line in test_values:





More information about the tor-commits mailing list