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): 71025Szelenkov@nginx.com prerequisites = ['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 74894Szelenkov@nginx.com def test_python_application_query_string_empty(self): 75894Szelenkov@nginx.com self.load('query_string') 76894Szelenkov@nginx.com 77894Szelenkov@nginx.com resp = self.get(url='/?') 78894Szelenkov@nginx.com 79894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string empty status') 801017Szelenkov@nginx.com self.assertEqual( 811017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string empty' 821017Szelenkov@nginx.com ) 83894Szelenkov@nginx.com 84894Szelenkov@nginx.com def test_python_application_query_string_absent(self): 85894Szelenkov@nginx.com self.load('query_string') 86894Szelenkov@nginx.com 87894Szelenkov@nginx.com resp = self.get() 88894Szelenkov@nginx.com 89894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string absent status') 901017Szelenkov@nginx.com self.assertEqual( 911017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string absent' 921017Szelenkov@nginx.com ) 93894Szelenkov@nginx.com 94495Szelenkov@nginx.com @unittest.expectedFailure 95495Szelenkov@nginx.com def test_python_application_server_port(self): 96552Szelenkov@nginx.com self.load('server_port') 97495Szelenkov@nginx.com 981017Szelenkov@nginx.com self.assertEqual( 991017Szelenkov@nginx.com self.get()['headers']['Server-Port'], '7080', 'Server-Port header' 1001017Szelenkov@nginx.com ) 101484Szelenkov@nginx.com 102496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 103552Szelenkov@nginx.com self.load('204_no_content') 104496Szelenkov@nginx.com 1051017Szelenkov@nginx.com self.assertNotIn( 1061017Szelenkov@nginx.com 'Transfer-Encoding', 1071017Szelenkov@nginx.com self.get()['headers'], 1081017Szelenkov@nginx.com '204 header transfer encoding', 1091017Szelenkov@nginx.com ) 110484Szelenkov@nginx.com 111602Szelenkov@nginx.com def test_python_application_ctx_iter_atexit(self): 112602Szelenkov@nginx.com self.load('ctx_iter_atexit') 113602Szelenkov@nginx.com 1141017Szelenkov@nginx.com resp = self.post( 1151017Szelenkov@nginx.com headers={ 1161017Szelenkov@nginx.com 'Host': 'localhost', 1171017Szelenkov@nginx.com 'Connection': 'close', 1181017Szelenkov@nginx.com 'Content-Type': 'text/html', 1191017Szelenkov@nginx.com }, 1201017Szelenkov@nginx.com body='0123456789', 1211017Szelenkov@nginx.com ) 122602Szelenkov@nginx.com 123602Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'ctx iter status') 124602Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'ctx iter body') 125602Szelenkov@nginx.com 1261017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 127602Szelenkov@nginx.com 128602Szelenkov@nginx.com self.stop() 129602Szelenkov@nginx.com 1301017Szelenkov@nginx.com self.assertIsNotNone( 131*1028Szelenkov@nginx.com self.wait_for_record(r'RuntimeError'), 'ctx iter atexit' 1321017Szelenkov@nginx.com ) 133602Szelenkov@nginx.com 134603Szelenkov@nginx.com def test_python_keepalive_body(self): 135603Szelenkov@nginx.com self.load('mirror') 136603Szelenkov@nginx.com 1371017Szelenkov@nginx.com (resp, sock) = self.post( 1381017Szelenkov@nginx.com headers={ 1391017Szelenkov@nginx.com 'Host': 'localhost', 1401017Szelenkov@nginx.com 'Connection': 'keep-alive', 1411017Szelenkov@nginx.com 'Content-Type': 'text/html', 1421017Szelenkov@nginx.com }, 1431017Szelenkov@nginx.com start=True, 1441017Szelenkov@nginx.com body='0123456789' * 500, 1451017Szelenkov@nginx.com ) 146603Szelenkov@nginx.com 147603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1') 148603Szelenkov@nginx.com 1491017Szelenkov@nginx.com resp = self.post( 1501017Szelenkov@nginx.com headers={ 1511017Szelenkov@nginx.com 'Host': 'localhost', 1521017Szelenkov@nginx.com 'Connection': 'close', 1531017Szelenkov@nginx.com 'Content-Type': 'text/html', 1541017Szelenkov@nginx.com }, 1551017Szelenkov@nginx.com sock=sock, 1561017Szelenkov@nginx.com body='0123456789', 1571017Szelenkov@nginx.com ) 158603Szelenkov@nginx.com 159603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'keep-alive 2') 160603Szelenkov@nginx.com 161684Szelenkov@nginx.com def test_python_keepalive_reconfigure(self): 1621017Szelenkov@nginx.com self.skip_alerts.extend( 1631017Szelenkov@nginx.com [ 1641017Szelenkov@nginx.com r'pthread_mutex.+failed', 1651017Szelenkov@nginx.com r'failed to apply', 1661017Szelenkov@nginx.com r'process \d+ exited on signal', 1671017Szelenkov@nginx.com ] 1681017Szelenkov@nginx.com ) 169684Szelenkov@nginx.com self.load('mirror') 170684Szelenkov@nginx.com 171684Szelenkov@nginx.com body = '0123456789' 172684Szelenkov@nginx.com conns = 3 173684Szelenkov@nginx.com socks = [] 174684Szelenkov@nginx.com 175684Szelenkov@nginx.com for i in range(conns): 1761017Szelenkov@nginx.com (resp, sock) = self.post( 1771017Szelenkov@nginx.com headers={ 1781017Szelenkov@nginx.com 'Host': 'localhost', 1791017Szelenkov@nginx.com 'Connection': 'keep-alive', 1801017Szelenkov@nginx.com 'Content-Type': 'text/html', 1811017Szelenkov@nginx.com }, 1821017Szelenkov@nginx.com start=True, 1831017Szelenkov@nginx.com body=body, 1841017Szelenkov@nginx.com ) 185684Szelenkov@nginx.com 186684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive open') 1871017Szelenkov@nginx.com self.assertIn( 1881017Szelenkov@nginx.com 'success', 1891026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 1901017Szelenkov@nginx.com 'reconfigure', 1911017Szelenkov@nginx.com ) 192684Szelenkov@nginx.com 193684Szelenkov@nginx.com socks.append(sock) 194684Szelenkov@nginx.com 195684Szelenkov@nginx.com for i in range(conns): 1961017Szelenkov@nginx.com (resp, sock) = self.post( 1971017Szelenkov@nginx.com headers={ 1981017Szelenkov@nginx.com 'Host': 'localhost', 1991017Szelenkov@nginx.com 'Connection': 'keep-alive', 2001017Szelenkov@nginx.com 'Content-Type': 'text/html', 2011017Szelenkov@nginx.com }, 2021017Szelenkov@nginx.com start=True, 2031017Szelenkov@nginx.com sock=socks[i], 2041017Szelenkov@nginx.com body=body, 2051017Szelenkov@nginx.com ) 206684Szelenkov@nginx.com 207684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive request') 2081017Szelenkov@nginx.com self.assertIn( 2091017Szelenkov@nginx.com 'success', 2101026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2111017Szelenkov@nginx.com 'reconfigure 2', 2121017Szelenkov@nginx.com ) 213684Szelenkov@nginx.com 214684Szelenkov@nginx.com for i in range(conns): 2151017Szelenkov@nginx.com resp = self.post( 2161017Szelenkov@nginx.com headers={ 2171017Szelenkov@nginx.com 'Host': 'localhost', 2181017Szelenkov@nginx.com 'Connection': 'close', 2191017Szelenkov@nginx.com 'Content-Type': 'text/html', 2201017Szelenkov@nginx.com }, 2211017Szelenkov@nginx.com sock=socks[i], 2221017Szelenkov@nginx.com body=body, 2231017Szelenkov@nginx.com ) 224684Szelenkov@nginx.com 225684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive close') 2261017Szelenkov@nginx.com self.assertIn( 2271017Szelenkov@nginx.com 'success', 2281026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2291017Szelenkov@nginx.com 'reconfigure 3', 2301017Szelenkov@nginx.com ) 231684Szelenkov@nginx.com 232750Szelenkov@nginx.com def test_python_keepalive_reconfigure_2(self): 233750Szelenkov@nginx.com self.load('mirror') 234750Szelenkov@nginx.com 235750Szelenkov@nginx.com body = '0123456789' 236750Szelenkov@nginx.com 2371017Szelenkov@nginx.com (resp, sock) = self.post( 2381017Szelenkov@nginx.com headers={ 2391017Szelenkov@nginx.com 'Host': 'localhost', 2401017Szelenkov@nginx.com 'Connection': 'keep-alive', 2411017Szelenkov@nginx.com 'Content-Type': 'text/html', 2421017Szelenkov@nginx.com }, 2431017Szelenkov@nginx.com start=True, 2441017Szelenkov@nginx.com body=body, 2451017Szelenkov@nginx.com ) 246750Szelenkov@nginx.com 247750Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1') 248750Szelenkov@nginx.com 249750Szelenkov@nginx.com self.load('empty') 250750Szelenkov@nginx.com 2511017Szelenkov@nginx.com (resp, sock) = self.post( 2521017Szelenkov@nginx.com headers={ 2531017Szelenkov@nginx.com 'Host': 'localhost', 2541017Szelenkov@nginx.com 'Connection': 'close', 2551017Szelenkov@nginx.com 'Content-Type': 'text/html', 2561017Szelenkov@nginx.com }, 2571017Szelenkov@nginx.com start=True, 2581017Szelenkov@nginx.com sock=sock, 2591017Szelenkov@nginx.com body=body, 2601017Szelenkov@nginx.com ) 261750Szelenkov@nginx.com 262750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2') 263750Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body') 264750Szelenkov@nginx.com 2651017Szelenkov@nginx.com self.assertIn( 2661017Szelenkov@nginx.com 'success', 2671017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 2681017Szelenkov@nginx.com 'reconfigure 2 clear configuration', 2691017Szelenkov@nginx.com ) 270750Szelenkov@nginx.com 271750Szelenkov@nginx.com resp = self.get(sock=sock) 272750Szelenkov@nginx.com 273750Szelenkov@nginx.com self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3') 274750Szelenkov@nginx.com 275750Szelenkov@nginx.com def test_python_keepalive_reconfigure_3(self): 276750Szelenkov@nginx.com self.load('empty') 277750Szelenkov@nginx.com 2781017Szelenkov@nginx.com (resp, sock) = self.http( 2791017Szelenkov@nginx.com b"""GET / HTTP/1.1 2801017Szelenkov@nginx.com""", 2811017Szelenkov@nginx.com start=True, 2821017Szelenkov@nginx.com raw=True, 2831017Szelenkov@nginx.com ) 284750Szelenkov@nginx.com 2851017Szelenkov@nginx.com self.assertIn( 2861017Szelenkov@nginx.com 'success', 2871017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 2881017Szelenkov@nginx.com 'reconfigure 3 clear configuration', 2891017Szelenkov@nginx.com ) 290750Szelenkov@nginx.com 2911017Szelenkov@nginx.com resp = self.http( 2921017Szelenkov@nginx.com b"""Host: localhost 293750Szelenkov@nginx.comConnection: close 294750Szelenkov@nginx.com 2951017Szelenkov@nginx.com""", 2961017Szelenkov@nginx.com sock=sock, 2971017Szelenkov@nginx.com raw=True, 2981017Szelenkov@nginx.com ) 299750Szelenkov@nginx.com 300750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 3') 301750Szelenkov@nginx.com 302603Szelenkov@nginx.com def test_python_atexit(self): 303603Szelenkov@nginx.com self.load('atexit') 304603Szelenkov@nginx.com 305603Szelenkov@nginx.com self.get() 306603Szelenkov@nginx.com 3071017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 308603Szelenkov@nginx.com 309603Szelenkov@nginx.com self.stop() 310603Szelenkov@nginx.com 311*1028Szelenkov@nginx.com self.assertIsNotNone( 312*1028Szelenkov@nginx.com self.wait_for_record(r'At exit called\.'), 'atexit' 313*1028Szelenkov@nginx.com ) 314603Szelenkov@nginx.com 315603Szelenkov@nginx.com @unittest.expectedFailure 316603Szelenkov@nginx.com def test_python_application_start_response_exit(self): 317603Szelenkov@nginx.com self.load('start_response_exit') 318603Szelenkov@nginx.com 319603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'start response exit') 320603Szelenkov@nginx.com 321603Szelenkov@nginx.com @unittest.expectedFailure 322603Szelenkov@nginx.com def test_python_application_input_iter(self): 323603Szelenkov@nginx.com self.load('input_iter') 324603Szelenkov@nginx.com 325603Szelenkov@nginx.com body = '0123456789' 326603Szelenkov@nginx.com 327603Szelenkov@nginx.com self.assertEqual(self.post(body=body)['body'], body, 'input iter') 328603Szelenkov@nginx.com 329603Szelenkov@nginx.com def test_python_application_input_read_length(self): 330603Szelenkov@nginx.com self.load('input_read_length') 331603Szelenkov@nginx.com 332603Szelenkov@nginx.com body = '0123456789' 333603Szelenkov@nginx.com 3341017Szelenkov@nginx.com resp = self.post( 3351017Szelenkov@nginx.com headers={ 3361017Szelenkov@nginx.com 'Host': 'localhost', 3371017Szelenkov@nginx.com 'Input-Length': '5', 3381017Szelenkov@nginx.com 'Connection': 'close', 3391017Szelenkov@nginx.com }, 3401017Szelenkov@nginx.com body=body, 3411017Szelenkov@nginx.com ) 342603Szelenkov@nginx.com 343603Szelenkov@nginx.com self.assertEqual(resp['body'], body[:5], 'input read length lt body') 344603Szelenkov@nginx.com 3451017Szelenkov@nginx.com resp = self.post( 3461017Szelenkov@nginx.com headers={ 3471017Szelenkov@nginx.com 'Host': 'localhost', 3481017Szelenkov@nginx.com 'Input-Length': '15', 3491017Szelenkov@nginx.com 'Connection': 'close', 3501017Szelenkov@nginx.com }, 3511017Szelenkov@nginx.com body=body, 3521017Szelenkov@nginx.com ) 353603Szelenkov@nginx.com 354603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length gt body') 355603Szelenkov@nginx.com 3561017Szelenkov@nginx.com resp = self.post( 3571017Szelenkov@nginx.com headers={ 3581017Szelenkov@nginx.com 'Host': 'localhost', 3591017Szelenkov@nginx.com 'Input-Length': '0', 3601017Szelenkov@nginx.com 'Connection': 'close', 3611017Szelenkov@nginx.com }, 3621017Szelenkov@nginx.com body=body, 3631017Szelenkov@nginx.com ) 364603Szelenkov@nginx.com 365603Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'input read length zero') 366603Szelenkov@nginx.com 3671017Szelenkov@nginx.com resp = self.post( 3681017Szelenkov@nginx.com headers={ 3691017Szelenkov@nginx.com 'Host': 'localhost', 3701017Szelenkov@nginx.com 'Input-Length': '-1', 3711017Szelenkov@nginx.com 'Connection': 'close', 3721017Szelenkov@nginx.com }, 3731017Szelenkov@nginx.com body=body, 3741017Szelenkov@nginx.com ) 375603Szelenkov@nginx.com 376603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length negative') 377603Szelenkov@nginx.com 378603Szelenkov@nginx.com @unittest.expectedFailure 379603Szelenkov@nginx.com def test_python_application_errors_write(self): 380603Szelenkov@nginx.com self.load('errors_write') 381603Szelenkov@nginx.com 382603Szelenkov@nginx.com self.get() 383603Szelenkov@nginx.com 384603Szelenkov@nginx.com self.stop() 385603Szelenkov@nginx.com 386603Szelenkov@nginx.com self.assertIsNotNone( 387*1028Szelenkov@nginx.com self.wait_for_record(r'\[error\].+Error in application\.'), 3881017Szelenkov@nginx.com 'errors write', 3891017Szelenkov@nginx.com ) 390603Szelenkov@nginx.com 391603Szelenkov@nginx.com def test_python_application_body_array(self): 392603Szelenkov@nginx.com self.load('body_array') 393603Szelenkov@nginx.com 394603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body array') 395603Szelenkov@nginx.com 396603Szelenkov@nginx.com def test_python_application_body_io(self): 397603Szelenkov@nginx.com self.load('body_io') 398603Szelenkov@nginx.com 399603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body io') 400603Szelenkov@nginx.com 401603Szelenkov@nginx.com def test_python_application_body_io_file(self): 402603Szelenkov@nginx.com self.load('body_io_file') 403603Szelenkov@nginx.com 404603Szelenkov@nginx.com self.assertEqual(self.get()['body'], 'body\n', 'body io file') 405603Szelenkov@nginx.com 406603Szelenkov@nginx.com @unittest.expectedFailure 407603Szelenkov@nginx.com def test_python_application_syntax_error(self): 408603Szelenkov@nginx.com self.skip_alerts.append(r'Python failed to import module "wsgi"') 409603Szelenkov@nginx.com self.load('syntax_error') 410603Szelenkov@nginx.com 411603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'syntax error') 412603Szelenkov@nginx.com 413603Szelenkov@nginx.com def test_python_application_close(self): 414603Szelenkov@nginx.com self.load('close') 415603Szelenkov@nginx.com 416603Szelenkov@nginx.com self.get() 417603Szelenkov@nginx.com 418603Szelenkov@nginx.com self.stop() 419603Szelenkov@nginx.com 420*1028Szelenkov@nginx.com self.assertIsNotNone(self.wait_for_record(r'Close called\.'), 'close') 421603Szelenkov@nginx.com 422603Szelenkov@nginx.com def test_python_application_close_error(self): 423603Szelenkov@nginx.com self.load('close_error') 424603Szelenkov@nginx.com 425603Szelenkov@nginx.com self.get() 426603Szelenkov@nginx.com 427603Szelenkov@nginx.com self.stop() 428603Szelenkov@nginx.com 4291017Szelenkov@nginx.com self.assertIsNotNone( 430*1028Szelenkov@nginx.com self.wait_for_record(r'Close called\.'), 'close error' 4311017Szelenkov@nginx.com ) 432603Szelenkov@nginx.com 433617Szelenkov@nginx.com def test_python_application_not_iterable(self): 434617Szelenkov@nginx.com self.load('not_iterable') 435617Szelenkov@nginx.com 436665Szelenkov@nginx.com self.get() 437617Szelenkov@nginx.com 438617Szelenkov@nginx.com self.stop() 439617Szelenkov@nginx.com 4401017Szelenkov@nginx.com self.assertIsNotNone( 441*1028Szelenkov@nginx.com self.wait_for_record( 4421017Szelenkov@nginx.com r'\[error\].+the application returned not an iterable object' 4431017Szelenkov@nginx.com ), 4441017Szelenkov@nginx.com 'not iterable', 4451017Szelenkov@nginx.com ) 446617Szelenkov@nginx.com 447664Szelenkov@nginx.com def test_python_application_write(self): 448664Szelenkov@nginx.com self.load('write') 449664Szelenkov@nginx.com 450664Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'write') 451664Szelenkov@nginx.com 4521017Szelenkov@nginx.com 453484Szelenkov@nginx.comif __name__ == '__main__': 4541019Szelenkov@nginx.com TestPythonApplication.main() 455