1899Szelenkov@nginx.comimport time 2484Szelenkov@nginx.comimport unittest 31019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 4484Szelenkov@nginx.com 51017Szelenkov@nginx.com 61019Szelenkov@nginx.comclass TestPythonApplication(TestApplicationPython): 71165Szelenkov@nginx.com prerequisites = {'modules': ['python']} 8484Szelenkov@nginx.com 9552Szelenkov@nginx.com def test_python_application_variables(self): 10552Szelenkov@nginx.com self.load('variables') 11484Szelenkov@nginx.com 12484Szelenkov@nginx.com body = 'Test body string.' 13484Szelenkov@nginx.com 141017Szelenkov@nginx.com resp = self.post( 151017Szelenkov@nginx.com headers={ 161017Szelenkov@nginx.com 'Host': 'localhost', 171017Szelenkov@nginx.com 'Content-Type': 'text/html', 181017Szelenkov@nginx.com 'Custom-Header': 'blah', 191017Szelenkov@nginx.com 'Connection': 'close', 201017Szelenkov@nginx.com }, 211017Szelenkov@nginx.com body=body, 221017Szelenkov@nginx.com ) 23484Szelenkov@nginx.com 24505Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 25505Szelenkov@nginx.com headers = resp['headers'] 26674Szelenkov@nginx.com header_server = headers.pop('Server') 27674Szelenkov@nginx.com self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header') 281017Szelenkov@nginx.com self.assertEqual( 291017Szelenkov@nginx.com headers.pop('Server-Software'), 301017Szelenkov@nginx.com header_server, 311017Szelenkov@nginx.com 'server software header', 321017Szelenkov@nginx.com ) 33599Szelenkov@nginx.com 34599Szelenkov@nginx.com date = headers.pop('Date') 35599Szelenkov@nginx.com self.assertEqual(date[-4:], ' GMT', 'date header timezone') 361017Szelenkov@nginx.com self.assertLess( 371017Szelenkov@nginx.com abs(self.date_to_sec_epoch(date) - self.sec_epoch()), 381017Szelenkov@nginx.com 5, 391017Szelenkov@nginx.com 'date header', 401017Szelenkov@nginx.com ) 41599Szelenkov@nginx.com 421017Szelenkov@nginx.com self.assertDictEqual( 431017Szelenkov@nginx.com headers, 441017Szelenkov@nginx.com { 451017Szelenkov@nginx.com 'Connection': 'close', 461017Szelenkov@nginx.com 'Content-Length': str(len(body)), 471017Szelenkov@nginx.com 'Content-Type': 'text/html', 481017Szelenkov@nginx.com 'Request-Method': 'POST', 491017Szelenkov@nginx.com 'Request-Uri': '/', 501017Szelenkov@nginx.com 'Http-Host': 'localhost', 511017Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 521017Szelenkov@nginx.com 'Custom-Header': 'blah', 531017Szelenkov@nginx.com 'Wsgi-Version': '(1, 0)', 541017Szelenkov@nginx.com 'Wsgi-Url-Scheme': 'http', 551017Szelenkov@nginx.com 'Wsgi-Multithread': 'False', 561017Szelenkov@nginx.com 'Wsgi-Multiprocess': 'True', 571017Szelenkov@nginx.com 'Wsgi-Run-Once': 'False', 581017Szelenkov@nginx.com }, 591017Szelenkov@nginx.com 'headers', 601017Szelenkov@nginx.com ) 61505Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'body') 62484Szelenkov@nginx.com 63497Szelenkov@nginx.com def test_python_application_query_string(self): 64552Szelenkov@nginx.com self.load('query_string') 65497Szelenkov@nginx.com 66505Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 67497Szelenkov@nginx.com 681017Szelenkov@nginx.com self.assertEqual( 691017Szelenkov@nginx.com resp['headers']['Query-String'], 701017Szelenkov@nginx.com 'var1=val1&var2=val2', 711017Szelenkov@nginx.com 'Query-String header', 721017Szelenkov@nginx.com ) 73497Szelenkov@nginx.com 741171Svbart@nginx.com def test_python_application_query_string_space(self): 751171Svbart@nginx.com self.load('query_string') 761171Svbart@nginx.com 771171Svbart@nginx.com resp = self.get(url='/ ?var1=val1&var2=val2') 781171Svbart@nginx.com self.assertEqual( 791171Svbart@nginx.com resp['headers']['Query-String'], 801171Svbart@nginx.com 'var1=val1&var2=val2', 811171Svbart@nginx.com 'Query-String space', 821171Svbart@nginx.com ) 831171Svbart@nginx.com 841171Svbart@nginx.com resp = self.get(url='/ %20?var1=val1&var2=val2') 851171Svbart@nginx.com self.assertEqual( 861171Svbart@nginx.com resp['headers']['Query-String'], 871171Svbart@nginx.com 'var1=val1&var2=val2', 881171Svbart@nginx.com 'Query-String space 2', 891171Svbart@nginx.com ) 901171Svbart@nginx.com 911171Svbart@nginx.com resp = self.get(url='/ %20 ?var1=val1&var2=val2') 921171Svbart@nginx.com self.assertEqual( 931171Svbart@nginx.com resp['headers']['Query-String'], 941171Svbart@nginx.com 'var1=val1&var2=val2', 951171Svbart@nginx.com 'Query-String space 3', 961171Svbart@nginx.com ) 971171Svbart@nginx.com 981171Svbart@nginx.com resp = self.get(url='/blah %20 blah? var1= val1 & var2=val2') 991171Svbart@nginx.com self.assertEqual( 1001171Svbart@nginx.com resp['headers']['Query-String'], 1011171Svbart@nginx.com ' var1= val1 & var2=val2', 1021171Svbart@nginx.com 'Query-String space 4', 1031171Svbart@nginx.com ) 1041171Svbart@nginx.com 105894Szelenkov@nginx.com def test_python_application_query_string_empty(self): 106894Szelenkov@nginx.com self.load('query_string') 107894Szelenkov@nginx.com 108894Szelenkov@nginx.com resp = self.get(url='/?') 109894Szelenkov@nginx.com 110894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string empty status') 1111017Szelenkov@nginx.com self.assertEqual( 1121017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string empty' 1131017Szelenkov@nginx.com ) 114894Szelenkov@nginx.com 115894Szelenkov@nginx.com def test_python_application_query_string_absent(self): 116894Szelenkov@nginx.com self.load('query_string') 117894Szelenkov@nginx.com 118894Szelenkov@nginx.com resp = self.get() 119894Szelenkov@nginx.com 120894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string absent status') 1211017Szelenkov@nginx.com self.assertEqual( 1221017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string absent' 1231017Szelenkov@nginx.com ) 124894Szelenkov@nginx.com 1251064Szelenkov@nginx.com @unittest.skip('not yet') 126495Szelenkov@nginx.com def test_python_application_server_port(self): 127552Szelenkov@nginx.com self.load('server_port') 128495Szelenkov@nginx.com 1291017Szelenkov@nginx.com self.assertEqual( 1301017Szelenkov@nginx.com self.get()['headers']['Server-Port'], '7080', 'Server-Port header' 1311017Szelenkov@nginx.com ) 132484Szelenkov@nginx.com 133*1250Szelenkov@nginx.com @unittest.skip('not yet') 134*1250Szelenkov@nginx.com def test_python_application_working_directory_invalid(self): 135*1250Szelenkov@nginx.com self.load('empty') 136*1250Szelenkov@nginx.com 137*1250Szelenkov@nginx.com self.assertIn( 138*1250Szelenkov@nginx.com 'success', 139*1250Szelenkov@nginx.com self.conf('"/blah"', 'applications/empty/working_directory'), 140*1250Szelenkov@nginx.com 'configure invalid working_directory', 141*1250Szelenkov@nginx.com ) 142*1250Szelenkov@nginx.com 143*1250Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'status') 144*1250Szelenkov@nginx.com 145496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 146552Szelenkov@nginx.com self.load('204_no_content') 147496Szelenkov@nginx.com 1481017Szelenkov@nginx.com self.assertNotIn( 1491017Szelenkov@nginx.com 'Transfer-Encoding', 1501017Szelenkov@nginx.com self.get()['headers'], 1511017Szelenkov@nginx.com '204 header transfer encoding', 1521017Szelenkov@nginx.com ) 153484Szelenkov@nginx.com 154602Szelenkov@nginx.com def test_python_application_ctx_iter_atexit(self): 155602Szelenkov@nginx.com self.load('ctx_iter_atexit') 156602Szelenkov@nginx.com 1571017Szelenkov@nginx.com resp = self.post( 1581017Szelenkov@nginx.com headers={ 1591017Szelenkov@nginx.com 'Host': 'localhost', 1601017Szelenkov@nginx.com 'Connection': 'close', 1611017Szelenkov@nginx.com 'Content-Type': 'text/html', 1621017Szelenkov@nginx.com }, 1631017Szelenkov@nginx.com body='0123456789', 1641017Szelenkov@nginx.com ) 165602Szelenkov@nginx.com 166602Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'ctx iter status') 167602Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'ctx iter body') 168602Szelenkov@nginx.com 1691017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 170602Szelenkov@nginx.com 171602Szelenkov@nginx.com self.stop() 172602Szelenkov@nginx.com 1731017Szelenkov@nginx.com self.assertIsNotNone( 1741028Szelenkov@nginx.com self.wait_for_record(r'RuntimeError'), 'ctx iter atexit' 1751017Szelenkov@nginx.com ) 176602Szelenkov@nginx.com 177603Szelenkov@nginx.com def test_python_keepalive_body(self): 178603Szelenkov@nginx.com self.load('mirror') 179603Szelenkov@nginx.com 1801029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 1811029Szelenkov@nginx.com 1821017Szelenkov@nginx.com (resp, sock) = self.post( 1831017Szelenkov@nginx.com headers={ 1841017Szelenkov@nginx.com 'Host': 'localhost', 1851017Szelenkov@nginx.com 'Connection': 'keep-alive', 1861017Szelenkov@nginx.com 'Content-Type': 'text/html', 1871017Szelenkov@nginx.com }, 1881017Szelenkov@nginx.com start=True, 1891017Szelenkov@nginx.com body='0123456789' * 500, 1901029Szelenkov@nginx.com read_timeout=1, 1911017Szelenkov@nginx.com ) 192603Szelenkov@nginx.com 193603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1') 194603Szelenkov@nginx.com 1951017Szelenkov@nginx.com resp = self.post( 1961017Szelenkov@nginx.com headers={ 1971017Szelenkov@nginx.com 'Host': 'localhost', 1981017Szelenkov@nginx.com 'Connection': 'close', 1991017Szelenkov@nginx.com 'Content-Type': 'text/html', 2001017Szelenkov@nginx.com }, 2011017Szelenkov@nginx.com sock=sock, 2021017Szelenkov@nginx.com body='0123456789', 2031017Szelenkov@nginx.com ) 204603Szelenkov@nginx.com 205603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'keep-alive 2') 206603Szelenkov@nginx.com 207684Szelenkov@nginx.com def test_python_keepalive_reconfigure(self): 2081017Szelenkov@nginx.com self.skip_alerts.extend( 2091017Szelenkov@nginx.com [ 2101017Szelenkov@nginx.com r'pthread_mutex.+failed', 2111017Szelenkov@nginx.com r'failed to apply', 2121017Szelenkov@nginx.com r'process \d+ exited on signal', 2131017Szelenkov@nginx.com ] 2141017Szelenkov@nginx.com ) 215684Szelenkov@nginx.com self.load('mirror') 216684Szelenkov@nginx.com 2171029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 2181029Szelenkov@nginx.com 219684Szelenkov@nginx.com body = '0123456789' 220684Szelenkov@nginx.com conns = 3 221684Szelenkov@nginx.com socks = [] 222684Szelenkov@nginx.com 223684Szelenkov@nginx.com for i in range(conns): 2241017Szelenkov@nginx.com (resp, sock) = self.post( 2251017Szelenkov@nginx.com headers={ 2261017Szelenkov@nginx.com 'Host': 'localhost', 2271017Szelenkov@nginx.com 'Connection': 'keep-alive', 2281017Szelenkov@nginx.com 'Content-Type': 'text/html', 2291017Szelenkov@nginx.com }, 2301017Szelenkov@nginx.com start=True, 2311017Szelenkov@nginx.com body=body, 2321029Szelenkov@nginx.com read_timeout=1, 2331017Szelenkov@nginx.com ) 234684Szelenkov@nginx.com 235684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive open') 2361017Szelenkov@nginx.com self.assertIn( 2371017Szelenkov@nginx.com 'success', 2381026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2391017Szelenkov@nginx.com 'reconfigure', 2401017Szelenkov@nginx.com ) 241684Szelenkov@nginx.com 242684Szelenkov@nginx.com socks.append(sock) 243684Szelenkov@nginx.com 244684Szelenkov@nginx.com for i in range(conns): 2451017Szelenkov@nginx.com (resp, sock) = self.post( 2461017Szelenkov@nginx.com headers={ 2471017Szelenkov@nginx.com 'Host': 'localhost', 2481017Szelenkov@nginx.com 'Connection': 'keep-alive', 2491017Szelenkov@nginx.com 'Content-Type': 'text/html', 2501017Szelenkov@nginx.com }, 2511017Szelenkov@nginx.com start=True, 2521017Szelenkov@nginx.com sock=socks[i], 2531017Szelenkov@nginx.com body=body, 2541029Szelenkov@nginx.com read_timeout=1, 2551017Szelenkov@nginx.com ) 256684Szelenkov@nginx.com 257684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive request') 2581017Szelenkov@nginx.com self.assertIn( 2591017Szelenkov@nginx.com 'success', 2601026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2611017Szelenkov@nginx.com 'reconfigure 2', 2621017Szelenkov@nginx.com ) 263684Szelenkov@nginx.com 264684Szelenkov@nginx.com for i in range(conns): 2651017Szelenkov@nginx.com resp = self.post( 2661017Szelenkov@nginx.com headers={ 2671017Szelenkov@nginx.com 'Host': 'localhost', 2681017Szelenkov@nginx.com 'Connection': 'close', 2691017Szelenkov@nginx.com 'Content-Type': 'text/html', 2701017Szelenkov@nginx.com }, 2711017Szelenkov@nginx.com sock=socks[i], 2721017Szelenkov@nginx.com body=body, 2731017Szelenkov@nginx.com ) 274684Szelenkov@nginx.com 275684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive close') 2761017Szelenkov@nginx.com self.assertIn( 2771017Szelenkov@nginx.com 'success', 2781026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2791017Szelenkov@nginx.com 'reconfigure 3', 2801017Szelenkov@nginx.com ) 281684Szelenkov@nginx.com 282750Szelenkov@nginx.com def test_python_keepalive_reconfigure_2(self): 283750Szelenkov@nginx.com self.load('mirror') 284750Szelenkov@nginx.com 2851029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 2861029Szelenkov@nginx.com 287750Szelenkov@nginx.com body = '0123456789' 288750Szelenkov@nginx.com 2891017Szelenkov@nginx.com (resp, sock) = self.post( 2901017Szelenkov@nginx.com headers={ 2911017Szelenkov@nginx.com 'Host': 'localhost', 2921017Szelenkov@nginx.com 'Connection': 'keep-alive', 2931017Szelenkov@nginx.com 'Content-Type': 'text/html', 2941017Szelenkov@nginx.com }, 2951017Szelenkov@nginx.com start=True, 2961017Szelenkov@nginx.com body=body, 2971029Szelenkov@nginx.com read_timeout=1, 2981017Szelenkov@nginx.com ) 299750Szelenkov@nginx.com 300750Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1') 301750Szelenkov@nginx.com 302750Szelenkov@nginx.com self.load('empty') 303750Szelenkov@nginx.com 3041029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 3051029Szelenkov@nginx.com 3061017Szelenkov@nginx.com (resp, sock) = self.post( 3071017Szelenkov@nginx.com headers={ 3081017Szelenkov@nginx.com 'Host': 'localhost', 3091017Szelenkov@nginx.com 'Connection': 'close', 3101017Szelenkov@nginx.com 'Content-Type': 'text/html', 3111017Szelenkov@nginx.com }, 3121017Szelenkov@nginx.com start=True, 3131017Szelenkov@nginx.com sock=sock, 3141017Szelenkov@nginx.com body=body, 3151017Szelenkov@nginx.com ) 316750Szelenkov@nginx.com 317750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2') 318750Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body') 319750Szelenkov@nginx.com 3201017Szelenkov@nginx.com self.assertIn( 3211017Szelenkov@nginx.com 'success', 3221017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 3231017Szelenkov@nginx.com 'reconfigure 2 clear configuration', 3241017Szelenkov@nginx.com ) 325750Szelenkov@nginx.com 326750Szelenkov@nginx.com resp = self.get(sock=sock) 327750Szelenkov@nginx.com 328750Szelenkov@nginx.com self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3') 329750Szelenkov@nginx.com 330750Szelenkov@nginx.com def test_python_keepalive_reconfigure_3(self): 331750Szelenkov@nginx.com self.load('empty') 332750Szelenkov@nginx.com 3331029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 3341029Szelenkov@nginx.com 3351017Szelenkov@nginx.com (resp, sock) = self.http( 3361017Szelenkov@nginx.com b"""GET / HTTP/1.1 3371017Szelenkov@nginx.com""", 3381017Szelenkov@nginx.com start=True, 3391017Szelenkov@nginx.com raw=True, 3401043Szelenkov@nginx.com read_timeout=5, 3411017Szelenkov@nginx.com ) 342750Szelenkov@nginx.com 3431017Szelenkov@nginx.com self.assertIn( 3441017Szelenkov@nginx.com 'success', 3451017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 3461017Szelenkov@nginx.com 'reconfigure 3 clear configuration', 3471017Szelenkov@nginx.com ) 348750Szelenkov@nginx.com 3491017Szelenkov@nginx.com resp = self.http( 3501017Szelenkov@nginx.com b"""Host: localhost 351750Szelenkov@nginx.comConnection: close 352750Szelenkov@nginx.com 3531017Szelenkov@nginx.com""", 3541017Szelenkov@nginx.com sock=sock, 3551017Szelenkov@nginx.com raw=True, 3561017Szelenkov@nginx.com ) 357750Szelenkov@nginx.com 358750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 3') 359750Szelenkov@nginx.com 360603Szelenkov@nginx.com def test_python_atexit(self): 361603Szelenkov@nginx.com self.load('atexit') 362603Szelenkov@nginx.com 363603Szelenkov@nginx.com self.get() 364603Szelenkov@nginx.com 3651017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 366603Szelenkov@nginx.com 367603Szelenkov@nginx.com self.stop() 368603Szelenkov@nginx.com 3691028Szelenkov@nginx.com self.assertIsNotNone( 3701028Szelenkov@nginx.com self.wait_for_record(r'At exit called\.'), 'atexit' 3711028Szelenkov@nginx.com ) 372603Szelenkov@nginx.com 3731064Szelenkov@nginx.com @unittest.skip('not yet') 374603Szelenkov@nginx.com def test_python_application_start_response_exit(self): 375603Szelenkov@nginx.com self.load('start_response_exit') 376603Szelenkov@nginx.com 377603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'start response exit') 378603Szelenkov@nginx.com 3791064Szelenkov@nginx.com @unittest.skip('not yet') 380603Szelenkov@nginx.com def test_python_application_input_iter(self): 381603Szelenkov@nginx.com self.load('input_iter') 382603Szelenkov@nginx.com 383603Szelenkov@nginx.com body = '0123456789' 384603Szelenkov@nginx.com 385603Szelenkov@nginx.com self.assertEqual(self.post(body=body)['body'], body, 'input iter') 386603Szelenkov@nginx.com 387603Szelenkov@nginx.com def test_python_application_input_read_length(self): 388603Szelenkov@nginx.com self.load('input_read_length') 389603Szelenkov@nginx.com 390603Szelenkov@nginx.com body = '0123456789' 391603Szelenkov@nginx.com 3921017Szelenkov@nginx.com resp = self.post( 3931017Szelenkov@nginx.com headers={ 3941017Szelenkov@nginx.com 'Host': 'localhost', 3951017Szelenkov@nginx.com 'Input-Length': '5', 3961017Szelenkov@nginx.com 'Connection': 'close', 3971017Szelenkov@nginx.com }, 3981017Szelenkov@nginx.com body=body, 3991017Szelenkov@nginx.com ) 400603Szelenkov@nginx.com 401603Szelenkov@nginx.com self.assertEqual(resp['body'], body[:5], 'input read length lt body') 402603Szelenkov@nginx.com 4031017Szelenkov@nginx.com resp = self.post( 4041017Szelenkov@nginx.com headers={ 4051017Szelenkov@nginx.com 'Host': 'localhost', 4061017Szelenkov@nginx.com 'Input-Length': '15', 4071017Szelenkov@nginx.com 'Connection': 'close', 4081017Szelenkov@nginx.com }, 4091017Szelenkov@nginx.com body=body, 4101017Szelenkov@nginx.com ) 411603Szelenkov@nginx.com 412603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length gt body') 413603Szelenkov@nginx.com 4141017Szelenkov@nginx.com resp = self.post( 4151017Szelenkov@nginx.com headers={ 4161017Szelenkov@nginx.com 'Host': 'localhost', 4171017Szelenkov@nginx.com 'Input-Length': '0', 4181017Szelenkov@nginx.com 'Connection': 'close', 4191017Szelenkov@nginx.com }, 4201017Szelenkov@nginx.com body=body, 4211017Szelenkov@nginx.com ) 422603Szelenkov@nginx.com 423603Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'input read length zero') 424603Szelenkov@nginx.com 4251017Szelenkov@nginx.com resp = self.post( 4261017Szelenkov@nginx.com headers={ 4271017Szelenkov@nginx.com 'Host': 'localhost', 4281017Szelenkov@nginx.com 'Input-Length': '-1', 4291017Szelenkov@nginx.com 'Connection': 'close', 4301017Szelenkov@nginx.com }, 4311017Szelenkov@nginx.com body=body, 4321017Szelenkov@nginx.com ) 433603Szelenkov@nginx.com 434603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length negative') 435603Szelenkov@nginx.com 4361064Szelenkov@nginx.com @unittest.skip('not yet') 437603Szelenkov@nginx.com def test_python_application_errors_write(self): 438603Szelenkov@nginx.com self.load('errors_write') 439603Szelenkov@nginx.com 440603Szelenkov@nginx.com self.get() 441603Szelenkov@nginx.com 442603Szelenkov@nginx.com self.stop() 443603Szelenkov@nginx.com 444603Szelenkov@nginx.com self.assertIsNotNone( 4451028Szelenkov@nginx.com self.wait_for_record(r'\[error\].+Error in application\.'), 4461017Szelenkov@nginx.com 'errors write', 4471017Szelenkov@nginx.com ) 448603Szelenkov@nginx.com 449603Szelenkov@nginx.com def test_python_application_body_array(self): 450603Szelenkov@nginx.com self.load('body_array') 451603Szelenkov@nginx.com 452603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body array') 453603Szelenkov@nginx.com 454603Szelenkov@nginx.com def test_python_application_body_io(self): 455603Szelenkov@nginx.com self.load('body_io') 456603Szelenkov@nginx.com 457603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body io') 458603Szelenkov@nginx.com 459603Szelenkov@nginx.com def test_python_application_body_io_file(self): 460603Szelenkov@nginx.com self.load('body_io_file') 461603Szelenkov@nginx.com 462603Szelenkov@nginx.com self.assertEqual(self.get()['body'], 'body\n', 'body io file') 463603Szelenkov@nginx.com 4641064Szelenkov@nginx.com @unittest.skip('not yet') 465603Szelenkov@nginx.com def test_python_application_syntax_error(self): 466603Szelenkov@nginx.com self.skip_alerts.append(r'Python failed to import module "wsgi"') 467603Szelenkov@nginx.com self.load('syntax_error') 468603Szelenkov@nginx.com 469603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'syntax error') 470603Szelenkov@nginx.com 471603Szelenkov@nginx.com def test_python_application_close(self): 472603Szelenkov@nginx.com self.load('close') 473603Szelenkov@nginx.com 474603Szelenkov@nginx.com self.get() 475603Szelenkov@nginx.com 476603Szelenkov@nginx.com self.stop() 477603Szelenkov@nginx.com 4781028Szelenkov@nginx.com self.assertIsNotNone(self.wait_for_record(r'Close called\.'), 'close') 479603Szelenkov@nginx.com 480603Szelenkov@nginx.com def test_python_application_close_error(self): 481603Szelenkov@nginx.com self.load('close_error') 482603Szelenkov@nginx.com 483603Szelenkov@nginx.com self.get() 484603Szelenkov@nginx.com 485603Szelenkov@nginx.com self.stop() 486603Szelenkov@nginx.com 4871017Szelenkov@nginx.com self.assertIsNotNone( 4881028Szelenkov@nginx.com self.wait_for_record(r'Close called\.'), 'close error' 4891017Szelenkov@nginx.com ) 490603Szelenkov@nginx.com 491617Szelenkov@nginx.com def test_python_application_not_iterable(self): 492617Szelenkov@nginx.com self.load('not_iterable') 493617Szelenkov@nginx.com 494665Szelenkov@nginx.com self.get() 495617Szelenkov@nginx.com 496617Szelenkov@nginx.com self.stop() 497617Szelenkov@nginx.com 4981017Szelenkov@nginx.com self.assertIsNotNone( 4991028Szelenkov@nginx.com self.wait_for_record( 5001017Szelenkov@nginx.com r'\[error\].+the application returned not an iterable object' 5011017Szelenkov@nginx.com ), 5021017Szelenkov@nginx.com 'not iterable', 5031017Szelenkov@nginx.com ) 504617Szelenkov@nginx.com 505664Szelenkov@nginx.com def test_python_application_write(self): 506664Szelenkov@nginx.com self.load('write') 507664Szelenkov@nginx.com 508664Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'write') 509664Szelenkov@nginx.com 5101017Szelenkov@nginx.com 511484Szelenkov@nginx.comif __name__ == '__main__': 5121019Szelenkov@nginx.com TestPythonApplication.main() 513