[tor-commits] [ooni-probe/master] * Fixed a stupid bug where only half the occurrences of a method

isis at torproject.org isis at torproject.org
Thu Nov 1 12:14:02 UTC 2012


commit a365349b8ff58233968e844e386ac67bcfda090d
Author: Isis Lovecruft <isis at torproject.org>
Date:   Thu Nov 1 11:32:25 2012 +0000

    * Fixed a stupid bug where only half the occurrences of a method
      were renamed.
---
 nettests/core/echo.py  |  205 +++++++++++++++++++++++++++++++++++++++++++++++
 nettests/simpletest.py |    1 -
 ooni/echo.py           |  206 ------------------------------------------------
 ooni/nettest.py        |   28 ++++---
 ooni/runner.py         |   25 +++---
 5 files changed, 236 insertions(+), 229 deletions(-)

diff --git a/nettests/core/echo.py b/nettests/core/echo.py
new file mode 100644
index 0000000..a0826b6
--- /dev/null
+++ b/nettests/core/echo.py
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+#  +---------+
+#  | echo.py |
+#  +---------+
+#     A simple ICMP-8 ping test.
+#
+# :author: Isis Lovecruft
+# :version: 0.0.1-pre-alpha
+# :license: (c) 2012 Isis Lovecruft
+#           see attached LICENCE file
+#
+
+import os
+import sys
+
+from pprint           import pprint
+
+from twisted.internet import reactor
+from twisted.plugin   import IPlugin
+from twisted.python   import usage
+from ooni.nettest     import TestCase
+from ooni.utils       import log, Storage
+from ooni.utils.net   import PermissionsError, IfaceError
+
+try:
+    from scapy.all             import sr1, IP, ICMP        ## XXX v4/v6?
+    from ooni.lib              import txscapy
+    from ooni.lib.txscapy      import txsr, txsend
+    from ooni.templates.scapyt import ScapyTest
+except:
+    log.msg("This test requires scapy, see www.secdev.org/projects/scapy")
+
+## xxx TODO: move these to a utility function for determining OSes
+LINUX=sys.platform.startswith("linux")
+OPENBSD=sys.platform.startswith("openbsd")
+FREEBSD=sys.platform.startswith("freebsd")
+NETBSD=sys.platform.startswith("netbsd")
+DARWIN=sys.platform.startswith("darwin")
+SOLARIS=sys.platform.startswith("sunos")
+WINDOWS=sys.platform.startswith("win32")
+
+class EchoTest(ScapyTest):
+    """
+    xxx fill me in
+    """
+    name         = 'echo'
+    author       = 'Isis Lovecruft <isis at torproject.org>'
+    description  = 'A simple ICMP-8 test to see if a host is reachable.'
+    version      = '0.0.1'
+    inputFile    = ['file', 'f', None, 'File of list of IPs to ping']
+    requirements = None
+    report       = Storage()
+
+    optParameters = [
+        ['interface', 'i', None, 'Network interface to use'],
+        ['count', 'c', 5, 'Number of packets to send', int],
+        ['size', 's', 56, 'Number of bytes to send in ICMP data field', int],
+        ['ttl', 'l', 25, 'Set the IP Time to Live', int],
+        ['timeout', 't', 2, 'Seconds until timeout if no response', int],
+        ['pcap', 'p', None, 'Save pcap to this file'],
+        ['receive', 'r', True, 'Receive response packets']
+        ]
+
+    def setUpClass(self, *a, **kw):
+        '''
+        :ivar ifaces:
+            Struct returned from getifaddrs(3) and turned into a tuple in the
+            form (*ifa_name, AF_FAMILY, *ifa_addr)
+        '''
+        super(EchoTest, self).__init__(*a, **kw)
+
+        ## allow subclasses which register/implement external classes
+        ## to define their own reactor without overrides:
+        if not hasattr(super(EchoTest, self), 'reactor'):
+            log.debug("%s test: Didn't find reactor!" % self.name)
+            self.reactor = reactor
+
+        if self.localOptions:
+            log.debug("%s localOptions found" % self.name)
+            log.debug("%s test options: %s" % (self.name, self.subOptions))
+            self.local_options = self.localOptions.parseOptions(self.subOptions)
+            for key, value in self.local_options:
+                log.debug("Set attribute %s[%s] = %s" % (self.name, key, value))
+                setattr(self, key, value)
+
+        ## xxx is this now .subOptions?
+        #self.inputFile = self.localOptions['file']
+        self.timeout *= 1000            ## convert to milliseconds
+
+        if not self.interface:
+            log.msg("No network interface specified!")
+            log.debug("OS detected: %s" % sys.platform)
+            if LINUX or OPENBSD or NETBSD or FREEBSD or DARWIN or SOLARIS:
+                from twisted.internet.test import _posixifaces
+                log.msg("Attempting to discover network interfaces...")
+                ifaces = _posixifaces._interfaces()
+            elif WINDOWS:
+                from twisted.internet.test import _win32ifaces
+                log.msg("Attempting to discover network interfaces...")
+                ifaces = _win32ifaces._interfaces()
+            else:
+                log.debug("Client OS %s not accounted for!" % sys.platform)
+                log.debug("Unable to discover network interfaces...")
+                ifaces = [('lo', '')]
+
+            ## found = {'eth0': '1.1.1.1'}
+            found = [{i[0]: i[2]} for i in ifaces if i[0] != 'lo']
+            log.info("Found interfaces:\n%s" % pprint(found))
+            self.interfaces = self.tryInterfaces(found)
+        else:
+            ## xxx need a way to check that iface exists, is up, and
+            ## we have permissions on it
+            log.debug("Our interface has been set to %s" % self.interface)
+
+        if self.pcap:
+            try:
+                self.pcapfile = open(self.pcap, 'a+')
+            except:
+                log.msg("Unable to write to pcap file %s" % self.pcap)
+                self.pcapfile = None
+
+        try:
+            assert os.path.isfile(self.file)
+            fp = open(self.file, 'r')
+        except Exception, e:
+            hosts = ['8.8.8.8', '38.229.72.14']
+            log.err(e)
+        else:
+            self.inputs = self.inputProcessor(fp)
+        self.removePorts(hosts)
+
+        log.debug("Initialization of %s test completed with:\n%s"
+                  % (self.name, ''.join(self.__dict__)))
+
+    @staticmethod
+    def inputParser(inputs):
+        log.debug("Removing possible ports from host addresses...")
+        log.debug("Initial inputs:\n%s" % pprint(inputs))
+
+        assert isinstance(inputs, list)
+        hosts = [h.rsplit(':', 1)[0] for h in inputs]
+        log.debug("Inputs converted to:\n%s" % hosts)
+
+        return hosts
+
+    def tryInterfaces(self, ifaces):
+        try:
+            from scapy.all import sr1   ## we want this check to be blocking
+        except:
+            log.msg("This test requires scapy: www.secdev.org/projects/scapy")
+            raise SystemExit
+
+        ifup = {}
+        while ifaces:
+            for ifname, ifaddr in ifaces:
+                log.debug("Currently testing network capabilities of interface"
+                          + "%s  by sending a packet to our address %s"
+                          % (ifname, ifaddr))
+                try:
+                    pkt = IP(dst=ifaddr)/ICMP()
+                    ans, unans = sr(pkt, iface=ifname, timeout=self.timeout)
+                except Exception, e:
+                    raise PermissionsError if e.find("Errno 1") else log.err(e)
+                else:
+                    ## xxx i think this logic might be wrong
+                    log.debug("Interface test packet\n%s\n\n%s"
+                              % (pkt.summary(), pkt.show2()))
+                    if ans.summary():
+                        log.info("Received answer for test packet on interface"
+                                 +"%s :\n%s" % (ifname, ans.summary()))
+                        ifup.update(ifname, ifaddr)
+                    else:
+                        log.info("Our interface test packet was unanswered:\n%s"
+                                 % unans.summary())
+
+        if len(ifup) > 0:
+            log.msg("Discovered the following working network interfaces: %s"
+                    % ifup)
+            return ifup
+        else:
+            raise IfaceError("Could not find a working network interface.")
+
+    def buildPackets(self):
+        log.debug("self.input is %s" % self.input)
+        log.debug("self.hosts is %s" % self.hosts)
+        for addr in self.input:
+            packet = IP(dst=self.input)/ICMP()
+            self.request.append(packet)
+        return packet
+
+    def test_icmp(self):
+        if self.recieve:
+            self.buildPackets()
+            all = []
+            for packet in self.request:
+                d = self.sendReceivePackets(packets=packet)
+                all.append(d)
+                self.response.update({packet: d})
+            d_list = defer.DeferredList(all)
+            return d_list
+        else:
+            d = self.sendPackets()
+            return d
diff --git a/nettests/simpletest.py b/nettests/simpletest.py
index 7cc9318..c599d68 100644
--- a/nettests/simpletest.py
+++ b/nettests/simpletest.py
@@ -5,7 +5,6 @@ class SimpleTest(nettest.TestCase):
                      ['controlserver', 'c', 'google.com', 'Specify the control server'],
                      ['resume', 'r', 0, 'Resume at this index'],
                      ['other', 'o', None, 'Other arguments']]
