11283Szelenkov@nginx.comimport re 21304St.nateldemoura@f5.comimport os 31304St.nateldemoura@f5.comimport grp 41304St.nateldemoura@f5.comimport pwd 5899Szelenkov@nginx.comimport time 6484Szelenkov@nginx.comimport unittest 71019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 8484Szelenkov@nginx.com 91017Szelenkov@nginx.com 101019Szelenkov@nginx.comclass TestPythonApplication(TestApplicationPython): 11*1467Szelenkov@nginx.com prerequisites = {'modules': {'python': 'all'}} 12484Szelenkov@nginx.com 131283Szelenkov@nginx.com def findall(self, pattern): 141283Szelenkov@nginx.com with open(self.testdir + '/unit.log', 'r', errors='ignore') as f: 151283Szelenkov@nginx.com return re.findall(pattern, f.read()) 161283Szelenkov@nginx.com 17552Szelenkov@nginx.com def test_python_application_variables(self): 18552Szelenkov@nginx.com self.load('variables') 19484Szelenkov@nginx.com 20484Szelenkov@nginx.com body = 'Test body string.' 21484Szelenkov@nginx.com 221017Szelenkov@nginx.com resp = self.post( 231017Szelenkov@nginx.com headers={ 241017Szelenkov@nginx.com 'Host': 'localhost', 251017Szelenkov@nginx.com 'Content-Type': 'text/html', 261017Szelenkov@nginx.com 'Custom-Header': 'blah', 271017Szelenkov@nginx.com 'Connection': 'close', 281017Szelenkov@nginx.com }, 291017Szelenkov@nginx.com body=body, 301017Szelenkov@nginx.com ) 31484Szelenkov@nginx.com 32505Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 33505Szelenkov@nginx.com headers = resp['headers'] 34674Szelenkov@nginx.com header_server = headers.pop('Server') 35674Szelenkov@nginx.com self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header') 361017Szelenkov@nginx.com self.assertEqual( 371017Szelenkov@nginx.com headers.pop('Server-Software'), 381017Szelenkov@nginx.com header_server, 391017Szelenkov@nginx.com 'server software header', 401017Szelenkov@nginx.com ) 41599Szelenkov@nginx.com 42599Szelenkov@nginx.com date = headers.pop('Date') 43599Szelenkov@nginx.com self.assertEqual(date[-4:], ' GMT', 'date header timezone') 441017Szelenkov@nginx.com self.assertLess( 451017Szelenkov@nginx.com abs(self.date_to_sec_epoch(date) - self.sec_epoch()), 461017Szelenkov@nginx.com 5, 471017Szelenkov@nginx.com 'date header', 481017Szelenkov@nginx.com ) 49599Szelenkov@nginx.com 501017Szelenkov@nginx.com self.assertDictEqual( 511017Szelenkov@nginx.com headers, 521017Szelenkov@nginx.com { 531017Szelenkov@nginx.com 'Connection': 'close', 541017Szelenkov@nginx.com 'Content-Length': str(len(body)), 551017Szelenkov@nginx.com 'Content-Type': 'text/html', 561017Szelenkov@nginx.com 'Request-Method': 'POST', 571017Szelenkov@nginx.com 'Request-Uri': '/', 581017Szelenkov@nginx.com 'Http-Host': 'localhost', 591017Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 601017Szelenkov@nginx.com 'Custom-Header': 'blah', 611017Szelenkov@nginx.com 'Wsgi-Version': '(1, 0)', 621017Szelenkov@nginx.com 'Wsgi-Url-Scheme': 'http', 631017Szelenkov@nginx.com 'Wsgi-Multithread': 'False', 641017Szelenkov@nginx.com 'Wsgi-Multiprocess': 'True', 651017Szelenkov@nginx.com 'Wsgi-Run-Once': 'False', 661017Szelenkov@nginx.com }, 671017Szelenkov@nginx.com 'headers', 681017Szelenkov@nginx.com ) 69505Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'body') 70484Szelenkov@nginx.com 71497Szelenkov@nginx.com def test_python_application_query_string(self): 72552Szelenkov@nginx.com self.load('query_string') 73497Szelenkov@nginx.com 74505Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 75497Szelenkov@nginx.com 761017Szelenkov@nginx.com self.assertEqual( 771017Szelenkov@nginx.com resp['headers']['Query-String'], 781017Szelenkov@nginx.com 'var1=val1&var2=val2', 791017Szelenkov@nginx.com 'Query-String header', 801017Szelenkov@nginx.com ) 81497Szelenkov@nginx.com 821171Svbart@nginx.com def test_python_application_query_string_space(self): 831171Svbart@nginx.com self.load('query_string') 841171Svbart@nginx.com 851171Svbart@nginx.com resp = self.get(url='/ ?var1=val1&var2=val2') 861171Svbart@nginx.com self.assertEqual( 871171Svbart@nginx.com resp['headers']['Query-String'], 881171Svbart@nginx.com 'var1=val1&var2=val2', 891171Svbart@nginx.com 'Query-String space', 901171Svbart@nginx.com ) 911171Svbart@nginx.com 921171Svbart@nginx.com resp = self.get(url='/ %20?var1=val1&var2=val2') 931171Svbart@nginx.com self.assertEqual( 941171Svbart@nginx.com resp['headers']['Query-String'], 951171Svbart@nginx.com 'var1=val1&var2=val2', 961171Svbart@nginx.com 'Query-String space 2', 971171Svbart@nginx.com ) 981171Svbart@nginx.com 991171Svbart@nginx.com resp = self.get(url='/ %20 ?var1=val1&var2=val2') 1001171Svbart@nginx.com self.assertEqual( 1011171Svbart@nginx.com resp['headers']['Query-String'], 1021171Svbart@nginx.com 'var1=val1&var2=val2', 1031171Svbart@nginx.com 'Query-String space 3', 1041171Svbart@nginx.com ) 1051171Svbart@nginx.com 1061171Svbart@nginx.com resp = self.get(url='/blah %20 blah? var1= val1 & var2=val2') 1071171Svbart@nginx.com self.assertEqual( 1081171Svbart@nginx.com resp['headers']['Query-String'], 1091171Svbart@nginx.com ' var1= val1 & var2=val2', 1101171Svbart@nginx.com 'Query-String space 4', 1111171Svbart@nginx.com ) 1121171Svbart@nginx.com 113894Szelenkov@nginx.com def test_python_application_query_string_empty(self): 114894Szelenkov@nginx.com self.load('query_string') 115894Szelenkov@nginx.com 116894Szelenkov@nginx.com resp = self.get(url='/?') 117894Szelenkov@nginx.com 118894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string empty status') 1191017Szelenkov@nginx.com self.assertEqual( 1201017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string empty' 1211017Szelenkov@nginx.com ) 122894Szelenkov@nginx.com 123894Szelenkov@nginx.com def test_python_application_query_string_absent(self): 124894Szelenkov@nginx.com self.load('query_string') 125894Szelenkov@nginx.com 126894Szelenkov@nginx.com resp = self.get() 127894Szelenkov@nginx.com 128894Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'query string absent status') 1291017Szelenkov@nginx.com self.assertEqual( 1301017Szelenkov@nginx.com resp['headers']['Query-String'], '', 'query string absent' 1311017Szelenkov@nginx.com ) 132894Szelenkov@nginx.com 1331064Szelenkov@nginx.com @unittest.skip('not yet') 134495Szelenkov@nginx.com def test_python_application_server_port(self): 135552Szelenkov@nginx.com self.load('server_port') 136495Szelenkov@nginx.com 1371017Szelenkov@nginx.com self.assertEqual( 1381017Szelenkov@nginx.com self.get()['headers']['Server-Port'], '7080', 'Server-Port header' 1391017Szelenkov@nginx.com ) 140484Szelenkov@nginx.com 1411250Szelenkov@nginx.com @unittest.skip('not yet') 1421250Szelenkov@nginx.com def test_python_application_working_directory_invalid(self): 1431250Szelenkov@nginx.com self.load('empty') 1441250Szelenkov@nginx.com 1451250Szelenkov@nginx.com self.assertIn( 1461250Szelenkov@nginx.com 'success', 1471250Szelenkov@nginx.com self.conf('"/blah"', 'applications/empty/working_directory'), 1481250Szelenkov@nginx.com 'configure invalid working_directory', 1491250Szelenkov@nginx.com ) 1501250Szelenkov@nginx.com 1511250Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'status') 1521250Szelenkov@nginx.com 153496Szelenkov@nginx.com def test_python_application_204_transfer_encoding(self): 154552Szelenkov@nginx.com self.load('204_no_content') 155496Szelenkov@nginx.com 1561017Szelenkov@nginx.com self.assertNotIn( 1571017Szelenkov@nginx.com 'Transfer-Encoding', 1581017Szelenkov@nginx.com self.get()['headers'], 1591017Szelenkov@nginx.com '204 header transfer encoding', 1601017Szelenkov@nginx.com ) 161484Szelenkov@nginx.com 162602Szelenkov@nginx.com def test_python_application_ctx_iter_atexit(self): 163602Szelenkov@nginx.com self.load('ctx_iter_atexit') 164602Szelenkov@nginx.com 1651017Szelenkov@nginx.com resp = self.post( 1661017Szelenkov@nginx.com headers={ 1671017Szelenkov@nginx.com 'Host': 'localhost', 1681017Szelenkov@nginx.com 'Connection': 'close', 1691017Szelenkov@nginx.com 'Content-Type': 'text/html', 1701017Szelenkov@nginx.com }, 1711017Szelenkov@nginx.com body='0123456789', 1721017Szelenkov@nginx.com ) 173602Szelenkov@nginx.com 174602Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'ctx iter status') 175602Szelenkov@nginx.com self.assertEqual(resp['body'], '0123456789', 'ctx iter body') 176602Szelenkov@nginx.com 1771017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 178602Szelenkov@nginx.com 179602Szelenkov@nginx.com self.stop() 180602Szelenkov@nginx.com 1811017Szelenkov@nginx.com self.assertIsNotNone( 1821028Szelenkov@nginx.com self.wait_for_record(r'RuntimeError'), 'ctx iter atexit' 1831017Szelenkov@nginx.com ) 184602Szelenkov@nginx.com 185603Szelenkov@nginx.com def test_python_keepalive_body(self): 186603Szelenkov@nginx.com self.load('mirror') 187603Szelenkov@nginx.com 1881029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 1891029Szelenkov@nginx.com 1901453Szelenkov@nginx.com body = '0123456789' * 500 1911017Szelenkov@nginx.com (resp, sock) = self.post( 1921017Szelenkov@nginx.com headers={ 1931017Szelenkov@nginx.com 'Host': 'localhost', 1941017Szelenkov@nginx.com 'Connection': 'keep-alive', 1951017Szelenkov@nginx.com 'Content-Type': 'text/html', 1961017Szelenkov@nginx.com }, 1971017Szelenkov@nginx.com start=True, 1981453Szelenkov@nginx.com body=body, 1991029Szelenkov@nginx.com read_timeout=1, 2001017Szelenkov@nginx.com ) 201603Szelenkov@nginx.com 2021453Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive 1') 203603Szelenkov@nginx.com 2041453Szelenkov@nginx.com body = '0123456789' 2051017Szelenkov@nginx.com resp = self.post( 2061017Szelenkov@nginx.com headers={ 2071017Szelenkov@nginx.com 'Host': 'localhost', 2081017Szelenkov@nginx.com 'Connection': 'close', 2091017Szelenkov@nginx.com 'Content-Type': 'text/html', 2101017Szelenkov@nginx.com }, 2111017Szelenkov@nginx.com sock=sock, 2121453Szelenkov@nginx.com body=body, 2131017Szelenkov@nginx.com ) 214603Szelenkov@nginx.com 2151453Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive 2') 216603Szelenkov@nginx.com 217684Szelenkov@nginx.com def test_python_keepalive_reconfigure(self): 2181017Szelenkov@nginx.com self.skip_alerts.extend( 2191017Szelenkov@nginx.com [ 2201017Szelenkov@nginx.com r'pthread_mutex.+failed', 2211017Szelenkov@nginx.com r'failed to apply', 2221017Szelenkov@nginx.com r'process \d+ exited on signal', 2231017Szelenkov@nginx.com ] 2241017Szelenkov@nginx.com ) 225684Szelenkov@nginx.com self.load('mirror') 226684Szelenkov@nginx.com 2271029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 2281029Szelenkov@nginx.com 229684Szelenkov@nginx.com body = '0123456789' 230684Szelenkov@nginx.com conns = 3 231684Szelenkov@nginx.com socks = [] 232684Szelenkov@nginx.com 233684Szelenkov@nginx.com for i in range(conns): 2341017Szelenkov@nginx.com (resp, sock) = self.post( 2351017Szelenkov@nginx.com headers={ 2361017Szelenkov@nginx.com 'Host': 'localhost', 2371017Szelenkov@nginx.com 'Connection': 'keep-alive', 2381017Szelenkov@nginx.com 'Content-Type': 'text/html', 2391017Szelenkov@nginx.com }, 2401017Szelenkov@nginx.com start=True, 2411017Szelenkov@nginx.com body=body, 2421029Szelenkov@nginx.com read_timeout=1, 2431017Szelenkov@nginx.com ) 244684Szelenkov@nginx.com 245684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive open') 2461017Szelenkov@nginx.com self.assertIn( 2471017Szelenkov@nginx.com 'success', 2481026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2491017Szelenkov@nginx.com 'reconfigure', 2501017Szelenkov@nginx.com ) 251684Szelenkov@nginx.com 252684Szelenkov@nginx.com socks.append(sock) 253684Szelenkov@nginx.com 254684Szelenkov@nginx.com for i in range(conns): 2551017Szelenkov@nginx.com (resp, sock) = self.post( 2561017Szelenkov@nginx.com headers={ 2571017Szelenkov@nginx.com 'Host': 'localhost', 2581017Szelenkov@nginx.com 'Connection': 'keep-alive', 2591017Szelenkov@nginx.com 'Content-Type': 'text/html', 2601017Szelenkov@nginx.com }, 2611017Szelenkov@nginx.com start=True, 2621017Szelenkov@nginx.com sock=socks[i], 2631017Szelenkov@nginx.com body=body, 2641029Szelenkov@nginx.com read_timeout=1, 2651017Szelenkov@nginx.com ) 266684Szelenkov@nginx.com 267684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive request') 2681017Szelenkov@nginx.com self.assertIn( 2691017Szelenkov@nginx.com 'success', 2701026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2711017Szelenkov@nginx.com 'reconfigure 2', 2721017Szelenkov@nginx.com ) 273684Szelenkov@nginx.com 274684Szelenkov@nginx.com for i in range(conns): 2751017Szelenkov@nginx.com resp = self.post( 2761017Szelenkov@nginx.com headers={ 2771017Szelenkov@nginx.com 'Host': 'localhost', 2781017Szelenkov@nginx.com 'Connection': 'close', 2791017Szelenkov@nginx.com 'Content-Type': 'text/html', 2801017Szelenkov@nginx.com }, 2811017Szelenkov@nginx.com sock=socks[i], 2821017Szelenkov@nginx.com body=body, 2831017Szelenkov@nginx.com ) 284684Szelenkov@nginx.com 285684Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'keep-alive close') 2861017Szelenkov@nginx.com self.assertIn( 2871017Szelenkov@nginx.com 'success', 2881026Szelenkov@nginx.com self.conf(str(i + 1), 'applications/mirror/processes'), 2891017Szelenkov@nginx.com 'reconfigure 3', 2901017Szelenkov@nginx.com ) 291684Szelenkov@nginx.com 292750Szelenkov@nginx.com def test_python_keepalive_reconfigure_2(self): 293750Szelenkov@nginx.com self.load('mirror') 294750Szelenkov@nginx.com 2951029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 2961029Szelenkov@nginx.com 297750Szelenkov@nginx.com body = '0123456789' 298750Szelenkov@nginx.com 2991017Szelenkov@nginx.com (resp, sock) = self.post( 3001017Szelenkov@nginx.com headers={ 3011017Szelenkov@nginx.com 'Host': 'localhost', 3021017Szelenkov@nginx.com 'Connection': 'keep-alive', 3031017Szelenkov@nginx.com 'Content-Type': 'text/html', 3041017Szelenkov@nginx.com }, 3051017Szelenkov@nginx.com start=True, 3061017Szelenkov@nginx.com body=body, 3071029Szelenkov@nginx.com read_timeout=1, 3081017Szelenkov@nginx.com ) 309750Szelenkov@nginx.com 310750Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1') 311750Szelenkov@nginx.com 312750Szelenkov@nginx.com self.load('empty') 313750Szelenkov@nginx.com 3141029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 3151029Szelenkov@nginx.com 3161017Szelenkov@nginx.com (resp, sock) = self.post( 3171017Szelenkov@nginx.com headers={ 3181017Szelenkov@nginx.com 'Host': 'localhost', 3191017Szelenkov@nginx.com 'Connection': 'close', 3201017Szelenkov@nginx.com 'Content-Type': 'text/html', 3211017Szelenkov@nginx.com }, 3221017Szelenkov@nginx.com start=True, 3231017Szelenkov@nginx.com sock=sock, 3241017Szelenkov@nginx.com body=body, 3251017Szelenkov@nginx.com ) 326750Szelenkov@nginx.com 327750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2') 328750Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body') 329750Szelenkov@nginx.com 3301017Szelenkov@nginx.com self.assertIn( 3311017Szelenkov@nginx.com 'success', 3321017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 3331017Szelenkov@nginx.com 'reconfigure 2 clear configuration', 3341017Szelenkov@nginx.com ) 335750Szelenkov@nginx.com 336750Szelenkov@nginx.com resp = self.get(sock=sock) 337750Szelenkov@nginx.com 338750Szelenkov@nginx.com self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3') 339750Szelenkov@nginx.com 340750Szelenkov@nginx.com def test_python_keepalive_reconfigure_3(self): 341750Szelenkov@nginx.com self.load('empty') 342750Szelenkov@nginx.com 3431029Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200, 'init') 3441029Szelenkov@nginx.com 3451453Szelenkov@nginx.com (_, sock) = self.http( 3461017Szelenkov@nginx.com b"""GET / HTTP/1.1 3471017Szelenkov@nginx.com""", 3481017Szelenkov@nginx.com start=True, 3491017Szelenkov@nginx.com raw=True, 3501453Szelenkov@nginx.com no_recv=True, 3511017Szelenkov@nginx.com ) 352750Szelenkov@nginx.com 3531453Szelenkov@nginx.com self.assertEqual(self.get()['status'], 200) 3541453Szelenkov@nginx.com 3551017Szelenkov@nginx.com self.assertIn( 3561017Szelenkov@nginx.com 'success', 3571017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}), 3581017Szelenkov@nginx.com 'reconfigure 3 clear configuration', 3591017Szelenkov@nginx.com ) 360750Szelenkov@nginx.com 3611017Szelenkov@nginx.com resp = self.http( 3621017Szelenkov@nginx.com b"""Host: localhost 363750Szelenkov@nginx.comConnection: close 364750Szelenkov@nginx.com 3651017Szelenkov@nginx.com""", 3661017Szelenkov@nginx.com sock=sock, 3671017Szelenkov@nginx.com raw=True, 3681017Szelenkov@nginx.com ) 369750Szelenkov@nginx.com 370750Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'reconfigure 3') 371750Szelenkov@nginx.com 372603Szelenkov@nginx.com def test_python_atexit(self): 373603Szelenkov@nginx.com self.load('atexit') 374603Szelenkov@nginx.com 375603Szelenkov@nginx.com self.get() 376603Szelenkov@nginx.com 3771017Szelenkov@nginx.com self.conf({"listeners": {}, "applications": {}}) 378603Szelenkov@nginx.com 379603Szelenkov@nginx.com self.stop() 380603Szelenkov@nginx.com 3811028Szelenkov@nginx.com self.assertIsNotNone( 3821028Szelenkov@nginx.com self.wait_for_record(r'At exit called\.'), 'atexit' 3831028Szelenkov@nginx.com ) 384603Szelenkov@nginx.com 3851454Szelenkov@nginx.com def test_python_process_switch(self): 3861454Szelenkov@nginx.com self.load('delayed') 3871454Szelenkov@nginx.com 3881454Szelenkov@nginx.com self.assertIn( 3891454Szelenkov@nginx.com 'success', 3901454Szelenkov@nginx.com self.conf('2', 'applications/delayed/processes'), 3911454Szelenkov@nginx.com 'configure 2 processes', 3921454Szelenkov@nginx.com ) 3931454Szelenkov@nginx.com 3941454Szelenkov@nginx.com self.get(headers={ 3951454Szelenkov@nginx.com 'Host': 'localhost', 3961454Szelenkov@nginx.com 'Content-Length': '0', 3971454Szelenkov@nginx.com 'X-Delay': '5', 3981454Szelenkov@nginx.com 'Connection': 'close', 3991454Szelenkov@nginx.com }, no_recv=True) 4001454Szelenkov@nginx.com 4011454Szelenkov@nginx.com headers_delay_1 = { 4021454Szelenkov@nginx.com 'Connection': 'close', 4031454Szelenkov@nginx.com 'Host': 'localhost', 4041454Szelenkov@nginx.com 'Content-Length': '0', 4051454Szelenkov@nginx.com 'X-Delay': '1', 4061454Szelenkov@nginx.com } 4071454Szelenkov@nginx.com 4081454Szelenkov@nginx.com self.get(headers=headers_delay_1, no_recv=True) 4091454Szelenkov@nginx.com 4101454Szelenkov@nginx.com time.sleep(0.5) 4111454Szelenkov@nginx.com 4121454Szelenkov@nginx.com for _ in range(10): 4131454Szelenkov@nginx.com self.get(headers=headers_delay_1, no_recv=True) 4141454Szelenkov@nginx.com 4151454Szelenkov@nginx.com self.get(headers=headers_delay_1) 4161454Szelenkov@nginx.com 4171064Szelenkov@nginx.com @unittest.skip('not yet') 418603Szelenkov@nginx.com def test_python_application_start_response_exit(self): 419603Szelenkov@nginx.com self.load('start_response_exit') 420603Szelenkov@nginx.com 421603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'start response exit') 422603Szelenkov@nginx.com 423603Szelenkov@nginx.com def test_python_application_input_iter(self): 424603Szelenkov@nginx.com self.load('input_iter') 425603Szelenkov@nginx.com 4261400Smax.romanov@nginx.com body = '''0123456789 4271400Smax.romanov@nginx.comnext line 4281400Smax.romanov@nginx.com 4291400Smax.romanov@nginx.comlast line''' 4301400Smax.romanov@nginx.com 4311400Smax.romanov@nginx.com resp = self.post(body=body) 4321400Smax.romanov@nginx.com self.assertEqual(resp['body'], body, 'input iter') 4331400Smax.romanov@nginx.com self.assertEqual( 4341400Smax.romanov@nginx.com resp['headers']['X-Lines-Count'], '4', 'input iter lines' 4351400Smax.romanov@nginx.com ) 4361400Smax.romanov@nginx.com 4371400Smax.romanov@nginx.com def test_python_application_input_readline(self): 4381400Smax.romanov@nginx.com self.load('input_readline') 4391400Smax.romanov@nginx.com 4401400Smax.romanov@nginx.com body = '''0123456789 4411400Smax.romanov@nginx.comnext line 4421400Smax.romanov@nginx.com 4431400Smax.romanov@nginx.comlast line''' 4441400Smax.romanov@nginx.com 4451400Smax.romanov@nginx.com resp = self.post(body=body) 4461400Smax.romanov@nginx.com self.assertEqual(resp['body'], body, 'input readline') 4471400Smax.romanov@nginx.com self.assertEqual( 4481400Smax.romanov@nginx.com resp['headers']['X-Lines-Count'], '4', 'input readline lines' 4491400Smax.romanov@nginx.com ) 4501400Smax.romanov@nginx.com 4511400Smax.romanov@nginx.com def test_python_application_input_readline_size(self): 4521400Smax.romanov@nginx.com self.load('input_readline_size') 4531400Smax.romanov@nginx.com 4541400Smax.romanov@nginx.com body = '''0123456789 4551400Smax.romanov@nginx.comnext line 4561400Smax.romanov@nginx.com 4571400Smax.romanov@nginx.comlast line''' 458603Szelenkov@nginx.com 4591400Smax.romanov@nginx.com self.assertEqual( 4601400Smax.romanov@nginx.com self.post(body=body)['body'], body, 'input readline size' 4611400Smax.romanov@nginx.com ) 4621400Smax.romanov@nginx.com self.assertEqual( 4631400Smax.romanov@nginx.com self.post(body='0123')['body'], '0123', 'input readline size less' 4641400Smax.romanov@nginx.com ) 4651400Smax.romanov@nginx.com 4661400Smax.romanov@nginx.com def test_python_application_input_readlines(self): 4671400Smax.romanov@nginx.com self.load('input_readlines') 4681400Smax.romanov@nginx.com 4691400Smax.romanov@nginx.com body = '''0123456789 4701400Smax.romanov@nginx.comnext line 4711400Smax.romanov@nginx.com 4721400Smax.romanov@nginx.comlast line''' 4731400Smax.romanov@nginx.com 4741400Smax.romanov@nginx.com resp = self.post(body=body) 4751400Smax.romanov@nginx.com self.assertEqual(resp['body'], body, 'input readlines') 4761400Smax.romanov@nginx.com self.assertEqual( 4771400Smax.romanov@nginx.com resp['headers']['X-Lines-Count'], '4', 'input readlines lines' 4781400Smax.romanov@nginx.com ) 4791400Smax.romanov@nginx.com 4801400Smax.romanov@nginx.com def test_python_application_input_readlines_huge(self): 4811400Smax.romanov@nginx.com self.load('input_readlines') 4821400Smax.romanov@nginx.com 4831400Smax.romanov@nginx.com body = ( 4841400Smax.romanov@nginx.com '''0123456789 abcdefghi 4851400Smax.romanov@nginx.comnext line: 0123456789 abcdefghi 4861400Smax.romanov@nginx.com 4871400Smax.romanov@nginx.comlast line: 987654321 4881400Smax.romanov@nginx.com''' 4891400Smax.romanov@nginx.com * 512 4901400Smax.romanov@nginx.com ) 4911400Smax.romanov@nginx.com 4921400Smax.romanov@nginx.com self.assertEqual( 4931400Smax.romanov@nginx.com self.post(body=body, read_buffer_size=16384)['body'], 4941400Smax.romanov@nginx.com body, 4951400Smax.romanov@nginx.com 'input readlines huge', 4961400Smax.romanov@nginx.com ) 497603Szelenkov@nginx.com 498603Szelenkov@nginx.com def test_python_application_input_read_length(self): 499603Szelenkov@nginx.com self.load('input_read_length') 500603Szelenkov@nginx.com 501603Szelenkov@nginx.com body = '0123456789' 502603Szelenkov@nginx.com 5031017Szelenkov@nginx.com resp = self.post( 5041017Szelenkov@nginx.com headers={ 5051017Szelenkov@nginx.com 'Host': 'localhost', 5061017Szelenkov@nginx.com 'Input-Length': '5', 5071017Szelenkov@nginx.com 'Connection': 'close', 5081017Szelenkov@nginx.com }, 5091017Szelenkov@nginx.com body=body, 5101017Szelenkov@nginx.com ) 511603Szelenkov@nginx.com 512603Szelenkov@nginx.com self.assertEqual(resp['body'], body[:5], 'input read length lt body') 513603Szelenkov@nginx.com 5141017Szelenkov@nginx.com resp = self.post( 5151017Szelenkov@nginx.com headers={ 5161017Szelenkov@nginx.com 'Host': 'localhost', 5171017Szelenkov@nginx.com 'Input-Length': '15', 5181017Szelenkov@nginx.com 'Connection': 'close', 5191017Szelenkov@nginx.com }, 5201017Szelenkov@nginx.com body=body, 5211017Szelenkov@nginx.com ) 522603Szelenkov@nginx.com 523603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length gt body') 524603Szelenkov@nginx.com 5251017Szelenkov@nginx.com resp = self.post( 5261017Szelenkov@nginx.com headers={ 5271017Szelenkov@nginx.com 'Host': 'localhost', 5281017Szelenkov@nginx.com 'Input-Length': '0', 5291017Szelenkov@nginx.com 'Connection': 'close', 5301017Szelenkov@nginx.com }, 5311017Szelenkov@nginx.com body=body, 5321017Szelenkov@nginx.com ) 533603Szelenkov@nginx.com 534603Szelenkov@nginx.com self.assertEqual(resp['body'], '', 'input read length zero') 535603Szelenkov@nginx.com 5361017Szelenkov@nginx.com resp = self.post( 5371017Szelenkov@nginx.com headers={ 5381017Szelenkov@nginx.com 'Host': 'localhost', 5391017Szelenkov@nginx.com 'Input-Length': '-1', 5401017Szelenkov@nginx.com 'Connection': 'close', 5411017Szelenkov@nginx.com }, 5421017Szelenkov@nginx.com body=body, 5431017Szelenkov@nginx.com ) 544603Szelenkov@nginx.com 545603Szelenkov@nginx.com self.assertEqual(resp['body'], body, 'input read length negative') 546603Szelenkov@nginx.com 5471064Szelenkov@nginx.com @unittest.skip('not yet') 548603Szelenkov@nginx.com def test_python_application_errors_write(self): 549603Szelenkov@nginx.com self.load('errors_write') 550603Szelenkov@nginx.com 551603Szelenkov@nginx.com self.get() 552603Szelenkov@nginx.com 553603Szelenkov@nginx.com self.stop() 554603Szelenkov@nginx.com 555603Szelenkov@nginx.com self.assertIsNotNone( 5561028Szelenkov@nginx.com self.wait_for_record(r'\[error\].+Error in application\.'), 5571017Szelenkov@nginx.com 'errors write', 5581017Szelenkov@nginx.com ) 559603Szelenkov@nginx.com 560603Szelenkov@nginx.com def test_python_application_body_array(self): 561603Szelenkov@nginx.com self.load('body_array') 562603Szelenkov@nginx.com 563603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body array') 564603Szelenkov@nginx.com 565603Szelenkov@nginx.com def test_python_application_body_io(self): 566603Szelenkov@nginx.com self.load('body_io') 567603Szelenkov@nginx.com 568603Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'body io') 569603Szelenkov@nginx.com 570603Szelenkov@nginx.com def test_python_application_body_io_file(self): 571603Szelenkov@nginx.com self.load('body_io_file') 572603Szelenkov@nginx.com 573603Szelenkov@nginx.com self.assertEqual(self.get()['body'], 'body\n', 'body io file') 574603Szelenkov@nginx.com 5751064Szelenkov@nginx.com @unittest.skip('not yet') 576603Szelenkov@nginx.com def test_python_application_syntax_error(self): 577603Szelenkov@nginx.com self.skip_alerts.append(r'Python failed to import module "wsgi"') 578603Szelenkov@nginx.com self.load('syntax_error') 579603Szelenkov@nginx.com 580603Szelenkov@nginx.com self.assertEqual(self.get()['status'], 500, 'syntax error') 581603Szelenkov@nginx.com 582603Szelenkov@nginx.com def test_python_application_close(self): 583603Szelenkov@nginx.com self.load('close') 584603Szelenkov@nginx.com 585603Szelenkov@nginx.com self.get() 586603Szelenkov@nginx.com 587603Szelenkov@nginx.com self.stop() 588603Szelenkov@nginx.com 5891028Szelenkov@nginx.com self.assertIsNotNone(self.wait_for_record(r'Close called\.'), 'close') 590603Szelenkov@nginx.com 591603Szelenkov@nginx.com def test_python_application_close_error(self): 592603Szelenkov@nginx.com self.load('close_error') 593603Szelenkov@nginx.com 594603Szelenkov@nginx.com self.get() 595603Szelenkov@nginx.com 596603Szelenkov@nginx.com self.stop() 597603Szelenkov@nginx.com 5981017Szelenkov@nginx.com self.assertIsNotNone( 5991028Szelenkov@nginx.com self.wait_for_record(r'Close called\.'), 'close error' 6001017Szelenkov@nginx.com ) 601603Szelenkov@nginx.com 602617Szelenkov@nginx.com def test_python_application_not_iterable(self): 603617Szelenkov@nginx.com self.load('not_iterable') 604617Szelenkov@nginx.com 605665Szelenkov@nginx.com self.get() 606617Szelenkov@nginx.com 607617Szelenkov@nginx.com self.stop() 608617Szelenkov@nginx.com 6091017Szelenkov@nginx.com self.assertIsNotNone( 6101028Szelenkov@nginx.com self.wait_for_record( 6111017Szelenkov@nginx.com r'\[error\].+the application returned not an iterable object' 6121017Szelenkov@nginx.com ), 6131017Szelenkov@nginx.com 'not iterable', 6141017Szelenkov@nginx.com ) 615617Szelenkov@nginx.com 616664Szelenkov@nginx.com def test_python_application_write(self): 617664Szelenkov@nginx.com self.load('write') 618664Szelenkov@nginx.com 619664Szelenkov@nginx.com self.assertEqual(self.get()['body'], '0123456789', 'write') 620664Szelenkov@nginx.com 6211261Szelenkov@nginx.com def test_python_application_threading(self): 6221261Szelenkov@nginx.com """wait_for_record() timeouts after 5s while every thread works at 6231261Szelenkov@nginx.com least 3s. So without releasing GIL test should fail. 6241261Szelenkov@nginx.com """ 6251261Szelenkov@nginx.com 6261261Szelenkov@nginx.com self.load('threading') 6271261Szelenkov@nginx.com 6281261Szelenkov@nginx.com for _ in range(10): 6291261Szelenkov@nginx.com self.get(no_recv=True) 6301261Szelenkov@nginx.com 6311261Szelenkov@nginx.com self.assertIsNotNone( 6321261Szelenkov@nginx.com self.wait_for_record(r'\(5\) Thread: 100'), 'last thread finished' 6331261Szelenkov@nginx.com ) 6341017Szelenkov@nginx.com 6351283Szelenkov@nginx.com def test_python_application_iter_exception(self): 6361283Szelenkov@nginx.com self.load('iter_exception') 6371283Szelenkov@nginx.com 6381283Szelenkov@nginx.com # Default request doesn't lead to the exception. 6391283Szelenkov@nginx.com 6401283Szelenkov@nginx.com resp = self.get( 6411283Szelenkov@nginx.com headers={ 6421283Szelenkov@nginx.com 'Host': 'localhost', 6431283Szelenkov@nginx.com 'X-Skip': '9', 6441283Szelenkov@nginx.com 'X-Chunked': '1', 6451283Szelenkov@nginx.com 'Connection': 'close', 6461283Szelenkov@nginx.com } 6471283Szelenkov@nginx.com ) 6481283Szelenkov@nginx.com self.assertEqual(resp['status'], 200, 'status') 6491295St.nateldemoura@f5.com self.assertEqual(resp['body'], 'XXXXXXX', 'body') 6501283Szelenkov@nginx.com 6511283Szelenkov@nginx.com # Exception before start_response(). 6521283Szelenkov@nginx.com 6531283Szelenkov@nginx.com self.assertEqual(self.get()['status'], 503, 'error') 6541283Szelenkov@nginx.com 6551283Szelenkov@nginx.com self.assertIsNotNone(self.wait_for_record(r'Traceback'), 'traceback') 6561283Szelenkov@nginx.com self.assertIsNotNone( 6571283Szelenkov@nginx.com self.wait_for_record(r'raise Exception\(\'first exception\'\)'), 6581283Szelenkov@nginx.com 'first exception raise', 6591283Szelenkov@nginx.com ) 6601283Szelenkov@nginx.com self.assertEqual( 6611283Szelenkov@nginx.com len(self.findall(r'Traceback')), 1, 'traceback count 1' 6621283Szelenkov@nginx.com ) 6631283Szelenkov@nginx.com 6641283Szelenkov@nginx.com # Exception after start_response(), before first write(). 6651283Szelenkov@nginx.com 6661283Szelenkov@nginx.com self.assertEqual( 6671283Szelenkov@nginx.com self.get( 6681283Szelenkov@nginx.com headers={ 6691283Szelenkov@nginx.com 'Host': 'localhost', 6701283Szelenkov@nginx.com 'X-Skip': '1', 6711283Szelenkov@nginx.com 'Connection': 'close', 6721283Szelenkov@nginx.com } 6731283Szelenkov@nginx.com )['status'], 6741283Szelenkov@nginx.com 503, 6751283Szelenkov@nginx.com 'error 2', 6761283Szelenkov@nginx.com ) 6771283Szelenkov@nginx.com 6781283Szelenkov@nginx.com self.assertIsNotNone( 6791283Szelenkov@nginx.com self.wait_for_record(r'raise Exception\(\'second exception\'\)'), 6801283Szelenkov@nginx.com 'exception raise second', 6811283Szelenkov@nginx.com ) 6821283Szelenkov@nginx.com self.assertEqual( 6831283Szelenkov@nginx.com len(self.findall(r'Traceback')), 2, 'traceback count 2' 6841283Szelenkov@nginx.com ) 6851283Szelenkov@nginx.com 6861283Szelenkov@nginx.com # Exception after first write(), before first __next__(). 6871283Szelenkov@nginx.com 6881283Szelenkov@nginx.com _, sock = self.get( 6891283Szelenkov@nginx.com headers={ 6901283Szelenkov@nginx.com 'Host': 'localhost', 6911283Szelenkov@nginx.com 'X-Skip': '2', 6921283Szelenkov@nginx.com 'Connection': 'keep-alive', 6931283Szelenkov@nginx.com }, 6941283Szelenkov@nginx.com start=True, 6951283Szelenkov@nginx.com ) 6961283Szelenkov@nginx.com 6971283Szelenkov@nginx.com self.assertIsNotNone( 6981283Szelenkov@nginx.com self.wait_for_record(r'raise Exception\(\'third exception\'\)'), 6991283Szelenkov@nginx.com 'exception raise third', 7001283Szelenkov@nginx.com ) 7011283Szelenkov@nginx.com self.assertEqual( 7021283Szelenkov@nginx.com len(self.findall(r'Traceback')), 3, 'traceback count 3' 7031283Szelenkov@nginx.com ) 7041283Szelenkov@nginx.com 7051283Szelenkov@nginx.com self.assertDictEqual(self.get(sock=sock), {}, 'closed connection') 7061283Szelenkov@nginx.com 7071283Szelenkov@nginx.com # Exception after first write(), before first __next__(), 7081283Szelenkov@nginx.com # chunked (incomplete body). 7091283Szelenkov@nginx.com 7101283Szelenkov@nginx.com resp = self.get( 7111283Szelenkov@nginx.com headers={ 7121283Szelenkov@nginx.com 'Host': 'localhost', 7131283Szelenkov@nginx.com 'X-Skip': '2', 7141283Szelenkov@nginx.com 'X-Chunked': '1', 7151283Szelenkov@nginx.com 'Connection': 'close', 7161295St.nateldemoura@f5.com }, 7171295St.nateldemoura@f5.com raw_resp=True 7181283Szelenkov@nginx.com ) 7191295St.nateldemoura@f5.com if resp: 7201295St.nateldemoura@f5.com self.assertNotEqual(resp[-5:], '0\r\n\r\n', 'incomplete body') 7211283Szelenkov@nginx.com self.assertEqual( 7221283Szelenkov@nginx.com len(self.findall(r'Traceback')), 4, 'traceback count 4' 7231283Szelenkov@nginx.com ) 7241283Szelenkov@nginx.com 7251283Szelenkov@nginx.com # Exception in __next__(). 7261283Szelenkov@nginx.com 7271283Szelenkov@nginx.com _, sock = self.get( 7281283Szelenkov@nginx.com headers={ 7291283Szelenkov@nginx.com 'Host': 'localhost', 7301283Szelenkov@nginx.com 'X-Skip': '3', 7311283Szelenkov@nginx.com 'Connection': 'keep-alive', 7321283Szelenkov@nginx.com }, 7331283Szelenkov@nginx.com start=True, 7341283Szelenkov@nginx.com ) 7351283Szelenkov@nginx.com 7361283Szelenkov@nginx.com self.assertIsNotNone( 7371283Szelenkov@nginx.com self.wait_for_record(r'raise Exception\(\'next exception\'\)'), 7381283Szelenkov@nginx.com 'exception raise next', 7391283Szelenkov@nginx.com ) 7401283Szelenkov@nginx.com self.assertEqual( 7411283Szelenkov@nginx.com len(self.findall(r'Traceback')), 5, 'traceback count 5' 7421283Szelenkov@nginx.com ) 7431283Szelenkov@nginx.com 7441283Szelenkov@nginx.com self.assertDictEqual(self.get(sock=sock), {}, 'closed connection 2') 7451283Szelenkov@nginx.com 7461283Szelenkov@nginx.com # Exception in __next__(), chunked (incomplete body). 7471283Szelenkov@nginx.com 7481283Szelenkov@nginx.com resp = self.get( 7491283Szelenkov@nginx.com headers={ 7501283Szelenkov@nginx.com 'Host': 'localhost', 7511283Szelenkov@nginx.com 'X-Skip': '3', 7521283Szelenkov@nginx.com 'X-Chunked': '1', 7531283Szelenkov@nginx.com 'Connection': 'close', 7541295St.nateldemoura@f5.com }, 7551295St.nateldemoura@f5.com raw_resp=True 7561283Szelenkov@nginx.com ) 7571295St.nateldemoura@f5.com if resp: 7581295St.nateldemoura@f5.com self.assertNotEqual(resp[-5:], '0\r\n\r\n', 'incomplete body 2') 7591283Szelenkov@nginx.com self.assertEqual( 7601283Szelenkov@nginx.com len(self.findall(r'Traceback')), 6, 'traceback count 6' 7611283Szelenkov@nginx.com ) 7621283Szelenkov@nginx.com 7631283Szelenkov@nginx.com # Exception before start_response() and in close(). 7641283Szelenkov@nginx.com 7651283Szelenkov@nginx.com self.assertEqual( 7661283Szelenkov@nginx.com self.get( 7671283Szelenkov@nginx.com headers={ 7681283Szelenkov@nginx.com 'Host': 'localhost', 7691283Szelenkov@nginx.com 'X-Not-Skip-Close': '1', 7701283Szelenkov@nginx.com 'Connection': 'close', 7711283Szelenkov@nginx.com } 7721283Szelenkov@nginx.com )['status'], 7731283Szelenkov@nginx.com 503, 7741283Szelenkov@nginx.com 'error', 7751283Szelenkov@nginx.com ) 7761283Szelenkov@nginx.com 7771283Szelenkov@nginx.com self.assertIsNotNone( 7781283Szelenkov@nginx.com self.wait_for_record(r'raise Exception\(\'close exception\'\)'), 7791283Szelenkov@nginx.com 'exception raise close', 7801283Szelenkov@nginx.com ) 7811283Szelenkov@nginx.com self.assertEqual( 7821283Szelenkov@nginx.com len(self.findall(r'Traceback')), 8, 'traceback count 8' 7831283Szelenkov@nginx.com ) 7841283Szelenkov@nginx.com 7851304St.nateldemoura@f5.com def test_python_user_group(self): 7861304St.nateldemoura@f5.com if not self.is_su: 7871304St.nateldemoura@f5.com print("requires root") 7881304St.nateldemoura@f5.com raise unittest.SkipTest() 7891304St.nateldemoura@f5.com 7901304St.nateldemoura@f5.com nobody_uid = pwd.getpwnam('nobody').pw_uid 7911304St.nateldemoura@f5.com 7921304St.nateldemoura@f5.com group = 'nobody' 7931304St.nateldemoura@f5.com 7941304St.nateldemoura@f5.com try: 7951304St.nateldemoura@f5.com group_id = grp.getgrnam(group).gr_gid 7961304St.nateldemoura@f5.com except: 7971304St.nateldemoura@f5.com group = 'nogroup' 7981304St.nateldemoura@f5.com group_id = grp.getgrnam(group).gr_gid 7991304St.nateldemoura@f5.com 8001304St.nateldemoura@f5.com self.load('user_group') 8011304St.nateldemoura@f5.com 8021304St.nateldemoura@f5.com obj = self.getjson()['body'] 8031304St.nateldemoura@f5.com self.assertEqual(obj['UID'], nobody_uid, 'nobody uid') 8041304St.nateldemoura@f5.com self.assertEqual(obj['GID'], group_id, 'nobody gid') 8051304St.nateldemoura@f5.com 8061304St.nateldemoura@f5.com self.load('user_group', user='nobody') 8071304St.nateldemoura@f5.com 8081304St.nateldemoura@f5.com obj = self.getjson()['body'] 8091304St.nateldemoura@f5.com self.assertEqual(obj['UID'], nobody_uid, 'nobody uid user=nobody') 8101304St.nateldemoura@f5.com self.assertEqual(obj['GID'], group_id, 'nobody gid user=nobody') 8111304St.nateldemoura@f5.com 8121304St.nateldemoura@f5.com self.load('user_group', user='nobody', group=group) 8131304St.nateldemoura@f5.com 8141304St.nateldemoura@f5.com obj = self.getjson()['body'] 8151304St.nateldemoura@f5.com self.assertEqual( 8161304St.nateldemoura@f5.com obj['UID'], nobody_uid, 'nobody uid user=nobody group=%s' % group 8171304St.nateldemoura@f5.com ) 8181304St.nateldemoura@f5.com 8191304St.nateldemoura@f5.com self.assertEqual( 8201304St.nateldemoura@f5.com obj['GID'], group_id, 'nobody gid user=nobody group=%s' % group 8211304St.nateldemoura@f5.com ) 8221304St.nateldemoura@f5.com 8231304St.nateldemoura@f5.com self.load('user_group', group=group) 8241304St.nateldemoura@f5.com 8251304St.nateldemoura@f5.com obj = self.getjson()['body'] 8261304St.nateldemoura@f5.com self.assertEqual( 8271304St.nateldemoura@f5.com obj['UID'], nobody_uid, 'nobody uid group=%s' % group 8281304St.nateldemoura@f5.com ) 8291304St.nateldemoura@f5.com 8301304St.nateldemoura@f5.com self.assertEqual(obj['GID'], group_id, 'nobody gid group=%s' % group) 8311304St.nateldemoura@f5.com 8321304St.nateldemoura@f5.com self.load('user_group', user='root') 8331304St.nateldemoura@f5.com 8341304St.nateldemoura@f5.com obj = self.getjson()['body'] 8351304St.nateldemoura@f5.com self.assertEqual(obj['UID'], 0, 'root uid user=root') 8361304St.nateldemoura@f5.com self.assertEqual(obj['GID'], 0, 'root gid user=root') 8371304St.nateldemoura@f5.com 8381304St.nateldemoura@f5.com group = 'root' 8391304St.nateldemoura@f5.com 8401304St.nateldemoura@f5.com try: 8411304St.nateldemoura@f5.com grp.getgrnam(group) 8421304St.nateldemoura@f5.com group = True 8431304St.nateldemoura@f5.com except: 8441304St.nateldemoura@f5.com group = False 8451304St.nateldemoura@f5.com 8461304St.nateldemoura@f5.com if group: 8471304St.nateldemoura@f5.com self.load('user_group', user='root', group='root') 8481304St.nateldemoura@f5.com 8491304St.nateldemoura@f5.com obj = self.getjson()['body'] 8501304St.nateldemoura@f5.com self.assertEqual(obj['UID'], 0, 'root uid user=root group=root') 8511304St.nateldemoura@f5.com self.assertEqual(obj['GID'], 0, 'root gid user=root group=root') 8521304St.nateldemoura@f5.com 8531304St.nateldemoura@f5.com self.load('user_group', group='root') 8541304St.nateldemoura@f5.com 8551304St.nateldemoura@f5.com obj = self.getjson()['body'] 8561304St.nateldemoura@f5.com self.assertEqual(obj['UID'], nobody_uid, 'root uid group=root') 8571304St.nateldemoura@f5.com self.assertEqual(obj['GID'], 0, 'root gid group=root') 8581304St.nateldemoura@f5.com 859484Szelenkov@nginx.comif __name__ == '__main__': 8601019Szelenkov@nginx.com TestPythonApplication.main() 861