blob: e9d10cb9f7d852ca6967a89f60b929914d5c22c2 [file] [log] [blame]
# -*- coding: utf-8 -*-
from unittest import TestCase
import httplib
import poster
import urllib2, urllib
import threading, time, signal
import sys
import os
import subprocess
import tempfile
port = 5123
class TestStreaming(TestCase):
disable_https = True
def setUp(self):
self.opener = poster.streaminghttp.register_openers()
if self.disable_https:
# Disable HTTPS support for these tests to excercise the non-https code
# HTTPS is tested in test_streaming_https.py
if hasattr(httplib, "HTTPS"):
self.https = getattr(httplib, "HTTPS")
delattr(httplib, "HTTPS")
reload(poster.streaminghttp)
else:
self.https = None
else:
self.https = None
# Hard code to python2.6 for now, since python2.7 can't run the test server reliably
cmd = ["python2.6", os.path.join(os.path.dirname(__file__), 'test_server.py'), str(port)]
if not self.disable_https:
cmd.append("ssl")
null = open(os.devnull, "w")
self.server_output = tempfile.TemporaryFile()
self.server_proc = None
try:
self.server_proc = subprocess.Popen(cmd, stdout=self.server_output, stderr=self.server_output, close_fds=True)
for i in range(20):
try:
if self.disable_https:
urllib2.urlopen("http://localhost:%i/" % port).read()
else:
urllib2.urlopen("https://localhost:%i/" % port).read()
time.sleep(0.1)
break
except:
#import traceback
#traceback.print_exc()
time.sleep(0.1)
else:
self.server_output.seek(0)
print self.server_output.read()
raise OSError("Error starting server")
except:
if self.server_proc:
os.kill(self.server_proc.pid, signal.SIGINT)
self.server_proc.wait()
raise
def tearDown(self):
if self.https:
setattr(httplib, "HTTPS", self.https)
os.kill(self.server_proc.pid, signal.SIGINT)
self.server_proc.wait()
self.server_output.seek(0)
print self.server_output.read()
def _open(self, url, params=None, headers=None):
try:
if headers is None:
headers = {}
req = urllib2.Request("http://localhost:%i/%s" % (port, url), params,
headers)
return urllib2.urlopen(req).read()
except:
self._opened = False
raise
def test_basic(self):
response = self._open("testing123")
self.assertEqual(response, "Path: /testing123")
def test_basic2(self):
response = self._open("testing?foo=bar")
self.assertEqual(response, "Path: /testing\nfoo: bar")
def test_nonstream_uploadfile(self):
datagen, headers = poster.encode.multipart_encode([
poster.encode.MultipartParam.from_file("file", __file__),
poster.encode.MultipartParam("foo", "bar")])
data = "".join(datagen)
response = self._open("upload", data, headers)
self.assertEqual(response, "Path: /upload\nfile: %s\nfoo: bar" % open(__file__).read())
def test_stream_upload_generator(self):
datagen, headers = poster.encode.multipart_encode([
poster.encode.MultipartParam.from_file("file", __file__),
poster.encode.MultipartParam("foo", "bar")])
response = self._open("upload", datagen, headers)
self.assertEqual(response, "Path: /upload\nfile: %s\nfoo: bar" % open(__file__).read())
def test_stream_upload_file(self):
data = open("poster/__init__.py")
headers = {"Content-Length": str(os.path.getsize("poster/__init__.py"))}
response = self._open("upload", data, headers)
self.assertEquals(response, "Path: /upload\n%s" % open("poster/__init__.py").read().replace(" = ", " : "))
def test_stream_upload_file_no_len(self):
data = open(__file__)
self.assertRaises(ValueError, self._open, "upload", data, {})
def test_stream_upload_generator_no_len(self):
def data():
yield ""
self.assertRaises(ValueError, self._open, "upload", data(), {})
def test_redirect(self):
response = self._open("redirect")
self.assertEqual(response, "Path: /foo")
def test_login(self):
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(
None, "http://localhost:%i/needs_auth" % port, 'john', 'secret'
)
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
auth_handler.handler_order = 0
self.opener.add_handler(auth_handler)
data = open("poster/__init__.py")
headers = {"Content-Length": str(os.path.getsize("poster/__init__.py"))}
response = self._open("needs_auth", data, headers)
self.assertEqual(response, "Path: /needs_auth\n%s" % open("poster/__init__.py").read().replace(" = ", " : "))
class TestStreamingHTTPS(TestStreaming):
disable_https = False
def _open(self, url, params=None, headers=None):
try:
if headers is None:
headers = {}
req = urllib2.Request("https://localhost:%i/%s" % (port, url), params,
headers)
return urllib2.urlopen(req).read()
except:
self._opened = False
raise