[tor-commits] [ooni-probe/master] Refactor NetTestLoader and add checkOptions, and add Tor support

isis at torproject.org isis at torproject.org
Sun Mar 10 01:57:02 UTC 2013


commit 6254642808851599890c7219c1025a096b486b5c
Author: aagbsn <aagbsn at extc.org>
Date:   Wed Jan 16 22:36:58 2013 +0000

    Refactor NetTestLoader and add checkOptions, and add Tor support
---
 ooni/director.py |   25 ++++++++++++++++-----
 ooni/nettest.py  |   62 +++++++++++++++++++++++++++---------------------------
 ooni/oonicli.py  |   28 ++++++++++++++----------
 3 files changed, 66 insertions(+), 49 deletions(-)

diff --git a/ooni/director.py b/ooni/director.py
index 9a20491..2dc4e36 100644
--- a/ooni/director.py
+++ b/ooni/director.py
@@ -78,6 +78,22 @@ class Director(object):
 
         self.failures = []
 
+        self.torControlProtocol = None
+
+    def start(self):
+        if config.privacy.includepcap:
+            log.msg("Starting")
+            if not config.reports.pcap:
+                config.generatePcapFilename()
+            self.startSniffing()
+
+        if config.advanced.start_tor:
+            log.msg("Starting Tor...")
+            d = self.startTor()
+        else:
+            d = defer.succeed(None)
+        return d
+
     @property
     def measurementSuccessRatio(self):
         if self.totalMeasurements == 0:
@@ -154,7 +170,7 @@ class Director(object):
     def netTestDone(self, result, net_test):
         self.activeNetTests.remove(net_test)
 
-    def startNetTest(self, net_test_loader, options):
+    def startNetTest(self, _, net_test_loader):
         """
         Create the Report for the NetTest and start the report NetTest.
 
@@ -162,14 +178,11 @@ class Director(object):
             net_test_loader:
                 an instance of :class:ooni.nettest.NetTestLoader
 
-            options:
-                is a dict containing the options to be passed to the chosen net
-                test.
+            _: #XXX very dirty hack
         """
         report = Report(self.reporters, self.reportEntryManager)
 
-        net_test = NetTest(net_test_loader, options, report)
-        net_test.setUpNetTestCases()
+        net_test = NetTest(net_test_loader, report)
         net_test.director = self
 
         self.measurementManager.schedule(net_test.generateMeasurements())
diff --git a/ooni/nettest.py b/ooni/nettest.py
index 4aa013c..464d91a 100644
--- a/ooni/nettest.py
+++ b/ooni/nettest.py
@@ -20,7 +20,8 @@ class NoTestCasesFound(Exception):
 class NetTestLoader(object):
     method_prefix = 'test'
 
-    def __init__(self, net_test_file):
+    def __init__(self, net_test_file, net_test_args):
+        self.netTestArgs = net_test_args
         self.testCases = self.loadNetTest(net_test_file)
 
     @property
@@ -145,9 +146,33 @@ class NetTestLoader(object):
         test_class, _ = test_cases[0]
         self.testVersion = test_class.version
         self.testName = os.path.basename(net_test_file).strip('.py')
-
         return test_cases
 
+    def checkOptions(self):
+        """
+        Call processTest and processOptions methods of each NetTestCase
+        """
+        test_classes = set([])
+        for test_class, test_method in self.testCases:
+            test_classes.add(test_class)
+
+        for klass in test_classes:
+            options = self.usageOptions()
+            options.parseOptions(self.netTestArgs)
+            if options:
+                klass.localOptions = options
+
+            test_instance = klass()
+            if test_instance.requiresRoot:
+                checkForRoot()
+            test_instance._checkRequiredOptions()
+            test_instance._checkValidOptions()
+
+            inputs = test_instance.getInputProcessor()
+            if not inputs:
+                inputs = [None]
+            klass.inputs = inputs
+
     def _loadNetTestFromFileObject(self, net_test_string):
         """
         Load NetTest from a string
@@ -231,15 +256,12 @@ class NetTestState(object):
 class NetTest(object):
     director = None
 
-    def __init__(self, net_test_loader, options, report):
+    def __init__(self, net_test_loader, report):
         """
-        net_test_file:
-            is a file object containing the test to be run.
-
-        options:
-            is a dict containing the options to be passed to the net test.
+        net_test_loader:
+             an instance of :class:ooni.nettest.NetTestLoader containing
+             the test to be run.
         """
-        self.options = options
         self.report = report
         self.testCases = net_test_loader.testCases
 
@@ -322,28 +344,6 @@ class NetTest(object):
 
         self.state.allTasksScheduled()
 
-    def setUpNetTestCases(self):
-        """
-        Call processTest and processOptions methods of each NetTestCase
-        """
-        test_classes = set([])
-        for test_class, test_method in self.testCases:
-            test_classes.add(test_class)
-
-        for klass in test_classes:
-            klass.localOptions = self.options
-
-            test_instance = klass()
-            if test_instance.requiresRoot:
-                checkForRoot()
-            test_instance._checkRequiredOptions()
-            test_instance._checkValidOptions()
-
-            inputs = test_instance.getInputProcessor()
-            if not inputs:
-                inputs = [None]
-            klass.inputs = inputs
-
 class NetTestCase(object):
     """
     This is the base of the OONI nettest universe. When you write a nettest
diff --git a/ooni/oonicli.py b/ooni/oonicli.py
index e307d35..78389f4 100644
--- a/ooni/oonicli.py
+++ b/ooni/oonicli.py
@@ -174,12 +174,18 @@ def runWithDirector():
 
     net_test_args = global_options.pop('subargs')
     net_test_file = global_options['test']
+    net_test_loader = NetTestLoader(net_test_file, net_test_args)
 
-    net_test_loader = NetTestLoader(net_test_file)
-    options = net_test_loader.usageOptions()
-    options.parseOptions(net_test_args)
-
-    net_test_options = dict(options)
+    try:
+        net_test_loader.checkOptions()
+    except MissingRequiredOption, option_name:
+        log.err('Missing required option: "%s"' % option_name)
+        print net_test_loader.usageOptions().getUsage()
+        sys.exit(2)
+    except usage.UsageError, e:
+        log.err(e)
+        print net_test_loader.usageOptions().getUsage()
+        sys.exit(2)
 
     # reporters = [YAMLReporter, OONIBReporter]
 
@@ -198,13 +204,11 @@ def runWithDirector():
             sys.exit(1)
 
     director = Director(reporters)
-    try:
-        d = director.startNetTest(net_test_loader, net_test_options)
-        d.addBoth(shutdown)
-        reactor.run()
-    except MissingRequiredOption, option_name:
-        log.err('Missing required option: "%s"' % option_name)
-        print options.getUsage()
+    d = director.start()
+
+    d.addCallback(director.startNetTest, net_test_loader)
+    d.addBoth(shutdown)
+    reactor.run()
 
 def run():
     """





More information about the tor-commits mailing list