[tor-commits] [sbws/master] Add integration test for RelayPrioritizer

pastly at torproject.org pastly at torproject.org
Tue Jun 26 15:36:50 UTC 2018


commit b1d591c2cf90fe5bf70861cc289bc2b1ff5eb081
Author: Matt Traudt <sirmatt at ksu.edu>
Date:   Thu Jun 21 21:13:48 2018 -0400

    Add integration test for RelayPrioritizer
---
 tests/integration/conftest.py                  |  4 +-
 tests/integration/lib/test_relayprioritizer.py | 91 ++++++++++++++++++++++++++
 2 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py
index e35341d..94b2433 100644
--- a/tests/integration/conftest.py
+++ b/tests/integration/conftest.py
@@ -4,6 +4,7 @@ from sbws.util.parser import create_parser
 from sbws.util.config import get_config
 from sbws.util.stem import launch_tor
 import sbws.core.init
+import os
 
 
 @pytest.fixture(scope='session')
@@ -14,13 +15,14 @@ def parser():
 @pytest.fixture(scope='session')
 def persistent_empty_dotsbws(parser):
     '''
-    Creates a ~/.sbws with nothing in it but a config.ini
+    Creates a ~/.sbws with nothing in it but a config.ini and a datadir/
     '''
     d = TemporaryDirectory()
     args = parser.parse_args(
         '-d {} --log-level DEBUG init'.format(d.name).split())
     conf = get_config(args)
     sbws.core.init.main(args, conf)
+    os.makedirs(os.path.join(d.name, 'datadir'))
     return d
 
 
diff --git a/tests/integration/lib/test_relayprioritizer.py b/tests/integration/lib/test_relayprioritizer.py
new file mode 100644
index 0000000..0267843
--- /dev/null
+++ b/tests/integration/lib/test_relayprioritizer.py
@@ -0,0 +1,91 @@
+from sbws.lib.resultdump import ResultDump
+from sbws.lib.resultdump import (Result, ResultSuccess, ResultErrorCircuit)
+from sbws.lib.relaylist import RelayList
+from sbws.lib.relayprioritizer import RelayPrioritizer
+from sbws.util.config import get_config
+from threading import Event
+from unittest.mock import patch
+
+
+def static_time(value):
+    while True:
+        yield value
+
+
+def get_global_stuff(dotsbws, cont, parser):
+    args = parser.parse_args(
+        '-d {} --log-level DEBUG'.format(dotsbws).split())
+    conf = get_config(args)
+    rl = RelayList(args, conf, cont)
+    return {
+        'args': args,
+        'conf': conf,
+        'rl': rl,
+        'end': Event(),
+    }
+
+
+def _build_result_for_relay(relay_nick, result_type, timestamp, rl):
+    relay = [r for r in rl.relays if r.nickname == relay_nick]
+    assert len(relay) == 1
+    relay = relay[0]
+    other = [r for r in rl.relays if r.nickname != relay_nick][0]
+    circ = [relay.fingerprint, other.fingerprint]
+    url = 'http://example.com/sbws.bin'
+    nick = 'sbws_scanner'
+    if result_type == ResultSuccess:
+        rtts = [0.5, 0.5, 0.5]
+        dls = [
+            {'amount': 1024, 'duration': 1},
+            {'amount': 1024, 'duration': 1},
+            {'amount': 1024, 'duration': 1},
+        ]
+        return ResultSuccess(rtts, dls, relay, circ, url, nick, t=timestamp)
+    elif result_type == ResultErrorCircuit:
+        return ResultErrorCircuit(
+            relay, circ, url, nick, msg='Test error circ message', t=timestamp)
+
+
+ at patch('time.time')
+def test_relayprioritizer_general(
+        time_mock, persistent_empty_dotsbws, parser, persistent_launch_tor):
+    now = 1000000
+    time_mock.side_effect = static_time(now)
+    cont = persistent_launch_tor
+    dotsbws = persistent_empty_dotsbws.name
+    d = get_global_stuff(dotsbws, cont, parser)
+    args = d['args']
+    conf = d['conf']
+    end_event = d['end']
+    rl = d['rl']
+    rd = ResultDump(args, conf, end_event)
+    try:
+        rp = RelayPrioritizer(args, conf, rl, rd)
+        results = [
+            _build_result_for_relay(
+                'relay1', ResultSuccess, now - 100, rl),
+            _build_result_for_relay(
+                'relay2', ResultSuccess, now - 200, rl),
+            _build_result_for_relay(
+                'relay3', ResultSuccess, now - 300, rl),
+            _build_result_for_relay(
+                'relay4', ResultSuccess, now - 400, rl),
+            _build_result_for_relay(
+                'relay5', ResultSuccess, now - 500, rl),
+        ]
+        for result in results:
+            rd.store_result(result)
+        best_list = [_ for _ in rp.best_priority()]
+        # Of the relays for which we have added results to the ResultDump,
+        # relay1 has the lowest priority (it has the most recent result) and
+        # relay5 has the highest prioirty. The relays that we didn't add
+        # results for will have the highest priority, but don't test the order
+        # of them. Skip to the end of the list and check those guys since they
+        # should have a defined order.
+        for i in range(1, 5+1):
+            nick = 'relay{}'.format(i)
+            pos = i * -1
+            relay = best_list[pos]
+            assert relay.nickname == nick
+    finally:
+        end_event.set()





More information about the tor-commits mailing list