commit d73c5fa22a72413fd1c5d24eeb1e9118f0a4662a Author: Arturo Filastò art@fuffa.org Date: Fri Mar 15 16:31:14 2013 +0100
Write unittests also for Tor geoip stuff --- ooni/errors.py | 3 +++ ooni/geoip.py | 16 ++++++++++++---- tests/test_geoip.py | 45 +++++++++++++++++++++++++++++++++++++++------ 3 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/ooni/errors.py b/ooni/errors.py index 62fcf93..69af726 100644 --- a/ooni/errors.py +++ b/ooni/errors.py @@ -138,3 +138,6 @@ class TorStateNotFound(Exception):
class InsufficientPrivileges(Exception): pass + +class ProbeIPUnknown(Exception): + pass diff --git a/ooni/geoip.py b/ooni/geoip.py index e6a221b..ae06608 100644 --- a/ooni/geoip.py +++ b/ooni/geoip.py @@ -110,19 +110,22 @@ class ProbeIP(object): 'maxmind': MaxMindGeoIP } address = None + tor_state = config.tor_state
@defer.inlineCallbacks def lookup(self): try: yield self.askTor() + log.msg("Found your IP via Tor %s" % self.address) defer.returnValue(self.address) except errors.TorStateNotFound: log.debug("Tor is not running. Skipping IP lookup via Tor.") - except: + except Exception: log.msg("Unable to lookup the probe IP via Tor.")
try: yield self.askTraceroute() + log.msg("Found your IP via Traceroute %s" % self.address) defer.returnValue(self.address) except errors.InsufficientPrivileges: log.debug("Cannot determine the probe IP address with a traceroute, becase of insufficient priviledges") @@ -131,9 +134,11 @@ class ProbeIP(object):
try: yield self.askGeoIPService() + log.msg("Found your IP via a GeoIP service: %s" % self.address) defer.returnValue(self.address) - except: + except Exception, e: log.msg("Unable to lookup the probe IP via GeoIPService") + raise e
@defer.inlineCallbacks def askGeoIPService(self): @@ -150,6 +155,9 @@ class ProbeIP(object): except Exception, e: log.msg("Failed to lookup your IP via %s" % service_name)
+ if not self.address: + raise errors.ProbeIPUnknown + def askTraceroute(self): """ Perform a UDP traceroute to determine the probes IP address. @@ -165,8 +173,8 @@ class ProbeIP(object): XXX this lookup method is currently broken when there are cached descriptors or consensus documents see: https://trac.torproject.org/projects/tor/ticket/8214 """ - if config.tor_state: - d = config.tor_state.protocol.get_info("address") + if self.tor_state: + d = self.tor_state.protocol.get_info("address") @d.addCallback def cb(result): self.strategy = 'tor_get_info_address' diff --git a/tests/test_geoip.py b/tests/test_geoip.py index 443d262..0d7165f 100644 --- a/tests/test_geoip.py +++ b/tests/test_geoip.py @@ -1,5 +1,7 @@ +from collections import namedtuple + from twisted.web import server, static, resource -from twisted.internet import reactor +from twisted.internet import reactor, defer from twisted.trial import unittest from twisted.python.filepath import FilePath from twisted.protocols.policies import WrappingFactory @@ -58,7 +60,7 @@ class TestGeoIPServices(GeoIPBaseTest): gip = TorProjectGeoIP() gip.url = self.getUrl('torproject') d = gip.lookup() - @d.addCallback + @d.addBoth def cb(res): self.assertEqual(res, '127.0.0.1') return d @@ -67,7 +69,7 @@ class TestGeoIPServices(GeoIPBaseTest): gip = UbuntuGeoIP() gip.url = self.getUrl('ubuntu') d = gip.lookup() - @d.addCallback + @d.addBoth def cb(res): self.assertEqual(res, '127.0.0.1') return d @@ -76,7 +78,7 @@ class TestGeoIPServices(GeoIPBaseTest): gip = MaxMindGeoIP() gip.url = self.getUrl('maxmind') d = gip.lookup() - @d.addCallback + @d.addBoth def cb(res): self.assertEqual(res, '127.0.0.1') return d @@ -93,7 +95,7 @@ class TestProbeIP(GeoIPBaseTest):
def test_ask_geoip_service(self): d = self.probe_ip.askGeoIPService() - @d.addCallback + @d.addBoth def cb(res): self.assertEqual(self.probe_ip.address, '127.0.0.1') return d @@ -102,7 +104,38 @@ class TestProbeIP(GeoIPBaseTest): self.assertRaises(errors.InsufficientPrivileges, self.probe_ip.askTraceroute)
def test_ask_tor(self): - pass + class MockTorState(object): + """ + This is a Mock Tor state object. It will just pretend to answer to + the get_info("address") method call. + """ + protocol = namedtuple('Protocol', 'get_info') + def __init__(self): + def get_info(key): + return defer.succeed({'XXX': '127.0.0.2'}) + self.protocol = self.protocol(get_info=get_info) + + self.probe_ip.tor_state = MockTorState() + d = self.probe_ip.lookup() + @d.addBoth + def cb(res): + self.assertEqual(self.probe_ip.address, '127.0.0.2') + return d + + def test_probe_ip(self): + d = self.probe_ip.lookup() + @d.addBoth + def cb(res): + self.assertEqual(self.probe_ip.address, '127.0.0.1') + self.assertTrue(self.probe_ip.strategy.startswith('geo_ip_service-')) + return d + + def test_failing_probe_ip(self): + self.probe_ip.geoIPServices = {} + + d = self.probe_ip.lookup() + self.assertFailure(d, errors.ProbeIPUnknown) + return d
class TestIPToLocation(unittest.TestCase): pass