1484Szelenkov@nginx.comimport unittest 2484Szelenkov@nginx.comimport unit 3484Szelenkov@nginx.com 4484Szelenkov@nginx.comclass TestUnitApplication(unit.TestUnitControl): 5484Szelenkov@nginx.com 6484Szelenkov@nginx.com def setUpClass(): 7484Szelenkov@nginx.com u = unit.TestUnit() 8484Szelenkov@nginx.com 9484Szelenkov@nginx.com u.check_modules('python') 10484Szelenkov@nginx.com u.check_version('0.4') 11484Szelenkov@nginx.com 12504Szelenkov@nginx.com def conf_with_name(self, name): 13504Szelenkov@nginx.com self.conf({ 14495Szelenkov@nginx.com "listeners": { 15495Szelenkov@nginx.com "*:7080": { 16495Szelenkov@nginx.com "application": "app" 17495Szelenkov@nginx.com } 18495Szelenkov@nginx.com }, 19495Szelenkov@nginx.com "applications": { 20495Szelenkov@nginx.com "app": { 21495Szelenkov@nginx.com "type": "python", 22495Szelenkov@nginx.com "workers": 1, 23504Szelenkov@nginx.com "path": self.testdir + '/' + name, 24495Szelenkov@nginx.com "module": "wsgi" 25495Szelenkov@nginx.com } 26495Szelenkov@nginx.com } 27504Szelenkov@nginx.com }) 28495Szelenkov@nginx.com 29495Szelenkov@nginx.com def test_python_application_simple(self): 30484Szelenkov@nginx.com code, name = """ 31484Szelenkov@nginx.com 32484Szelenkov@nginx.comdef application(environ, start_response): 33484Szelenkov@nginx.com 34484Szelenkov@nginx.com content_length = int(environ.get('CONTENT_LENGTH', 0)) 35484Szelenkov@nginx.com body = bytes(environ['wsgi.input'].read(content_length)) 36484Szelenkov@nginx.com 37503Szelenkov@nginx.com start_response('200', [ 38484Szelenkov@nginx.com ('Content-Type', environ.get('CONTENT_TYPE')), 39484Szelenkov@nginx.com ('Content-Length', str(len(body))), 40484Szelenkov@nginx.com ('Request-Method', environ.get('REQUEST_METHOD')), 41484Szelenkov@nginx.com ('Request-Uri', environ.get('REQUEST_URI')), 42484Szelenkov@nginx.com ('Http-Host', environ.get('HTTP_HOST')), 43484Szelenkov@nginx.com ('Server-Protocol', environ.get('SERVER_PROTOCOL')), 44484Szelenkov@nginx.com ('Custom-Header', environ.get('HTTP_CUSTOM_HEADER')) 45484Szelenkov@nginx.com ]) 46484Szelenkov@nginx.com return [body] 47484Szelenkov@nginx.com 48484Szelenkov@nginx.com""", 'py_app' 49484Szelenkov@nginx.com 50484Szelenkov@nginx.com self.python_application(name, code) 51504Szelenkov@nginx.com self.conf_with_name(name) 52484Szelenkov@nginx.com 53484Szelenkov@nginx.com body = 'Test body string.' 54484Szelenkov@nginx.com 55*505Szelenkov@nginx.com resp = self.post(headers={ 56484Szelenkov@nginx.com 'Host': 'localhost', 57484Szelenkov@nginx.com 'Content-Type': 'text/html', 58484Szelenkov@nginx.com 'Custom-Header': 'blah' 59*505Szelenkov@nginx.com }, body=body) 60484Szelenkov@nginx.com 61*505Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 62*505Szelenkov@nginx.com headers = resp['headers'] 63495Szelenkov@nginx.com self.assertRegex(headers.pop('Server'), r'unit/[\d\.]+', 64495Szelenkov@nginx.com 'server header') 65495Szelenkov@nginx.com self.assertDictEqual(headers, { 66495Szelenkov@nginx.com 'Content-Length': str(len(body)), 67495Szelenkov@nginx.com 'Content-Type': 'text/html', 68495Szelenkov@nginx.com 'Request-Method': 'POST', 69495Szelenkov@nginx.com 'Request-Uri': '/', 70495Szelenkov@nginx.com 'Http-Host': 'localhost', 71495Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 72495Szelenkov@nginx.com 'Custom-Header': 'blah' 73495Szelenkov@nginx.com }, 'headers') 74*505Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'body') 75484Szelenkov@nginx.com 76497Szelenkov@nginx.com def test_python_application_query_string(self): 77497Szelenkov@nginx.com code, name = """ 78497Szelenkov@nginx.com 79497Szelenkov@nginx.comdef application(environ, start_response): 80497Szelenkov@nginx.com 81503Szelenkov@nginx.com start_response('200', [ 82497Szelenkov@nginx.com ('Content-Length', '0'), 83497Szelenkov@nginx.com ('Query-String', environ.get('QUERY_STRING')) 84497Szelenkov@nginx.com ]) 85497Szelenkov@nginx.com return [] 86497Szelenkov@nginx.com 87497Szelenkov@nginx.com""", 'py_app' 88497Szelenkov@nginx.com 89497Szelenkov@nginx.com self.python_application(name, code) 90504Szelenkov@nginx.com self.conf_with_name(name) 91497Szelenkov@nginx.com 92*505Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 93497Szelenkov@nginx.com 94*505Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 95*505Szelenkov@nginx.com headers = resp['headers'] 96497Szelenkov@nginx.com headers.pop('Server') 97497Szelenkov@nginx.com self.assertDictEqual(headers, { 98497Szelenkov@nginx.com 'Content-Length': '0', 99503Szelenkov@nginx.com 'Query-String': 'var1=val1&var2=val2' 100497Szelenkov@nginx.com }, 'headers') 101497Szelenkov@nginx.com 102495Szelenkov@nginx.com @unittest.expectedFailure 103495Szelenkov@nginx.com def test_python_application_server_port(self): 104495Szelenkov@nginx.com code, name = """ 105495Szelenkov@nginx.com 106495Szelenkov@nginx.comdef application(environ, start_response): 107484Szelenkov@nginx.com 108503Szelenkov@nginx.com start_response('200', [ 109503Szelenkov@nginx.com ('Content-Length', '0'), 110495Szelenkov@nginx.com ('Server-Port', environ.get('SERVER_PORT')) 111495Szelenkov@nginx.com ]) 112495Szelenkov@nginx.com return [] 113495Szelenkov@nginx.com 114495Szelenkov@nginx.com""", 'py_app' 115495Szelenkov@nginx.com 116495Szelenkov@nginx.com self.python_application(name, code) 117504Szelenkov@nginx.com self.conf_with_name(name) 118495Szelenkov@nginx.com 119*505Szelenkov@nginx.com self.assertEqual(self.get()['headers']['Server-Port'], '7080', 120495Szelenkov@nginx.com 'Server-Port header') 121484Szelenkov@nginx.com 122496Szelenkov@nginx.com @unittest.expectedFailure 123496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 124496Szelenkov@nginx.com code, name = """ 125496Szelenkov@nginx.com 126496Szelenkov@nginx.comdef application(environ, start_response): 127496Szelenkov@nginx.com 128496Szelenkov@nginx.com start_response('204 No Content', []) 129496Szelenkov@nginx.com return [] 130496Szelenkov@nginx.com 131496Szelenkov@nginx.com""", 'py_app' 132496Szelenkov@nginx.com 133496Szelenkov@nginx.com self.python_application(name, code) 134504Szelenkov@nginx.com self.conf_with_name(name) 135496Szelenkov@nginx.com 136*505Szelenkov@nginx.com self.assertNotIn('Transfer-Encoding', self.get()['headers'], 137496Szelenkov@nginx.com '204 header transfer encoding') 138484Szelenkov@nginx.com 139484Szelenkov@nginx.comif __name__ == '__main__': 140484Szelenkov@nginx.com unittest.main() 141