[tor-commits] [stem/master] Test and fix for the ExitPolicy's summary() method
atagar at torproject.org
atagar at torproject.org
Thu Jul 19 16:01:03 UTC 2012
commit c1ced39c89092a81dad3bd3d8ad3545296a64190
Author: Damian Johnson <atagar at torproject.org>
Date: Tue Jul 17 09:47:21 2012 -0700
Test and fix for the ExitPolicy's summary() method
Ok, I was being stupid. The performance issue for the summary() method was due
to an O(n) lookup when checking if we had seen a port (which made, for
instance, to full-port-range policies choke on a 65535^2 operation). Swapped
to using a set instead to make it constant time.
---
stem/exit_policy.py | 13 ++-----------
test/unit/exit_policy/policy.py | 16 ++++++++++++++++
2 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/stem/exit_policy.py b/stem/exit_policy.py
index 2d00553..8a5f528 100644
--- a/stem/exit_policy.py
+++ b/stem/exit_policy.py
@@ -179,16 +179,7 @@ class ExitPolicy(object):
# port's allow/reject policy, all further entries with that port are
# ignored since policies respect the first matching policy.
- # TODO: The following will be prohibitively expensive if someome has
- # policy entries that aren't a wildcard, but covers most ports. For
- # instance...
- #
- # accept 1025-65535 # just accepts non-privilaged ports
- #
- # On one hand handling ranges is a pita, but on the other this
- # implementation is naive. Patches welcome.
-
- display_ports, skip_ports = [], []
+ display_ports, skip_ports = [], set()
for rule in self._rules:
if not rule.is_address_wildcard(): continue
@@ -202,7 +193,7 @@ class ExitPolicy(object):
display_ports.append(port)
# all further entries with this port should be ignored
- skip_ports.append(port)
+ skip_ports.add(port)
# convert port list to a list of ranges (ie, ['1-3'] rather than [1, 2, 3])
if display_ports:
diff --git a/test/unit/exit_policy/policy.py b/test/unit/exit_policy/policy.py
index 97cad1a..5b7324e 100644
--- a/test/unit/exit_policy/policy.py
+++ b/test/unit/exit_policy/policy.py
@@ -88,6 +88,22 @@ class TestExitPolicy(unittest.TestCase):
policy = ExitPolicy(*rules)
self.assertEquals(expected_result, policy.is_exiting_allowed())
+ def test_summary_examples(self):
+ # checks the summary() method's pydoc examples
+
+ policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')
+ self.assertEquals("accept 80, 443", policy.summary())
+
+ policy = ExitPolicy('accept *:443', 'reject *:1-1024', 'accept *:*')
+ self.assertEquals("reject 1-442, 444-1024", policy.summary())
+
+ def test_summary_large_ranges(self):
+ # checks the summary() method when the policy includes very large port ranges
+
+ policy = ExitPolicy('reject *:80-65535', 'accept *:1-65533', 'reject *:*')
+ self.assertEquals("accept 1-79", policy.summary())
+
+
def test_microdesc_exit_parsing(self):
microdesc_exit_policy = stem.exit_policy.MicrodescriptorExitPolicy("accept 80,443")
More information about the tor-commits
mailing list