commit 2b4455c659dc4faf0b0085baeb63cf455583ac35 Author: Arturo Filastò art@fuffa.org Date: Sat Jan 12 21:29:35 2013 +0100
Test and implement TasksWithTimeout
Do some refactoring of the unittesting logic --- ooni/director.py | 8 ++-- ooni/managers.py | 6 +- ooni/tasks.py | 12 ++-- tests/test_managers.py | 135 ++++++++++++++++++------------------------------ 4 files changed, 64 insertions(+), 97 deletions(-)
diff --git a/ooni/director.py b/ooni/director.py index cf23269..0707664 100644 --- a/ooni/director.py +++ b/ooni/director.py @@ -1,4 +1,4 @@ -from ooni.managers import ReportingEntryManager, MeasurementsManager +from ooni.managers import ReportingEntryManager, MeasurementManager from ooni.nettest import NetTest
class Director(object): @@ -50,9 +50,9 @@ class Director(object):
self.netTests = []
- self.measurementsManager = MeasurementsManager(manager=self, + self.measurementManager = MeasurementManager(manager=self, netTests=self.netTests) - self.measurementsManager.director = self + self.measurementManager.director = self
self.reportEntryManager = ReportingEntryManager() self.reportEntryManager.director = self @@ -67,7 +67,7 @@ class Director(object): net_test = NetTest(net_test_file, inputs, options, report) net_test.director = self
- self.measurementsManager.schedule(net_test.generateMeasurements()) + self.measurementManager.schedule(net_test.generateMeasurements())
def measurementTimedOut(self, measurement): """ diff --git a/ooni/managers.py b/ooni/managers.py index be11473..cee6086 100644 --- a/ooni/managers.py +++ b/ooni/managers.py @@ -117,7 +117,7 @@ class TaskManager(object): def succeeded(self, result, task): raise NotImplemented
-class MeasurementsManager(TaskManager): +class MeasurementManager(TaskManager): """ This is the Measurement Tracker. In here we keep track of active measurements and issue new measurements once the active ones have been completed. @@ -137,10 +137,10 @@ class MeasurementsManager(TaskManager): director = None
def succeeded(self, result, measurement): - pass + self.director.measurementSucceeded(measurement)
def failed(self, failure, measurement): - pass + self.director.measurementFailed(failure, measurement)
class Report(object): reportEntryManager = None diff --git a/ooni/tasks.py b/ooni/tasks.py index a53287e..703aec3 100644 --- a/ooni/tasks.py +++ b/ooni/tasks.py @@ -1,4 +1,4 @@ -from twisted.internet import defer +from twisted.internet import defer, reactor
class BaseTask(object): _timer = None @@ -61,15 +61,15 @@ class TaskWithTimeout(BaseTask):
def _succeeded(self, result): self._cancelTimer() - BaseTask._succeeded(self, result) + return BaseTask._succeeded(self, result)
def _failed(self, failure): self._cancelTimer() - BaseTask._failed(self, failure) + return BaseTask._failed(self, failure)
- def _run(self): - d = BaseTask._run(self) + def start(self): self._timer = reactor.callLater(self.timeout, self._timedOut) + d = BaseTask.start(self) return d
def timedOut(self): @@ -121,7 +121,7 @@ class ReportEntry(TaskWithTimeout): def __init__(self, reporter, measurement): self.reporter = reporter self.measurement = measurement - TimedOutTask.__init__(self) + TaskWithTimeout.__init__(self)
def run(self): return self.reporter.writeReportEntry(self.measurement) diff --git a/tests/test_managers.py b/tests/test_managers.py index 59eba5f..a10933e 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -2,9 +2,8 @@ from twisted.trial import unittest from twisted.python import failure from twisted.internet import defer
-from ooni.tasks import BaseTask -from ooni.managers import TaskManager - +from ooni.tasks import BaseTask, TaskWithTimeout +from ooni.managers import TaskManager, MeasurementManager
mockFailure = failure.Failure(Exception('mock'))
@@ -23,15 +22,19 @@ class MockFailOnceTask(BaseTask): else: return defer.fail(mockFailure)
+class MockSuccessTaskWithTimeout(TaskWithTimeout): + def run(self): + return defer.succeed(42) + +class MockFailTaskWithTimeout(TaskWithTimeout): + def run(self): + return defer.fail(mockFailure) + class MockTaskManager(TaskManager): def __init__(self): self.successes = []
def failed(self, failure, task): - # print "TASK" - # print task - # print "FAILURES (%s)" % task.failures - # print failure pass
def succeeded(self, result, task): @@ -39,117 +42,81 @@ class MockTaskManager(TaskManager):
class TestTaskManager(unittest.TestCase): def setUp(self): - self.taskManager = MockTaskManager() - self.taskManager.concurrency = 10 - self.taskManager.retries = 2 - - self.taskManager.start() + self.measurementManager = MockTaskManager() + self.measurementManager.concurrency = 10 + self.measurementManager.retries = 2
- def tearDown(self): - pass - - def test_schedule_successful_one_task(self): - mock_task = MockSuccessTask() - self.taskManager.schedule(mock_task) - - @mock_task.done.addCallback - def done(res): - self.assertEqual(self.taskManager.successes, - [(42, mock_task)]) - return mock_task.done + self.measurementManager.start()
- def test_schedule_failing_one_task(self): - mock_task = MockFailTask() - self.taskManager.schedule(mock_task) - - @mock_task.done.addCallback - def done(failure): - self.assertEqual(len(self.taskManager.failures), 3) - - self.assertEqual(failure, (mockFailure, mock_task)) - - return mock_task.done - - def test_schedule_successful_ten_tasks(self): + def schedule_failing_tasks(self, task_type, number=1): all_done = [] - for x in range(10): - mock_task = MockSuccessTask() + for x in range(number): + mock_task = task_type() all_done.append(mock_task.done) - self.taskManager.schedule(mock_task) - - d = defer.DeferredList(all_done) - @d.addCallback - def done(res): - for task_result, task_instance in self.taskManager.successes: - self.assertEqual(task_result, 42) - self.assertIsInstance(task_instance, MockSuccessTask) - - return d - - def test_schedule_failing_ten_tasks(self): - all_done = [] - for x in range(10): - mock_task = MockFailTask() - all_done.append(mock_task.done) - self.taskManager.schedule(mock_task) + self.measurementManager.schedule(mock_task)
d = defer.DeferredList(all_done) @d.addCallback def done(res): # 10*2 because 2 is the number of retries - self.assertEqual(len(self.taskManager.failures), 10*3) - for task_result, task_instance in self.taskManager.failures: + self.assertEqual(len(self.measurementManager.failures), number*3) + for task_result, task_instance in self.measurementManager.failures: self.assertEqual(task_result, mockFailure) - self.assertIsInstance(task_instance, MockFailTask) + self.assertIsInstance(task_instance, task_type)
return d
- def test_schedule_successful_27_tasks(self): + def schedule_successful_tasks(self, task_type, number=1): all_done = [] - for x in range(27): - mock_task = MockSuccessTask() + for x in range(number): + mock_task = task_type() all_done.append(mock_task.done) - self.taskManager.schedule(mock_task) + self.measurementManager.schedule(mock_task)
d = defer.DeferredList(all_done) @d.addCallback def done(res): - for task_result, task_instance in self.taskManager.successes: + for task_result, task_instance in self.measurementManager.successes: self.assertEqual(task_result, 42) - self.assertIsInstance(task_instance, MockSuccessTask) + self.assertIsInstance(task_instance, task_type)
return d
- def test_schedule_failing_27_tasks(self): - all_done = [] - for x in range(27): - mock_task = MockFailTask() - all_done.append(mock_task.done) - self.taskManager.schedule(mock_task) + def test_schedule_successful_one_task(self): + return self.schedule_successful_tasks(MockSuccessTask)
- d = defer.DeferredList(all_done) - @d.addCallback - def done(res): - # 10*2 because 2 is the number of retries - self.assertEqual(len(self.taskManager.failures), 27*3) - for task_result, task_instance in self.taskManager.failures: - self.assertEqual(task_result, mockFailure) - self.assertIsInstance(task_instance, MockFailTask) + def test_schedule_successful_one_task_with_timeout(self): + return self.schedule_successful_tasks(MockSuccessTaskWithTimeout)
- return d + def test_schedule_failing_one_task(self): + return self.schedule_failing_tasks(MockFailTask) + + def test_schedule_failing_one_task_with_timeout(self): + return self.schedule_failing_tasks(MockFailTaskWithTimeout)
+ def test_schedule_successful_ten_tasks(self): + return self.schedule_successful_tasks(MockSuccessTask, number=10) + + def test_schedule_failing_ten_tasks(self): + return self.schedule_failing_tasks(MockFailTask, number=10) + + def test_schedule_successful_27_tasks(self): + return self.schedule_successful_tasks(MockSuccessTask, number=27) + + def test_schedule_failing_27_tasks(self): + return self.schedule_failing_tasks(MockFailTask, number=27)
def test_task_retry_and_succeed(self): mock_task = MockFailOnceTask() - self.taskManager.schedule(mock_task) + self.measurementManager.schedule(mock_task)
@mock_task.done.addCallback def done(res): - self.assertEqual(len(self.taskManager.failures), 1) + self.assertEqual(len(self.measurementManager.failures), 1)
- self.assertEqual(self.taskManager.failures, + self.assertEqual(self.measurementManager.failures, [(mockFailure, mock_task)]) - self.assertEqual(self.taskManager.successes, + self.assertEqual(self.measurementManager.successes, [(42, mock_task)])
return mock_task.done