[tor-commits] [bridgedb/develop] Add test_https.py from trygve.

isis at torproject.org isis at torproject.org
Wed Aug 13 00:41:26 UTC 2014


commit d5556300a9f53c80760e12b13c94a93d041ca9ff
Author: trygve <tor-dev at lists.torproject.org>
Date:   Thu Aug 7 00:44:15 2014 +0000

    Add test_https.py from trygve.
    
     * FIXES part of #9874. See
       https://trac.torproject.org/projects/tor/attachment/ticket/9874/test_https.py
---
 lib/bridgedb/test/test_https.py |  146 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 146 insertions(+)

diff --git a/lib/bridgedb/test/test_https.py b/lib/bridgedb/test/test_https.py
new file mode 100644
index 0000000..46da832
--- /dev/null
+++ b/lib/bridgedb/test/test_https.py
@@ -0,0 +1,146 @@
+"""integration tests for BridgeDB .
+http://wwwsearch.sourceforge.net/mechanize/
+http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html
+"""
+
+from __future__ import print_function
+from twisted.trial import unittest
+from BeautifulSoup import BeautifulSoup
+import mechanize
+
+HTTPS_ROOT = 'https://127.0.0.1:6789'
+CAPTCHA_RESPONSE = 'Tvx74Pmy'
+
+class HTTPTests(unittest.TestCase):
+    def setUp(self):
+	self.br = None
+
+    def tearDown(self):
+	self.br = None
+
+    def openBrowser(self):
+	# use mechanize to open the BridgeDB website in its browser
+	self.br = mechanize.Browser()
+	self.br.set_handle_robots(False) # prevents 'HTTP Error 403: request disallowed by robots.txt'
+	self.br.open(HTTPS_ROOT)
+
+	# -------------- Home/Root  page
+	self.assertTrue(self.br.viewing_html())
+	self.assertEquals(self.br.response().geturl(), HTTPS_ROOT)
+	self.assertEquals(self.br.title(), "BridgeDB")
+	#for link in self.br.links(): print(link)
+	#for form in self.br.forms(): print(form)
+	return self.br
+
+    def goToOptionsPage(self):
+        # check that we are on the root page
+	self.assertTrue(self.br.viewing_html())
+	self.assertEquals(self.br.response().geturl(), HTTPS_ROOT)
+
+	# follow the link with the word 'bridges' in it.
+	# Could also use: text='bridges'
+	# Could also use: url='/options'
+	self.br.follow_link(text_regex='bridges')
+
+	# ------------- Options
+	self.assertEquals(self.br.response().geturl(), HTTPS_ROOT + "/options")
+	#print(self.br.response().read())
+	#for form in self.br.forms(): print(form)
+	return self.br
+     
+    def submitOptions(self, transport, ipv6, captchaResponse):
+	# check that we are on the options page
+	self.assertEquals(self.br.response().geturl(), HTTPS_ROOT + "/options")
+
+	# At this point, we'd like to be able to set some values in
+	# the 'advancedOptions' form. Unfortunately the HTML form
+	# does not define a 'name' attribute, so the we have to rely on
+	# the fact that this is the only form on the page and will therefore
+	# always exist at index 0.
+	#br.select_form(name="advancedOptions")
+	self.br.select_form(nr=0)
+
+	# change the pluggable transport to something else 
+	#print(self.br.form)
+	self.br.form['transport'] = [transport]
+        if ipv6:
+            self.br.form['ipv6'] = ['yes']
+	self.br.submit()
+
+	# ------------- Captcha
+	EXPECTED_URL = HTTPS_ROOT + "/bridges?transport=%s" % transport
+        if ipv6:
+            EXPECTED_URL += "&ipv6=yes"
+	self.assertEquals(self.br.response().geturl(), EXPECTED_URL)
+	#print(self.br.response().read())
+	#for form in self.br.forms(): print(form)
+
+	# As on the previous page, the form does not define a 'name' attribute, forcing 
+	# us to use the index of the form i.e. 0
+	#self.br.select_form(name="captchaSubmission")
+	self.br.select_form(nr=0)
+
+	# input the required captcha response. There is only one captcha defined
+	# by default, so this should always be accepted. Note this will not be possible
+	# to automate if used with a real captcha systems (e.g. reCAPTCHA)
+	#self.br.form['captcha_response_field'] = 'Tvx74PMy'
+	self.br.form['captcha_response_field'] = captchaResponse
+	captcha_response = self.br.submit()
+
+	# ------------- Results
+	# URL should be the same as last time
+	self.assertEquals(self.br.response().geturl(), EXPECTED_URL)
+	soup = BeautifulSoup(captcha_response.read())
+	#print soup.prettify()
+	return soup
+
+    def getBridgeLinesFromSoup(self, soup):
+	# Now we're looking for something like this in the response:
+	#     <div class="bridge-lines">
+	#      obfs2 175.213.252.207:11125 5c6da7d927460317c6ff5420b75c2d0f431f18dd
+	#     </div>
+	bridges = []
+	bridge_lines = soup.findAll(attrs={'class' : 'bridge-lines'})
+	self.assertTrue(len(bridge_lines) > 0, "Found no bridge lines")
+	for bridge_line in bridge_lines:
+	    text = bridge_line.text
+	    #print("Found bridge-line: %s" % text)
+	    items = text.split(' ')
+   	    self.assertEquals(len(items), 3, "Expected Pluggale Transport, Bridge and Fingerprint in %s" % str(items))
+	    bridges.append(items)
+	return bridges
+
+    def test_get_obfs2_ipv4(self):
+	self.openBrowser()
+	self.goToOptionsPage()
+
+	PT = 'obfs2'
+        soup = self.submitOptions(transport=PT, ipv6=False, captchaResponse=CAPTCHA_RESPONSE)
+
+	bridges = self.getBridgeLinesFromSoup(soup)
+        for pt, bridge, fingerprint in bridges:
+	    self.assertEquals(PT, pt)
+
+    def test_get_obfs3_ipv4(self):
+	self.openBrowser()
+	self.goToOptionsPage()
+
+	PT = 'obfs3'
+        soup = self.submitOptions(transport=PT, ipv6=False, captchaResponse=CAPTCHA_RESPONSE)
+
+	bridges = self.getBridgeLinesFromSoup(soup)
+        for pt, bridge, fingerprint in bridges:
+	    self.assertEquals(PT, pt)
+
+    def test_get_obfs3_ipv6(self):
+	self.openBrowser()
+	self.goToOptionsPage()
+
+	PT = 'obfs3'
+        soup = self.submitOptions(transport=PT, ipv6=True, captchaResponse=CAPTCHA_RESPONSE)
+
+	# at the time of writing, this test fails due to lack of ipv6 bridges
+	bridges = self.getBridgeLinesFromSoup(soup)
+        for pt, bridge, fingerprint in bridges:
+	    self.assertEquals(PT, pt)
+





More information about the tor-commits mailing list