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 12495Szelenkov@nginx.com conf = """ 13495Szelenkov@nginx.com { 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, 23495Szelenkov@nginx.com "path": "%s", 24495Szelenkov@nginx.com "module": "wsgi" 25495Szelenkov@nginx.com } 26495Szelenkov@nginx.com } 27495Szelenkov@nginx.com } 28495Szelenkov@nginx.com """ 29495Szelenkov@nginx.com 30495Szelenkov@nginx.com def test_python_application_simple(self): 31484Szelenkov@nginx.com code, name = """ 32484Szelenkov@nginx.com 33484Szelenkov@nginx.comdef application(environ, start_response): 34484Szelenkov@nginx.com 35484Szelenkov@nginx.com content_length = int(environ.get('CONTENT_LENGTH', 0)) 36484Szelenkov@nginx.com body = bytes(environ['wsgi.input'].read(content_length)) 37484Szelenkov@nginx.com 38484Szelenkov@nginx.com start_response('200 OK', [ 39484Szelenkov@nginx.com ('Content-Type', environ.get('CONTENT_TYPE')), 40484Szelenkov@nginx.com ('Content-Length', str(len(body))), 41484Szelenkov@nginx.com ('Request-Method', environ.get('REQUEST_METHOD')), 42484Szelenkov@nginx.com ('Request-Uri', environ.get('REQUEST_URI')), 43484Szelenkov@nginx.com ('Path-Info', environ.get('PATH_INFO')), 44484Szelenkov@nginx.com ('Http-Host', environ.get('HTTP_HOST')), 45484Szelenkov@nginx.com ('Remote-Addr', environ.get('REMOTE_ADDR')), 46484Szelenkov@nginx.com ('Server-Name', environ.get('SERVER_NAME')), 47484Szelenkov@nginx.com ('Server-Protocol', environ.get('SERVER_PROTOCOL')), 48484Szelenkov@nginx.com ('Custom-Header', environ.get('HTTP_CUSTOM_HEADER')) 49484Szelenkov@nginx.com ]) 50484Szelenkov@nginx.com return [body] 51484Szelenkov@nginx.com 52484Szelenkov@nginx.com""", 'py_app' 53484Szelenkov@nginx.com 54484Szelenkov@nginx.com self.python_application(name, code) 55495Szelenkov@nginx.com self.put('/', self.conf % (self.testdir + '/' + name)) 56484Szelenkov@nginx.com 57484Szelenkov@nginx.com body = 'Test body string.' 58484Szelenkov@nginx.com 59484Szelenkov@nginx.com r = unit.TestUnitHTTP.post(headers={ 60484Szelenkov@nginx.com 'Host': 'localhost', 61484Szelenkov@nginx.com 'Content-Type': 'text/html', 62484Szelenkov@nginx.com 'Custom-Header': 'blah' 63484Szelenkov@nginx.com }, data=body) 64484Szelenkov@nginx.com 65484Szelenkov@nginx.com self.assertEqual(r.status_code, 200, 'status') 66495Szelenkov@nginx.com headers = dict(r.headers) 67495Szelenkov@nginx.com self.assertRegex(headers.pop('Server'), r'unit/[\d\.]+', 68495Szelenkov@nginx.com 'server header') 69495Szelenkov@nginx.com self.assertDictEqual(headers, { 70495Szelenkov@nginx.com 'Content-Length': str(len(body)), 71495Szelenkov@nginx.com 'Content-Type': 'text/html', 72495Szelenkov@nginx.com 'Request-Method': 'POST', 73495Szelenkov@nginx.com 'Request-Uri': '/', 74495Szelenkov@nginx.com 'Path-Info': '/', 75495Szelenkov@nginx.com 'Http-Host': 'localhost', 76495Szelenkov@nginx.com 'Server-Name': 'localhost', 77495Szelenkov@nginx.com 'Remote-Addr': '127.0.0.1', 78495Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 79495Szelenkov@nginx.com 'Custom-Header': 'blah' 80495Szelenkov@nginx.com }, 'headers') 81495Szelenkov@nginx.com self.assertEqual(r.content, str.encode(body), 'body') 82484Szelenkov@nginx.com 83495Szelenkov@nginx.com @unittest.expectedFailure 84495Szelenkov@nginx.com def test_python_application_server_port(self): 85495Szelenkov@nginx.com code, name = """ 86495Szelenkov@nginx.com 87495Szelenkov@nginx.comdef application(environ, start_response): 88484Szelenkov@nginx.com 89495Szelenkov@nginx.com start_response('200 OK', [ 90495Szelenkov@nginx.com ('Content-Type', 'text/html'), 91495Szelenkov@nginx.com ('Server-Port', environ.get('SERVER_PORT')) 92495Szelenkov@nginx.com ]) 93495Szelenkov@nginx.com return [] 94495Szelenkov@nginx.com 95495Szelenkov@nginx.com""", 'py_app' 96495Szelenkov@nginx.com 97495Szelenkov@nginx.com self.python_application(name, code) 98495Szelenkov@nginx.com self.put('/', self.conf % (self.testdir + '/' + name)) 99495Szelenkov@nginx.com 100495Szelenkov@nginx.com r = unit.TestUnitHTTP.get(headers={'Host': 'localhost'}) 101495Szelenkov@nginx.com 102495Szelenkov@nginx.com self.assertEqual(r.headers.pop('Server-Port'), '7080', 103495Szelenkov@nginx.com 'Server-Port header') 104484Szelenkov@nginx.com 105*496Szelenkov@nginx.com @unittest.expectedFailure 106*496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 107*496Szelenkov@nginx.com code, name = """ 108*496Szelenkov@nginx.com 109*496Szelenkov@nginx.comdef application(environ, start_response): 110*496Szelenkov@nginx.com 111*496Szelenkov@nginx.com start_response('204 No Content', []) 112*496Szelenkov@nginx.com return [] 113*496Szelenkov@nginx.com 114*496Szelenkov@nginx.com""", 'py_app' 115*496Szelenkov@nginx.com 116*496Szelenkov@nginx.com self.python_application(name, code) 117*496Szelenkov@nginx.com self.put('/', self.conf % (self.testdir + '/' + name)) 118*496Szelenkov@nginx.com 119*496Szelenkov@nginx.com r = unit.TestUnitHTTP.get(headers={'Host': 'localhost'}) 120*496Szelenkov@nginx.com self.assertNotIn('Transfer-Encoding', r.headers, 121*496Szelenkov@nginx.com '204 header transfer encoding') 122484Szelenkov@nginx.com 123484Szelenkov@nginx.comif __name__ == '__main__': 124484Szelenkov@nginx.com unittest.main() 125