diff options
author | Augie Fackler <durin42@gmail.com> | 2010-07-22 00:31:16 -0500 |
---|---|---|
committer | Augie Fackler <durin42@gmail.com> | 2010-07-22 00:31:16 -0500 |
commit | 1b081141cd9f4b46d0be635b1da1f6288d15568e (patch) | |
tree | 57dbd82018389bf49d22118c383ab1a198bdc18c /python2/httplib2/test/functional | |
parent | 043634c0eb463c8ed29968d4bc1cd211aa0f6787 (diff) | |
download | httplib2-1b081141cd9f4b46d0be635b1da1f6288d15568e.tar.gz |
tests: add simple functional test for proxies
Depends on tinyproxy - test will automatically skip if it is unavailable.
Diffstat (limited to 'python2/httplib2/test/functional')
-rw-r--r-- | python2/httplib2/test/functional/test_proxies.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/python2/httplib2/test/functional/test_proxies.py b/python2/httplib2/test/functional/test_proxies.py new file mode 100644 index 0000000..20d9c8d --- /dev/null +++ b/python2/httplib2/test/functional/test_proxies.py @@ -0,0 +1,89 @@ +import unittest +import errno +import os +import signal +import subprocess +import tempfile + +import nose + +import httplib2 +from httplib2 import socks +from httplib2.test import miniserver + +tinyproxy_cfg = """ +User "%(user)s" +Port %(port)s +Listen 127.0.0.1 +PidFile "%(pidfile)s" +LogFile "%(logfile)s" +MaxClients 2 +StartServers 1 +LogLevel Info +""" + +class FunctionalProxyHttpTest(unittest.TestCase): + def setUp(self): + if not socks: + raise nose.SkipTest('socks module unavailable') + if not subprocess: + raise nose.SkipTest('subprocess module unavailable') + + # start a short-lived miniserver so we can get a likely port + # for the proxy + self.httpd, self.proxyport = miniserver.start_server( + miniserver.ThisDirHandler) + self.httpd.shutdown() + self.httpd, self.port = miniserver.start_server( + miniserver.ThisDirHandler) + + self.pidfile = tempfile.mktemp() + self.logfile = tempfile.mktemp() + fd, self.conffile = tempfile.mkstemp() + f = os.fdopen(fd, 'w') + our_cfg = tinyproxy_cfg % {'user': os.getlogin(), + 'pidfile': self.pidfile, + 'port': self.proxyport, + 'logfile': self.logfile + } + f.write(our_cfg) + f.close() + try: + # TODO use subprocess.check_call when 2.4 is dropped + ret = subprocess.call(['tinyproxy', '-c', self.conffile]) + self.assertEqual(0, ret) + except OSError, e: + # sign you've been doing VCS too long: you recognize errno 2 as ENOENT. + if e.errno == errno.ENOENT: + raise nose.SkipTest('tinyproxy not available') + raise + + def tearDown(self): + self.httpd.shutdown() + try: + pid = int(open(self.pidfile).read()) + os.kill(pid, signal.SIGTERM) + except OSError, e: + if e.errno == errno.ESRCH: + print '\n\n\nTinyProxy Failed to start, log follows:' + print open(self.logfile).read() + print 'end tinyproxy log\n\n\n' + raise + map(os.unlink, (self.pidfile, + self.logfile, + self.conffile)) + + def testSimpleProxy(self): + proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, + 'localhost', self.proxyport) + client = httplib2.Http(proxy_info=proxy_info) + src = 'miniserver.py' + response, body = client.request('http://localhost:%d/%s' % + (self.port, src)) + self.assertEqual(response.status, 200) + self.assertEqual(body, open(os.path.join(miniserver.HERE, src)).read()) + lf = open(self.logfile).read() + expect = ('Established connection to host "127.0.0.1" ' + 'using file descriptor') + self.assertTrue(expect in lf, + 'tinyproxy did not proxy a request for miniserver') |