1899Szelenkov@nginx.comimport time 2484Szelenkov@nginx.comimport unittest 3484Szelenkov@nginx.comimport unit 4484Szelenkov@nginx.com 5*1017Szelenkov@nginx.com 6552Szelenkov@nginx.comclass TestUnitPythonApplication(unit.TestUnitApplicationPython): 7484Szelenkov@nginx.com def setUpClass(): 8550Szelenkov@nginx.com unit.TestUnit().check_modules('python') 9484Szelenkov@nginx.com 10552Szelenkov@nginx.com def test_python_application_variables(self): 11552Szelenkov@nginx.com self.load('variables') 12484Szelenkov@nginx.com 13484Szelenkov@nginx.com body = 'Test body string.' 14484Szelenkov@nginx.com 15*1017Szelenkov@nginx.com resp = self.post( 16*1017Szelenkov@nginx.com headers={ 17*1017Szelenkov@nginx.com 'Host': 'localhost', 18*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 19*1017Szelenkov@nginx.com 'Custom-Header': 'blah', 20*1017Szelenkov@nginx.com 'Connection': 'close', 21*1017Szelenkov@nginx.com }, 22*1017Szelenkov@nginx.com body=body, 23*1017Szelenkov@nginx.com ) 24484Szelenkov@nginx.com 25505Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 26505Szelenkov@nginx.com headers = resp['headers'] 27674Szelenkov@nginx.com header_server = headers.pop('Server') 28674Szelenkov@nginx.com self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header') 29*1017Szelenkov@nginx.com self.assertEqual( 30*1017Szelenkov@nginx.com headers.pop('Server-Software'), 31*1017Szelenkov@nginx.com header_server, 32*1017Szelenkov@nginx.com 'server software header', 33*1017Szelenkov@nginx.com ) 34599Szelenkov@nginx.com 35599Szelenkov@nginx.com date = headers.pop('Date') 36599Szelenkov@nginx.com self.assertEqual(date[-4:], ' GMT', 'date header timezone') 37*1017Szelenkov@nginx.com self.assertLess( 38*1017Szelenkov@nginx.com abs(self.date_to_sec_epoch(date) - self.sec_epoch()), 39*1017Szelenkov@nginx.com 5, 40*1017Szelenkov@nginx.com 'date header', 41*1017Szelenkov@nginx.com ) 42599Szelenkov@nginx.com 43*1017Szelenkov@nginx.com self.assertDictEqual( 44*1017Szelenkov@nginx.com headers, 45*1017Szelenkov@nginx.com { 46*1017Szelenkov@nginx.com 'Connection': 'close', 47*1017Szelenkov@nginx.com 'Content-Length': str(len(body)), 48*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 49*1017Szelenkov@nginx.com 'Request-Method': 'POST', 50*1017Szelenkov@nginx.com 'Request-Uri': '/', 51*1017Szelenkov@nginx.com 'Http-Host': 'localhost', 52*1017Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 53*1017Szelenkov@nginx.com 'Custom-Header': 'blah', 54*1017Szelenkov@nginx.com 'Wsgi-Version': '(1, 0)', 55*1017Szelenkov@nginx.com 'Wsgi-Url-Scheme': 'http', 56*1017Szelenkov@nginx.com 'Wsgi-Multithread': 'False', 57*1017Szelenkov@nginx.com 'Wsgi-Multiprocess': 'True', 58*1017Szelenkov@nginx.com 'Wsgi-Run-Once': 'False', 59*1017Szelenkov@nginx.com }, 60*1017Szelenkov@nginx.com 'headers', 61*1017Szelenkov@nginx.com ) 62505Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'body') 63484Szelenkov@nginx.com 64497Szelenkov@nginx.com def test_python_application_query_string(self): 65552Szelenkov@nginx.com self.load('query_string') 66497Szelenkov@nginx.com 67505Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 68497Szelenkov@nginx.com 69*1017Szelenkov@nginx.com self.assertEqual( 70*1017Szelenkov@nginx.com resp['headers']['Query-String'], 71*1017Szelenkov@nginx.com 'var1=val1&var2=val2', 72*1017Szelenkov@nginx.com 'Query-String header', 73*1017Szelenkov@nginx.com ) 74497Szelenkov@nginx.com 75894Szelenkov@nginx.com def test_python_application_query_string_empty(self): 76894Szelenkov@nginx.com self.load('query_string') 77894Szelenkov@nginx.com 78894Szelenkov@nginx.com resp = self.get(url='/?') 79894Szelenkov@nginx.com 80894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string empty status') 81*1017Szelenkov@nginx.com self.assertEqual( 82*1017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string empty' 83*1017Szelenkov@nginx.com ) 84894Szelenkov@nginx.com 85894Szelenkov@nginx.com def test_python_application_query_string_absent(self): 86894Szelenkov@nginx.com self.load('query_string') 87894Szelenkov@nginx.com 88894Szelenkov@nginx.com resp = self.get() 89894Szelenkov@nginx.com 90894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string absent status') 91*1017Szelenkov@nginx.com self.assertEqual( 92*1017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string absent' 93*1017Szelenkov@nginx.com ) 94894Szelenkov@nginx.com 95495Szelenkov@nginx.com @unittest.expectedFailure 96495Szelenkov@nginx.com def test_python_application_server_port(self): 97552Szelenkov@nginx.com self.load('server_port') 98495Szelenkov@nginx.com 99*1017Szelenkov@nginx.com self.assertEqual( 100*1017Szelenkov@nginx.com self.get()['headers']['Server-Port'], '7080', 'Server-Port header' 101*1017Szelenkov@nginx.com ) 102484Szelenkov@nginx.com 103496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 104552Szelenkov@nginx.com self.load('204_no_content') 105496Szelenkov@nginx.com 106*1017Szelenkov@nginx.com self.assertNotIn( 107*1017Szelenkov@nginx.com 'Transfer-Encoding', 108*1017Szelenkov@nginx.com self.get()['headers'], 109*1017Szelenkov@nginx.com '204 header transfer encoding', 110*1017Szelenkov@nginx.com ) 111484Szelenkov@nginx.com 112602Szelenkov@nginx.com def test_python_application_ctx_iter_atexit(self): 113602Szelenkov@nginx.com self.load('ctx_iter_atexit') 114602Szelenkov@nginx.com 115*1017Szelenkov@nginx.com resp = self.post( 116*1017Szelenkov@nginx.com headers={ 117*1017Szelenkov@nginx.com 'Host': 'localhost', 118*1017Szelenkov@nginx.com 'Connection': 'close', 119*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 120*1017Szelenkov@nginx.com }, 121*1017Szelenkov@nginx.com body='0123456789', 122*1017Szelenkov@nginx.com ) 123602Szelenkov@nginx.com 124602Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'ctx iter status') 125602Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'ctx iter body') 126602Szelenkov@nginx.com 127*1017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 128602Szelenkov@nginx.com 129602Szelenkov@nginx.com self.stop() 130602Szelenkov@nginx.com 131899Szelenkov@nginx.com time.sleep(0.2) 132899Szelenkov@nginx.com 133*1017Szelenkov@nginx.com self.assertIsNotNone( 134*1017Szelenkov@nginx.com self.search_in_log(r'RuntimeError'), 'ctx iter atexit' 135*1017Szelenkov@nginx.com ) 136602Szelenkov@nginx.com 137603Szelenkov@nginx.com def test_python_keepalive_body(self): 138603Szelenkov@nginx.com self.load('mirror') 139603Szelenkov@nginx.com 140*1017Szelenkov@nginx.com (resp, sock) = self.post( 141*1017Szelenkov@nginx.com headers={ 142*1017Szelenkov@nginx.com 'Host': 'localhost', 143*1017Szelenkov@nginx.com 'Connection': 'keep-alive', 144*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 145*1017Szelenkov@nginx.com }, 146*1017Szelenkov@nginx.com start=True, 147*1017Szelenkov@nginx.com body='0123456789' * 500, 148*1017Szelenkov@nginx.com ) 149603Szelenkov@nginx.com 150603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1') 151603Szelenkov@nginx.com 152*1017Szelenkov@nginx.com resp = self.post( 153*1017Szelenkov@nginx.com headers={ 154*1017Szelenkov@nginx.com 'Host': 'localhost', 155*1017Szelenkov@nginx.com 'Connection': 'close', 156*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 157*1017Szelenkov@nginx.com }, 158*1017Szelenkov@nginx.com sock=sock, 159*1017Szelenkov@nginx.com body='0123456789', 160*1017Szelenkov@nginx.com ) 161603Szelenkov@nginx.com 162603Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'keep-alive 2') 163603Szelenkov@nginx.com 164684Szelenkov@nginx.com def test_python_keepalive_reconfigure(self): 165*1017Szelenkov@nginx.com self.skip_alerts.extend( 166*1017Szelenkov@nginx.com [ 167*1017Szelenkov@nginx.com r'pthread_mutex.+failed', 168*1017Szelenkov@nginx.com r'failed to apply', 169*1017Szelenkov@nginx.com r'process \d+ exited on signal', 170*1017Szelenkov@nginx.com ] 171*1017Szelenkov@nginx.com ) 172684Szelenkov@nginx.com self.load('mirror') 173684Szelenkov@nginx.com 174684Szelenkov@nginx.com body = '0123456789' 175684Szelenkov@nginx.com conns = 3 176684Szelenkov@nginx.com socks = [] 177684Szelenkov@nginx.com 178684Szelenkov@nginx.com for i in range(conns): 179*1017Szelenkov@nginx.com (resp, sock) = self.post( 180*1017Szelenkov@nginx.com headers={ 181*1017Szelenkov@nginx.com 'Host': 'localhost', 182*1017Szelenkov@nginx.com 'Connection': 'keep-alive', 183*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 184*1017Szelenkov@nginx.com }, 185*1017Szelenkov@nginx.com start=True, 186*1017Szelenkov@nginx.com body=body, 187*1017Szelenkov@nginx.com ) 188684Szelenkov@nginx.com 189684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive open') 190*1017Szelenkov@nginx.com self.assertIn( 191*1017Szelenkov@nginx.com 'success', 192*1017Szelenkov@nginx.com self.conf( 193*1017Szelenkov@nginx.com str(i + 1), 194*1017Szelenkov@nginx.com 'applications/mirror/processes', 195*1017Szelenkov@nginx.com ), 196*1017Szelenkov@nginx.com 'reconfigure', 197*1017Szelenkov@nginx.com ) 198684Szelenkov@nginx.com 199684Szelenkov@nginx.com socks.append(sock) 200684Szelenkov@nginx.com 201684Szelenkov@nginx.com for i in range(conns): 202*1017Szelenkov@nginx.com (resp, sock) = self.post( 203*1017Szelenkov@nginx.com headers={ 204*1017Szelenkov@nginx.com 'Host': 'localhost', 205*1017Szelenkov@nginx.com 'Connection': 'keep-alive', 206*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 207*1017Szelenkov@nginx.com }, 208*1017Szelenkov@nginx.com start=True, 209*1017Szelenkov@nginx.com sock=socks[i], 210*1017Szelenkov@nginx.com body=body, 211*1017Szelenkov@nginx.com ) 212684Szelenkov@nginx.com 213684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive request') 214*1017Szelenkov@nginx.com self.assertIn( 215*1017Szelenkov@nginx.com 'success', 216*1017Szelenkov@nginx.com self.conf( 217*1017Szelenkov@nginx.com str(i + 1), 218*1017Szelenkov@nginx.com 'applications/mirror/processes', 219*1017Szelenkov@nginx.com ), 220*1017Szelenkov@nginx.com 'reconfigure 2', 221*1017Szelenkov@nginx.com ) 222684Szelenkov@nginx.com 223684Szelenkov@nginx.com for i in range(conns): 224*1017Szelenkov@nginx.com resp = self.post( 225*1017Szelenkov@nginx.com headers={ 226*1017Szelenkov@nginx.com 'Host': 'localhost', 227*1017Szelenkov@nginx.com 'Connection': 'close', 228*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 229*1017Szelenkov@nginx.com }, 230*1017Szelenkov@nginx.com sock=socks[i], 231*1017Szelenkov@nginx.com body=body, 232*1017Szelenkov@nginx.com ) 233684Szelenkov@nginx.com 234684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive close') 235*1017Szelenkov@nginx.com self.assertIn( 236*1017Szelenkov@nginx.com 'success', 237*1017Szelenkov@nginx.com self.conf( 238*1017Szelenkov@nginx.com str(i + 1), 239*1017Szelenkov@nginx.com 'applications/mirror/processes', 240*1017Szelenkov@nginx.com ), 241*1017Szelenkov@nginx.com 'reconfigure 3', 242*1017Szelenkov@nginx.com ) 243684Szelenkov@nginx.com 244750Szelenkov@nginx.com def test_python_keepalive_reconfigure_2(self): 245750Szelenkov@nginx.com self.load('mirror') 246750Szelenkov@nginx.com 247750Szelenkov@nginx.com body = '0123456789' 248750Szelenkov@nginx.com 249*1017Szelenkov@nginx.com (resp, sock) = self.post( 250*1017Szelenkov@nginx.com headers={ 251*1017Szelenkov@nginx.com 'Host': 'localhost', 252*1017Szelenkov@nginx.com 'Connection': 'keep-alive', 253*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 254*1017Szelenkov@nginx.com }, 255*1017Szelenkov@nginx.com start=True, 256*1017Szelenkov@nginx.com body=body, 257*1017Szelenkov@nginx.com ) 258750Szelenkov@nginx.com 259750Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1') 260750Szelenkov@nginx.com 261750Szelenkov@nginx.com self.load('empty') 262750Szelenkov@nginx.com 263*1017Szelenkov@nginx.com (resp, sock) = self.post( 264*1017Szelenkov@nginx.com headers={ 265*1017Szelenkov@nginx.com 'Host': 'localhost', 266*1017Szelenkov@nginx.com 'Connection': 'close', 267*1017Szelenkov@nginx.com 'Content-Type': 'text/html', 268*1017Szelenkov@nginx.com }, 269*1017Szelenkov@nginx.com start=True, 270*1017Szelenkov@nginx.com sock=sock, 271*1017Szelenkov@nginx.com body=body, 272*1017Szelenkov@nginx.com ) 273750Szelenkov@nginx.com 274750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2') 275750Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body') 276750Szelenkov@nginx.com 277*1017Szelenkov@nginx.com self.assertIn( 278*1017Szelenkov@nginx.com 'success', 279*1017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 280*1017Szelenkov@nginx.com 'reconfigure 2 clear configuration', 281*1017Szelenkov@nginx.com ) 282750Szelenkov@nginx.com 283750Szelenkov@nginx.com resp = self.get(sock=sock) 284750Szelenkov@nginx.com 285750Szelenkov@nginx.com self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3') 286750Szelenkov@nginx.com 287750Szelenkov@nginx.com def test_python_keepalive_reconfigure_3(self): 288750Szelenkov@nginx.com self.load('empty') 289750Szelenkov@nginx.com 290*1017Szelenkov@nginx.com (resp, sock) = self.http( 291*1017Szelenkov@nginx.com b"""GET / HTTP/1.1 292*1017Szelenkov@nginx.com""", 293*1017Szelenkov@nginx.com start=True, 294*1017Szelenkov@nginx.com raw=True, 295*1017Szelenkov@nginx.com ) 296750Szelenkov@nginx.com 297*1017Szelenkov@nginx.com self.assertIn( 298*1017Szelenkov@nginx.com 'success', 299*1017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 300*1017Szelenkov@nginx.com 'reconfigure 3 clear configuration', 301*1017Szelenkov@nginx.com ) 302750Szelenkov@nginx.com 303*1017Szelenkov@nginx.com resp = self.http( 304*1017Szelenkov@nginx.com b"""Host: localhost 305750Szelenkov@nginx.comConnection: close 306750Szelenkov@nginx.com 307*1017Szelenkov@nginx.com""", 308*1017Szelenkov@nginx.com sock=sock, 309*1017Szelenkov@nginx.com raw=True, 310*1017Szelenkov@nginx.com ) 311750Szelenkov@nginx.com 312750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 3') 313750Szelenkov@nginx.com 314603Szelenkov@nginx.com def test_python_atexit(self): 315603Szelenkov@nginx.com self.load('atexit') 316603Szelenkov@nginx.com 317603Szelenkov@nginx.com self.get() 318603Szelenkov@nginx.com 319*1017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 320603Szelenkov@nginx.com 321603Szelenkov@nginx.com self.stop() 322603Szelenkov@nginx.com 323603Szelenkov@nginx.com self.assertIsNotNone(self.search_in_log(r'At exit called\.'), 'atexit') 324603Szelenkov@nginx.com 325603Szelenkov@nginx.com @unittest.expectedFailure 326603Szelenkov@nginx.com def test_python_application_start_response_exit(self): 327603Szelenkov@nginx.com self.load('start_response_exit') 328603Szelenkov@nginx.com 329603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'start response exit') 330603Szelenkov@nginx.com 331603Szelenkov@nginx.com @unittest.expectedFailure 332603Szelenkov@nginx.com def test_python_application_input_iter(self): 333603Szelenkov@nginx.com self.load('input_iter') 334603Szelenkov@nginx.com 335603Szelenkov@nginx.com body = '0123456789' 336603Szelenkov@nginx.com 337603Szelenkov@nginx.com self.assertEqual(self.post(body=body)['body'], body, 'input iter') 338603Szelenkov@nginx.com 339603Szelenkov@nginx.com def test_python_application_input_read_length(self): 340603Szelenkov@nginx.com self.load('input_read_length') 341603Szelenkov@nginx.com 342603Szelenkov@nginx.com body = '0123456789' 343603Szelenkov@nginx.com 344*1017Szelenkov@nginx.com resp = self.post( 345*1017Szelenkov@nginx.com headers={ 346*1017Szelenkov@nginx.com 'Host': 'localhost', 347*1017Szelenkov@nginx.com 'Input-Length': '5', 348*1017Szelenkov@nginx.com 'Connection': 'close', 349*1017Szelenkov@nginx.com }, 350*1017Szelenkov@nginx.com body=body, 351*1017Szelenkov@nginx.com ) 352603Szelenkov@nginx.com 353603Szelenkov@nginx.com self.assertEqual(resp['body'], body[:5], 'input read length lt body') 354603Szelenkov@nginx.com 355*1017Szelenkov@nginx.com resp = self.post( 356*1017Szelenkov@nginx.com headers={ 357*1017Szelenkov@nginx.com 'Host': 'localhost', 358*1017Szelenkov@nginx.com 'Input-Length': '15', 359*1017Szelenkov@nginx.com 'Connection': 'close', 360*1017Szelenkov@nginx.com }, 361*1017Szelenkov@nginx.com body=body, 362*1017Szelenkov@nginx.com ) 363603Szelenkov@nginx.com 364603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length gt body') 365603Szelenkov@nginx.com 366*1017Szelenkov@nginx.com resp = self.post( 367*1017Szelenkov@nginx.com headers={ 368*1017Szelenkov@nginx.com 'Host': 'localhost', 369*1017Szelenkov@nginx.com 'Input-Length': '0', 370*1017Szelenkov@nginx.com 'Connection': 'close', 371*1017Szelenkov@nginx.com }, 372*1017Szelenkov@nginx.com body=body, 373*1017Szelenkov@nginx.com ) 374603Szelenkov@nginx.com 375603Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'input read length zero') 376603Szelenkov@nginx.com 377*1017Szelenkov@nginx.com resp = self.post( 378*1017Szelenkov@nginx.com headers={ 379*1017Szelenkov@nginx.com 'Host': 'localhost', 380*1017Szelenkov@nginx.com 'Input-Length': '-1', 381*1017Szelenkov@nginx.com 'Connection': 'close', 382*1017Szelenkov@nginx.com }, 383*1017Szelenkov@nginx.com body=body, 384*1017Szelenkov@nginx.com ) 385603Szelenkov@nginx.com 386603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length negative') 387603Szelenkov@nginx.com 388603Szelenkov@nginx.com @unittest.expectedFailure 389603Szelenkov@nginx.com def test_python_application_errors_write(self): 390603Szelenkov@nginx.com self.load('errors_write') 391603Szelenkov@nginx.com 392603Szelenkov@nginx.com self.get() 393603Szelenkov@nginx.com 394603Szelenkov@nginx.com self.stop() 395603Szelenkov@nginx.com 396603Szelenkov@nginx.com self.assertIsNotNone( 397603Szelenkov@nginx.com self.search_in_log(r'\[error\].+Error in application\.'), 398*1017Szelenkov@nginx.com 'errors write', 399*1017Szelenkov@nginx.com ) 400603Szelenkov@nginx.com 401603Szelenkov@nginx.com def test_python_application_body_array(self): 402603Szelenkov@nginx.com self.load('body_array') 403603Szelenkov@nginx.com 404603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body array') 405603Szelenkov@nginx.com 406603Szelenkov@nginx.com def test_python_application_body_io(self): 407603Szelenkov@nginx.com self.load('body_io') 408603Szelenkov@nginx.com 409603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body io') 410603Szelenkov@nginx.com 411603Szelenkov@nginx.com def test_python_application_body_io_file(self): 412603Szelenkov@nginx.com self.load('body_io_file') 413603Szelenkov@nginx.com 414603Szelenkov@nginx.com self.assertEqual(self.get()['body'], 'body\n', 'body io file') 415603Szelenkov@nginx.com 416603Szelenkov@nginx.com @unittest.expectedFailure 417603Szelenkov@nginx.com def test_python_application_syntax_error(self): 418603Szelenkov@nginx.com self.skip_alerts.append(r'Python failed to import module "wsgi"') 419603Szelenkov@nginx.com self.load('syntax_error') 420603Szelenkov@nginx.com 421603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'syntax error') 422603Szelenkov@nginx.com 423603Szelenkov@nginx.com def test_python_application_close(self): 424603Szelenkov@nginx.com self.load('close') 425603Szelenkov@nginx.com 426603Szelenkov@nginx.com self.get() 427603Szelenkov@nginx.com 428603Szelenkov@nginx.com self.stop() 429603Szelenkov@nginx.com 430603Szelenkov@nginx.com self.assertIsNotNone(self.search_in_log(r'Close called\.'), 'close') 431603Szelenkov@nginx.com 432603Szelenkov@nginx.com def test_python_application_close_error(self): 433603Szelenkov@nginx.com self.load('close_error') 434603Szelenkov@nginx.com 435603Szelenkov@nginx.com self.get() 436603Szelenkov@nginx.com 437603Szelenkov@nginx.com self.stop() 438603Szelenkov@nginx.com 439*1017Szelenkov@nginx.com self.assertIsNotNone( 440*1017Szelenkov@nginx.com self.search_in_log(r'Close called\.'), 'close error' 441*1017Szelenkov@nginx.com ) 442603Szelenkov@nginx.com 443617Szelenkov@nginx.com def test_python_application_not_iterable(self): 444617Szelenkov@nginx.com self.load('not_iterable') 445617Szelenkov@nginx.com 446665Szelenkov@nginx.com self.get() 447617Szelenkov@nginx.com 448617Szelenkov@nginx.com self.stop() 449617Szelenkov@nginx.com 450*1017Szelenkov@nginx.com self.assertIsNotNone( 451*1017Szelenkov@nginx.com self.search_in_log( 452*1017Szelenkov@nginx.com r'\[error\].+the application returned not an iterable object' 453*1017Szelenkov@nginx.com ), 454*1017Szelenkov@nginx.com 'not iterable', 455*1017Szelenkov@nginx.com ) 456617Szelenkov@nginx.com 457664Szelenkov@nginx.com def test_python_application_write(self): 458664Szelenkov@nginx.com self.load('write') 459664Szelenkov@nginx.com 460664Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'write') 461664Szelenkov@nginx.com 462*1017Szelenkov@nginx.com 463484Szelenkov@nginx.comif __name__ == '__main__': 464853Szelenkov@nginx.com TestUnitPythonApplication.main() 465