-
     def test_foo(self, *arg, **kw):
         print "Running %s with %s" % ("test_foo", self.input)
         self.report['test_foo'] = 'Antani'
diff --git a/ooni/echo.py b/ooni/echo.py
deleted file mode 100644
index c4ef588..0000000
--- a/ooni/echo.py
+++ /dev/null
@@ -1,206 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-#
-#  +---------+
-#  | echo.py |
-#  +---------+
-#     A simple ICMP-8 ping test.
-#
-# :author: Isis Lovecruft
-# :version: 0.0.1-pre-alpha
-# :license: (c) 2012 Isis Lovecruft
-#           see attached LICENCE file
-#
-
-import os
-import sys
-
-from pprint           import pprint
-
-from twisted.internet import reactor
-from twisted.plugin   import IPlugin
-from twisted.python   import usage
-from ooni.nettest     import TestCase
-from ooni.utils       import log, Storage
-from ooni.utils.net   import PermissionsError, IfaceError
-
-try:
-    from scapy.all             import sr1, IP, ICMP        ## XXX v4/v6?
-    from ooni.lib              import txscapy
-    from ooni.lib.txscapy      import txsr, txsend
-    from ooni.templates.scapyt import ScapyTest
-except:
-    log.msg("This test requires scapy, see www.secdev.org/projects/scapy")
-
-## xxx TODO: move these to a utility function for determining OSes
-LINUX=sys.platform.startswith("linux")
-OPENBSD=sys.platform.startswith("openbsd")
-FREEBSD=sys.platform.startswith("freebsd")
-NETBSD=sys.platform.startswith("netbsd")
-DARWIN=sys.platform.startswith("darwin")
-SOLARIS=sys.platform.startswith("sunos")
-WINDOWS=sys.platform.startswith("win32")
-
-class EchoTest(ScapyTest):
-    """
-    xxx fill me in
-    """
-    name         = 'echo'
-    author       = 'Isis Lovecruft <isis at torproject.org>'
-    description  = 'A simple ICMP-8 test to see if a host is reachable.'
-    version      = '0.0.1'
-    inputFile    = ['file', 'f', None, 'File of list of IPs to ping']
-    requirements = None
-    report       = Storage()
-
-    optParameters = [
-        ['interface', 'i', None, 'Network interface to use'],
-        ['count', 'c', 5, 'Number of packets to send', int],
-        ['size', 's', 56, 'Number of bytes to send in ICMP data field', int],
-        ['ttl', 'l', 25, 'Set the IP Time to Live', int],
-        ['timeout', 't', 2, 'Seconds until timeout if no response', int],
-        ['pcap', 'p', None, 'Save pcap to this file'],
-        ['receive', 'r', True, 'Receive response packets']
-        ]
-
-    def setUpClass(self, *a, **kw):
-        '''
-        :ivar ifaces:
-            Struct returned from getifaddrs(3) and turned into a tuple in the
-            form (*ifa_name, AF_FAMILY, *ifa_addr)
-        '''
-        super(EchoTest, self).__init__(*a, **kw)
-
-        ## allow subclasses which register/implement external classes
-        ## to define their own reactor without overrides:
-        if not hasattr(super(EchoTest, self), 'reactor'):
-            log.debug("%s test: Didn't find reactor!" % self.name)
-            self.reactor = reactor
-
-        if self.localOptions:
-            log.debug("%s localOptions found" % self.name)
-            log.debug("%s test options: %s" % (self.name, self.subOptions))
-            self.local_options = self.localOptions.parseOptions(self.subOptions)
-            for key, value in self.local_options:
-                log.debug("Set attribute %s[%s] = %s" % (self.name, key, value))
-                setattr(self, key, value)
-
-        ## xxx is this now .subOptions?
-        #self.inputFile = self.localOptions['file']
-        self.timeout *= 1000            ## convert to milliseconds
-
-        if not self.interface:
-            log.msg("No network interface specified!")
-            log.debug("OS detected: %s" % sys.platform)
-            if LINUX or OPENBSD or NETBSD or FREEBSD or DARWIN or SOLARIS:
-                from twisted.internet.test import _posixifaces
-                log.msg("Attempting to discover network interfaces...")
-                ifaces = _posixifaces._interfaces()
-            elif WINDOWS:
-                from twisted.internet.test import _win32ifaces
-                log.msg("Attempting to discover network interfaces...")
-                ifaces = _win32ifaces._interfaces()
-            else:
-                log.debug("Client OS %s not accounted for!" % sys.platform)
-                log.debug("Unable to discover network interfaces...")
-                ifaces = [('lo', '')]
-
-            ## found = {'eth0': '1.1.1.1'}
-            found = [{i[0]: i[2]} for i in ifaces if i[0] != 'lo']
-            log.info("Found interfaces:\n%s" % pprint(found))
-            self.interfaces = self.tryInterfaces(found)
-        else:
-            ## xxx need a way to check that iface exists, is up, and
-            ## we have permissions on it
-            log.debug("Our interface has been set to %s" % self.interface)
-
-        if self.pcap:
-            try:
-                self.pcapfile = open(self.pcap, 'a+')
-            except:
-                log.msg("Unable to write to pcap file %s" % self.pcap)
-                self.pcapfile = None
-
-        try:
-            assert os.path.isfile(self.file)
-            fp = open(self.file, 'r')
-        except Exception, e:
-            hosts = ['8.8.8.8', '38.229.72.14']
-            log.err(e)
-        else:
-            self.inputs = self.inputProcessor(fp)
-        self.removePorts(hosts)
-
-        log.debug("Initialization of %s test completed with:\n%s"
-                  % (self.name, ''.join(self.__dict__)))
-
-    def inputProcessor(self, fp):
-        inputs = [x.strip() for x in fp.readlines() if not x.startswith('#')]
-        fp.close()
-        log.debug("Removing possible ports from host addresses...")
-        log.debug("Initial inputs:\n%s" % pprint(inputs))
-
-        assert isinstance(inputs, list)
-        hosts = [h.rsplit(':', 1)[0] for h in inputs]
-        log.debug("Inputs converted to:\n%s" % hosts)
-
-        return hosts
-
-    def tryInterfaces(self, ifaces):
-        try:
-            from scapy.all import sr1   ## we want this check to be blocking
-        except:
-            log.msg("This test requires scapy: www.secdev.org/projects/scapy")
-            raise SystemExit
-
-        ifup = {}
-        while ifaces:
-            for ifname, ifaddr in ifaces:
-                log.debug("Currently testing network capabilities of interface"
-                          + "%s  by sending a packet to our address %s"
-                          % (ifname, ifaddr))
-                try:
-                    pkt = IP(dst=ifaddr)/ICMP()
-                    ans, unans = sr(pkt, iface=ifname, timeout=self.timeout)
-                except Exception, e:
-                    raise PermissionsError if e.find("Errno 1") else log.err(e)
-                else:
-                    ## xxx i think this logic might be wrong
-                    log.debug("Interface test packet\n%s\n\n%s"
-                              % (pkt.summary(), pkt.show2()))
-                    if ans.summary():
-                        log.info("Received answer for test packet on interface"
-                                 +"%s :\n%s" % (ifname, ans.summary()))
-                        ifup.update(ifname, ifaddr)
-                    else:
-                        log.info("Our interface test packet was unanswered:\n%s"
-                                 % unans.summary())
-
-        if len(ifup) > 0:
-            log.msg("Discovered the following working network interfaces: %s"
-                    % ifup)
-            return ifup
-        else:
-            raise IfaceError("Could not find a working network interface.")
-
-    def buildPackets(self):
-        log.debug("self.input is %s" % self.input)
-        log.debug("self.hosts is %s" % self.hosts)
-        for addr in self.input:
-            packet = IP(dst=self.input)/ICMP()
-            self.request.append(packet)
-        return packet
-
-    def test_icmp(self):
-        if self.recieve:
-            self.buildPackets()
-            all = []
-            for packet in self.request:
-                d = self.sendReceivePackets(packets=packet)
-                all.append(d)
-                self.response.update({packet: d})
-            d_list = defer.DeferredList(all)
-            return d_list
-        else:
-            d = self.sendPackets()
-            return d
diff --git a/ooni/nettest.py b/ooni/nettest.py
index e3c7800..541d65b 100644
--- a/ooni/nettest.py
+++ b/ooni/nettest.py
@@ -1,7 +1,15 @@
 # -*- encoding: utf-8 -*-
 #
