Tests: simple python application.
This commit is contained in:
91
test/test_python_application.py
Normal file
91
test/test_python_application.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
import unittest
|
||||||
|
import unit
|
||||||
|
|
||||||
|
class TestUnitApplication(unit.TestUnitControl):
|
||||||
|
|
||||||
|
def setUpClass():
|
||||||
|
u = unit.TestUnit()
|
||||||
|
|
||||||
|
u.check_modules('python')
|
||||||
|
u.check_version('0.4')
|
||||||
|
|
||||||
|
def test_python_application(self):
|
||||||
|
code, name = """
|
||||||
|
|
||||||
|
def application(environ, start_response):
|
||||||
|
|
||||||
|
content_length = int(environ.get('CONTENT_LENGTH', 0))
|
||||||
|
body = bytes(environ['wsgi.input'].read(content_length))
|
||||||
|
|
||||||
|
start_response('200 OK', [
|
||||||
|
('Content-Type', environ.get('CONTENT_TYPE')),
|
||||||
|
('Content-Length', str(len(body))),
|
||||||
|
('Request-Method', environ.get('REQUEST_METHOD')),
|
||||||
|
('Request-Uri', environ.get('REQUEST_URI')),
|
||||||
|
('Path-Info', environ.get('PATH_INFO')),
|
||||||
|
('Http-Host', environ.get('HTTP_HOST')),
|
||||||
|
('Remote-Addr', environ.get('REMOTE_ADDR')),
|
||||||
|
('Server-Name', environ.get('SERVER_NAME')),
|
||||||
|
('Server-Port', environ.get('SERVER_PORT')),
|
||||||
|
('Server-Protocol', environ.get('SERVER_PROTOCOL')),
|
||||||
|
('Custom-Header', environ.get('HTTP_CUSTOM_HEADER'))
|
||||||
|
])
|
||||||
|
return [body]
|
||||||
|
|
||||||
|
""", 'py_app'
|
||||||
|
|
||||||
|
self.python_application(name, code)
|
||||||
|
|
||||||
|
self.put('/', """
|
||||||
|
{
|
||||||
|
"listeners": {
|
||||||
|
"*:7080": {
|
||||||
|
"application": "app"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"applications": {
|
||||||
|
"app": {
|
||||||
|
"type": "python",
|
||||||
|
"workers": 1,
|
||||||
|
"path": "%s",
|
||||||
|
"module": "wsgi"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""" % (self.testdir + '/' + name))
|
||||||
|
|
||||||
|
body = 'Test body string.'
|
||||||
|
|
||||||
|
r = unit.TestUnitHTTP.post(headers={
|
||||||
|
'Host': 'localhost',
|
||||||
|
'Content-Type': 'text/html',
|
||||||
|
'Content-Length': str(len(body)),
|
||||||
|
'Custom-Header': 'blah'
|
||||||
|
}, body=body)
|
||||||
|
|
||||||
|
self.assertEqual(r.status_code, 200, 'status')
|
||||||
|
self.assertEqual(r.headers['Content-Length'], str(len(body)),
|
||||||
|
'header content length')
|
||||||
|
self.assertEqual(r.headers['Content-Type'], 'text/html',
|
||||||
|
'header content type')
|
||||||
|
self.assertEqual(r.headers['Request-Method'], 'POST',
|
||||||
|
'header request method')
|
||||||
|
self.assertEqual(r.headers['Request-Uri'], '/', 'header request uri')
|
||||||
|
self.assertEqual(r.headers['Path-Info'], '/', 'header path info')
|
||||||
|
self.assertEqual(r.headers['Http-Host'], 'localhost',
|
||||||
|
'header http host')
|
||||||
|
self.assertEqual(r.headers['Remote-Addr'], '127.0.0.1',
|
||||||
|
'header remote addr')
|
||||||
|
|
||||||
|
self.assertTry('assertEqual', 'header server port',
|
||||||
|
r.headers['Server-Port'], '7080')
|
||||||
|
|
||||||
|
self.assertEqual(r.headers['Server-Protocol'], 'HTTP/1.1',
|
||||||
|
'header server protocol')
|
||||||
|
self.assertEqual(r.headers['Custom-Header'], 'blah',
|
||||||
|
'header custom header')
|
||||||
|
self.assertEqual(r.content, str.encode(body), 'body')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
43
test/unit.py
43
test/unit.py
@@ -7,6 +7,7 @@ import shutil
|
|||||||
import socket
|
import socket
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
from requests import Request, Session
|
||||||
from subprocess import call
|
from subprocess import call
|
||||||
from multiprocessing import Process
|
from multiprocessing import Process
|
||||||
|
|
||||||
@@ -94,6 +95,12 @@ class TestUnit(unittest.TestCase):
|
|||||||
self.testdir + '/unit.log', self.testdir + '/control.unit.sock'):
|
self.testdir + '/unit.log', self.testdir + '/control.unit.sock'):
|
||||||
exit("Could not start unit")
|
exit("Could not start unit")
|
||||||
|
|
||||||
|
def python_application(self, name, code):
|
||||||
|
os.mkdir(self.testdir + '/' + name)
|
||||||
|
|
||||||
|
with open(self.testdir + '/' + name + '/wsgi.py', 'w') as f:
|
||||||
|
f.write(code)
|
||||||
|
|
||||||
def _stop(self):
|
def _stop(self):
|
||||||
with open(self.testdir + '/unit.pid', 'r') as f:
|
with open(self.testdir + '/unit.pid', 'r') as f:
|
||||||
pid = f.read().rstrip()
|
pid = f.read().rstrip()
|
||||||
@@ -200,3 +207,39 @@ class TestUnitControl(TestUnit):
|
|||||||
def _body_json(self, resp):
|
def _body_json(self, resp):
|
||||||
m = re.search('.*?\x0d\x0a?\x0d\x0a?(.*)', resp, re.M | re.S)
|
m = re.search('.*?\x0d\x0a?\x0d\x0a?(.*)', resp, re.M | re.S)
|
||||||
return json.loads(m.group(1))
|
return json.loads(m.group(1))
|
||||||
|
|
||||||
|
class TestUnitHTTP():
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def http(self, method, host='127.0.0.1:7080', uri='/', **kwargs):
|
||||||
|
if 'sess' in kwargs:
|
||||||
|
sess = kwargs['sess']
|
||||||
|
else:
|
||||||
|
sess = Session()
|
||||||
|
|
||||||
|
body = None
|
||||||
|
if 'body' in kwargs:
|
||||||
|
body = kwargs['body']
|
||||||
|
|
||||||
|
headers = None
|
||||||
|
if 'headers' in kwargs:
|
||||||
|
headers = kwargs['headers']
|
||||||
|
|
||||||
|
req = Request('POST', 'http://' + host + uri, headers=headers)
|
||||||
|
prepped = req.prepare()
|
||||||
|
|
||||||
|
prepped.body = body
|
||||||
|
|
||||||
|
r = sess.send(prepped)
|
||||||
|
|
||||||
|
if 'keep' not in kwargs:
|
||||||
|
sess.close()
|
||||||
|
return r
|
||||||
|
|
||||||
|
return (r, sess)
|
||||||
|
|
||||||
|
def get(**kwargs):
|
||||||
|
return TestUnitHTTP.http('GET', **kwargs)
|
||||||
|
|
||||||
|
def post(**kwargs):
|
||||||
|
return TestUnitHTTP.http('POST', **kwargs)
|
||||||
|
|||||||
Reference in New Issue
Block a user