summaryrefslogtreecommitdiffstats
path: root/tests/end_to_end.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/end_to_end.py')
-rwxr-xr-xtests/end_to_end.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/end_to_end.py b/tests/end_to_end.py
new file mode 100755
index 0000000..cfb3cdd
--- /dev/null
+++ b/tests/end_to_end.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+"""End to end tests for the utility programs.
+
+This test assumes the utilities inside src directory have already been
+built.
+
+At the moment top_buiddir is not in the environment, but top_builddir would be
+more reliable than '..', so it's worth trying to pull it from the environment.
+"""
+
+__author__ = 'Jim Morrison <jim@twist.com>'
+
+
+import os
+import subprocess
+import time
+import unittest
+
+
+_PORT = 9893
+
+
+def _run_server(port, args):
+ srcdir = os.environ.get('srcdir', '.')
+ testdata = '%s/testdata' % srcdir
+ top_builddir = os.environ.get('top_builddir', '..')
+ base_args = ['%s/src/spdyd' % top_builddir, '-d', testdata]
+ if args:
+ base_args.extend(args)
+ base_args.extend([str(port), '%s/privkey.pem' % testdata,
+ '%s/cacert.pem' % testdata])
+ return subprocess.Popen(base_args)
+
+def _check_server_up(port):
+ # Check this check for now.
+ time.sleep(1)
+
+def _kill_server(server):
+ while server.returncode is None:
+ server.terminate()
+ time.sleep(1)
+ server.poll()
+
+
+class EndToEndSpdyTests(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ cls.setUpServer([])
+
+ @classmethod
+ def setUpServer(cls, args):
+ cls.server = _run_server(_PORT, args)
+ _check_server_up(_PORT)
+
+ @classmethod
+ def tearDownClass(cls):
+ _kill_server(cls.server)
+
+ def setUp(self):
+ build_dir = os.environ.get('top_builddir', '..')
+ self.client = '%s/src/spdycat' % build_dir
+ self.stdout = 'No output'
+
+ def call(self, path, args):
+ full_args = [self.client,'http://localhost:%d%s' % (_PORT, path)] + args
+ p = subprocess.Popen(full_args, stdout=subprocess.PIPE,
+ stdin=subprocess.PIPE)
+ self.stdout, self.stderr = p.communicate()
+ return p.returncode
+
+
+class EndToEndSpdy2Tests(EndToEndSpdyTests):
+ def testSimpleRequest(self):
+ self.assertEquals(0, self.call('/', []))
+
+ def testSimpleRequestSpdy3(self):
+ self.assertEquals(0, self.call('/', ['-v', '-3']))
+ self.assertIn('NPN selected the protocol: spdy/3', self.stdout)
+
+ def testFailedRequests(self):
+ self.assertEquals(
+ 2, self.call('/', ['https://localhost:25/', 'http://localhost:79']))
+
+ def testOneFailedRequest(self):
+ self.assertEquals(1, subprocess.call([self.client, 'http://localhost:2/']))
+
+ def testOneTimedOutRequest(self):
+ self.assertEquals(1, self.call('/?spdyd_do_not_respond_to_req=yes',
+ ['--timeout=2']))
+ self.assertEquals(0, self.call('/', ['--timeout=20']))
+
+
+class EndToEndSpdy3Tests(EndToEndSpdyTests):
+ @classmethod
+ def setUpClass(cls):
+ cls.setUpServer(['-3'])
+
+ def testSimpleRequest(self):
+ self.assertEquals(0, self.call('/', ['-v']))
+ self.assertIn('NPN selected the protocol: spdy/3', self.stdout)
+
+
+if __name__ == '__main__':
+ unittest.main()