[tor-commits] [ooni-probe/master] Add support for setting the url and expected-body in tests

art at torproject.org art at torproject.org
Fri Apr 29 09:42:25 UTC 2016


commit c17f564789b85bc9baa9dc1c64e77d8ff070aebd
Author: Arturo Filastò <arturo at filasto.net>
Date:   Wed Mar 16 15:06:59 2016 +0100

    Add support for setting the url and expected-body in tests
    
    * When these are changed from their default values a flag is set to false
---
 docs/source/tests/lantern.rst        |  6 ++++++
 docs/source/tests/psiphon.rst        |  7 +++++++
 ooni/nettests/third_party/lantern.py | 30 ++++++++++++++++++++++++++----
 ooni/nettests/third_party/psiphon.py | 29 +++++++++++++++++++----------
 ooni/utils/net.py                    |  3 +++
 5 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/docs/source/tests/lantern.rst b/docs/source/tests/lantern.rst
index 9f3af2f..9f3ee09 100644
--- a/docs/source/tests/lantern.rst
+++ b/docs/source/tests/lantern.rst
@@ -31,6 +31,11 @@ How to run the test
 
 `ooniprobe nettests/third_party/lantern.py`
 
+For advanced usages you may also configure a different URL and expected body
+for the response with the `--url` and `--expected-body` command line options.
+
+`ooniprobe nettests/third_party/lantern.py --url http://www.github.com/humans.txt --expected-body '/* TEAM */'`
+
 Sample report
 =============
 
@@ -55,6 +60,7 @@ test_version: 0.0.1
 ---
 body: "Google is built by a large team of engineers, designers, researchers, robots, and others in many different sites across the globe. It is updated continuously, and built with more tools and technologies than we can shake a stick at. If you'd like to help us out, see google.com/careers."
 bootstrapped: true
+default_configuration: true
 input: null
 lantern --headless: {exit_reason: process_done, stderr: '', stdout: ''}
 ```
diff --git a/docs/source/tests/psiphon.rst b/docs/source/tests/psiphon.rst
index 3934bcb..3499501 100644
--- a/docs/source/tests/psiphon.rst
+++ b/docs/source/tests/psiphon.rst
@@ -35,6 +35,12 @@ To test Psiphon when it is installed in a different path other than the user hom
 
 `ooniprobe third_party/psiphon -p <path to Psiphon repository>`
 
+For advanced usages you may also configure a different URL and expected body
+for the response with the `--url` and `--expected-body` command line options.
+
+`ooniprobe third_party/psiphon --url http://www.github.com/humans.txt --expected-body '/* TEAM */'`
+
+
 How to install Psiphon
 ===================
 
@@ -80,6 +86,7 @@ Sample report
     agent: agent
     input: null
     psiphon_installed: true
+    default_configuration: true
     requests:
     - request:
         body: null
diff --git a/ooni/nettests/third_party/lantern.py b/ooni/nettests/third_party/lantern.py
index 187e210..da19566 100644
--- a/ooni/nettests/third_party/lantern.py
+++ b/ooni/nettests/third_party/lantern.py
@@ -1,11 +1,22 @@
 import os
+import distutils.spawn
+
 from twisted.internet import defer, reactor
 from twisted.internet.endpoints import TCP4ClientEndpoint
 from twisted.web.client import ProxyAgent, readBody
+from twisted.python import usage
+
 from ooni.templates.process import ProcessTest, ProcessDirector
-from ooni.utils import log
+from ooni.utils import log, net
 from ooni.errors import handleAllFailures