-# :authors: Arturo "hellais" Filastò <art at fuffa.org>
+#     nettest.py
+# ------------------->
+#
+# :authors: Arturo "hellais" Filastò <art at fuffa.org>,
+#           Isis Lovecruft <isis at torproject.org>
 # :licence: see LICENSE
+# :copyright: 2012 Arturo Filasto, Isis Lovecruft
+# :version: 0.1.0-alpha
+#
+# <-------------------
 
 import sys
 import os
@@ -84,9 +92,9 @@ class TestCase(unittest.TestCase):
           ``ooniprobe mytest.py -c path/to/file.txt``
 
 
-    * inputProcessor: should be set to a function that takes as argument an
-      open file descriptor and it will yield the input to be passed to the
-      test instance.
+    * inputParser: should be set to a function that takes as argument an
+      iterable containing test inputs and it simply parses those inputs and
+      returns them back to test instance.
 
     * name: should be set to the name of the test.
 
@@ -123,12 +131,10 @@ class TestCase(unittest.TestCase):
         subclass of :class:`ooni.nettest.TestCase`, so that the calling
         functions in ooni.runner can handle them correctly.
         """
-        methodName = 'runTest'
-        if kwargs:
-            if 'methodName' in kwargs:
-                methodName = kwargs['methodName']
-
-        super(TestCase, self).setUpClass()
+        if kwargs and 'methodName' in kwargs:
+            return super( TestCase, self ).setUpClass(
+                methodName=kwargs['methodName'] )
+        return super( TestCase, self ).setUpClass( )
 
         #for key, value in kwargs.items():
         #    setattr(self.__class__, key, value)
@@ -176,7 +182,7 @@ class TestCase(unittest.TestCase):
             processor = []
         else:
             log.msg("Received direct inputs:\n%s" % self.inputs)
-            processor = [i for i in self.inputProcessor(self.inputs)]
+            processor = [i for i in self.inputParser(self.inputs)]
 
         if self.inputFile:
             try:
diff --git a/ooni/runner.py b/ooni/runner.py
index 0e5dbba..f10f9ca 100644
--- a/ooni/runner.py
+++ b/ooni/runner.py
@@ -242,19 +242,22 @@ def loadTestsAndOptions(classes, config):
             log.debug("loadTestsAndOptions(): test %s found cases=%s"
                       % (tests, cases))
 
-            try:
-                opts = processTestOptions(klass, config)
-            except AttributeError, ae:
-                opts = {}; log.err(ae)
-            finally:
+            if hasattr(klass, 'optParameters') or hasattr(klass, 'inputFile'):
                 try:
+                    opts = processTestOptions(klass, config)
+                    print opts, config
+                except:
+                    opts = {}
+                finally:
                     instance = klass()
-                    inputs = instance._getInputs()
-                except Exception, e:
-                    inputs = []; log.err(e)
-                else:
-                    opts.update({'inputs': inputs})
-                options.append(opts)
+                    try:
+                        inputs = instance._getInputs()
+                    except Exception, e:
+                        inputs = []; log.err(e)
+                    else:
+                        opts.update({'inputs': inputs})
+                    finally:
+                        options.append(opts)
                 log.debug("loadTestsAndOptions(): type(opts)=%s" % type(opts))
 
     return test_cases, options





More information about the tor-commits mailing list