commit b1d591c2cf90fe5bf70861cc289bc2b1ff5eb081 Author: Matt Traudt sirmatt@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) + + +@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()
tor-commits@lists.torproject.org