-import distutils.spawn
+
+class UsageOptions(usage.Options):
+    optParameters = [
+        ['url', 'u', net.GOOGLE_HUMANS[0],
+            'Specify the URL to fetch over lantern (default: http://www.google.com/humans.txt).'],
+        ['expected-body', 'e', net.GOOGLE_HUMANS[1],
+            'Specify the beginning of the expected body in the response (default: ' + net.GOOGLE_HUMANS[1] + ')']
+    ]
 
 class LanternTest(ProcessTest):
     """
@@ -26,10 +37,21 @@ class LanternTest(ProcessTest):
     timeout = 120
 
     def setUp(self):
+        self.report['body'] = None
+        self.report['failure'] = None
+        self.report['success'] = None
+        self.report['default_configuration'] = True
+
         self.command = [distutils.spawn.find_executable("lantern"), "--headless"]
         self.bootstrapped = defer.Deferred()
         self.exited = False
-        self.url = 'http://www.google.com/humans.txt'
+
+        self.url = self.localOptions['url']
+        if self.url != net.GOOGLE_HUMANS[0]:
+            self.report['default_configuration'] = False
+
+        if self.localOptions['expected-body'] != net.GOOGLE_HUMANS[1]:
+            self.report['default_configuration'] = False
 
     def stop(self, reason=None):
         if not self.exited:
@@ -49,7 +71,7 @@ class LanternTest(ProcessTest):
     def test_lantern_circumvent(self):
         def addResultToReport(result):
             self.report['body'] = result
-            if result.startswith('Google is built by a large'):
+            if result.startswith(self.localOptions['expected-body']):
                 log.msg("Got the HTTP response body I expected!")
                 self.report['success'] = True
             else:
diff --git a/ooni/nettests/third_party/psiphon.py b/ooni/nettests/third_party/psiphon.py
index 575002b..2b18b18 100644
--- a/ooni/nettests/third_party/psiphon.py
+++ b/ooni/nettests/third_party/psiphon.py
@@ -6,17 +6,19 @@ from twisted.internet import defer, reactor
 from twisted.internet.error import ProcessExitedAlready
 from twisted.python import usage
 
-from ooni.utils import log
+from ooni.utils import log, net
 from ooni.templates import process, httpt
 
 
 class UsageOptions(usage.Options):
-    log.debug("UsageOptions")
     optParameters = [
-        ['psiphonpath', 'p', None, 'Specify psiphon python client path.']
+        ['psiphonpath', 'p', None, 'Specify psiphon python client path.'],
+        ['url', 'u', net.GOOGLE_HUMANS[0],
+            'Specify the URL to fetch over psiphon (default: http://www.google.com/humans.txt).'],
+        ['expected-body', 'e', net.GOOGLE_HUMANS[1],
+            'Specify the beginning of the expected body in the response (default: ' + net.GOOGLE_HUMANS[1] + ')']
     ]
 
-
 class PsiphonTest(httpt.HTTPTest,  process.ProcessTest):
 
     """
@@ -43,8 +45,19 @@ class PsiphonTest(httpt.HTTPTest,  process.ProcessTest):
     def setUp(self):
         log.debug('PsiphonTest.setUp')
 
+        self.report['bootstrapped_success'] = None
+        self.report['request_success'] = None
+        self.report['psiphon_found'] = None
+        self.report['default_configuration'] = True
+
         self.bootstrapped = defer.Deferred()
-        self.url = 'http://www.google.com/humans.txt'
+        self.url = self.localOptions['url']
+
+        if self.localOptions['url'] != net.GOOGLE_HUMANS[0]:
+            self.report['default_configuration'] = False
+
+        if self.localOptions['expected-body'] != net.GOOGLE_HUMANS[1]:
+            self.report['default_configuration'] = False
 
         if self.localOptions['psiphonpath']:
             self.psiphonpath = self.localOptions['psiphonpath']
@@ -83,10 +96,6 @@ connect(False)
     def test_psiphon(self):
         log.debug('PsiphonTest.test_psiphon')
         self.createCommand()
-
-        self.report['bootstrapped_success'] = None
-        self.report['request_success'] = None
-        self.report['psiphon_found'] = None
         if not os.path.exists(self.psiphonpath):
             log.err('psiphon path does not exists, is it installed?')
             self.report['psiphon_found'] = False
@@ -121,7 +130,7 @@ connect(False)
             d = self.doRequest(self.url)
             def addSuccessToReport(res):
                 log.debug("PsiphonTest.callDoRequest.addSuccessToReport")
-                if res.body.startswith('Google is built by a large'):
+                if res.body.startswith(self.localOptions['expected-body']):
                     self.report['request_success'] = True
                 else:
                     self.report['request_success'] = False
diff --git a/ooni/utils/net.py b/ooni/utils/net.py
index 96d62a1..1f87101 100644
--- a/ooni/utils/net.py
+++ b/ooni/utils/net.py
@@ -46,6 +46,9 @@ PLATFORMS = {'LINUX': sys.platform.startswith("linux"),
              'SOLARIS': sys.platform.startswith("sunos"),
              'WINDOWS': sys.platform.startswith("win32")}
 
+# This is used as a default for checking if we get the expected result when
+# fetching URLs over some proxy.
+GOOGLE_HUMANS = ('http://www.google.com/humans.txt', 'Google is built by a large')
 
 class StringProducer(object):
     implements(IBodyProducer)





More information about the tor-commits mailing list