11596Szelenkov@nginx.comimport re 21477Szelenkov@nginx.com 3*1635Szelenkov@nginx.comimport pytest 4*1635Szelenkov@nginx.com 5*1635Szelenkov@nginx.comfrom conftest import skip_alert 61019Szelenkov@nginx.comfrom unit.applications.lang.perl import TestApplicationPerl 7544Szelenkov@nginx.com 81017Szelenkov@nginx.com 91019Szelenkov@nginx.comclass TestPerlApplication(TestApplicationPerl): 101467Szelenkov@nginx.com prerequisites = {'modules': {'perl': 'all'}} 11544Szelenkov@nginx.com 12544Szelenkov@nginx.com def test_perl_application(self): 13544Szelenkov@nginx.com self.load('variables') 14544Szelenkov@nginx.com 15544Szelenkov@nginx.com body = 'Test body string.' 16544Szelenkov@nginx.com 171017Szelenkov@nginx.com resp = self.post( 181017Szelenkov@nginx.com headers={ 191017Szelenkov@nginx.com 'Host': 'localhost', 201017Szelenkov@nginx.com 'Content-Type': 'text/html', 211017Szelenkov@nginx.com 'Custom-Header': 'blah', 221017Szelenkov@nginx.com 'Connection': 'close', 231017Szelenkov@nginx.com }, 241017Szelenkov@nginx.com body=body, 251017Szelenkov@nginx.com ) 26544Szelenkov@nginx.com 271596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 28544Szelenkov@nginx.com headers = resp['headers'] 29674Szelenkov@nginx.com header_server = headers.pop('Server') 301596Szelenkov@nginx.com assert re.search(r'Unit/[\d\.]+', header_server), 'server header' 311596Szelenkov@nginx.com assert ( 321596Szelenkov@nginx.com headers.pop('Server-Software') == header_server 331596Szelenkov@nginx.com ), 'server software header' 34599Szelenkov@nginx.com 35599Szelenkov@nginx.com date = headers.pop('Date') 361596Szelenkov@nginx.com assert date[-4:] == ' GMT', 'date header timezone' 371596Szelenkov@nginx.com assert ( 381596Szelenkov@nginx.com abs(self.date_to_sec_epoch(date) - self.sec_epoch()) < 5 391596Szelenkov@nginx.com ), 'date header' 40599Szelenkov@nginx.com 411596Szelenkov@nginx.com assert headers == { 421596Szelenkov@nginx.com 'Connection': 'close', 431596Szelenkov@nginx.com 'Content-Length': str(len(body)), 441596Szelenkov@nginx.com 'Content-Type': 'text/html', 451596Szelenkov@nginx.com 'Request-Method': 'POST', 461596Szelenkov@nginx.com 'Request-Uri': '/', 471596Szelenkov@nginx.com 'Http-Host': 'localhost', 481596Szelenkov@nginx.com 'Server-Protocol': 'HTTP/1.1', 491596Szelenkov@nginx.com 'Custom-Header': 'blah', 501596Szelenkov@nginx.com 'Psgi-Version': '11', 511596Szelenkov@nginx.com 'Psgi-Url-Scheme': 'http', 521596Szelenkov@nginx.com 'Psgi-Multithread': '', 531596Szelenkov@nginx.com 'Psgi-Multiprocess': '1', 541596Szelenkov@nginx.com 'Psgi-Run-Once': '', 551596Szelenkov@nginx.com 'Psgi-Nonblocking': '', 561596Szelenkov@nginx.com 'Psgi-Streaming': '1', 571596Szelenkov@nginx.com }, 'headers' 581596Szelenkov@nginx.com assert resp['body'] == body, 'body' 59544Szelenkov@nginx.com 60544Szelenkov@nginx.com def test_perl_application_query_string(self): 61544Szelenkov@nginx.com self.load('query_string') 62544Szelenkov@nginx.com 63544Szelenkov@nginx.com resp = self.get(url='/?var1=val1&var2=val2') 64544Szelenkov@nginx.com 651596Szelenkov@nginx.com assert ( 661596Szelenkov@nginx.com resp['headers']['Query-String'] == 'var1=val1&var2=val2' 671596Szelenkov@nginx.com ), 'Query-String header' 68544Szelenkov@nginx.com 69894Szelenkov@nginx.com def test_perl_application_query_string_empty(self): 70894Szelenkov@nginx.com self.load('query_string') 71894Szelenkov@nginx.com 72894Szelenkov@nginx.com resp = self.get(url='/?') 73894Szelenkov@nginx.com 741596Szelenkov@nginx.com assert resp['status'] == 200, 'query string empty status' 751596Szelenkov@nginx.com assert resp['headers']['Query-String'] == '', 'query string empty' 76894Szelenkov@nginx.com 77894Szelenkov@nginx.com def test_perl_application_query_string_absent(self): 78894Szelenkov@nginx.com self.load('query_string') 79894Szelenkov@nginx.com 80894Szelenkov@nginx.com resp = self.get() 81894Szelenkov@nginx.com 821596Szelenkov@nginx.com assert resp['status'] == 200, 'query string absent status' 831596Szelenkov@nginx.com assert resp['headers']['Query-String'] == '', 'query string absent' 84894Szelenkov@nginx.com 851596Szelenkov@nginx.com @pytest.mark.skip('not yet') 86544Szelenkov@nginx.com def test_perl_application_server_port(self): 87544Szelenkov@nginx.com self.load('server_port') 88544Szelenkov@nginx.com 891596Szelenkov@nginx.com assert ( 901596Szelenkov@nginx.com self.get()['headers']['Server-Port'] == '7080' 911596Szelenkov@nginx.com ), 'Server-Port header' 92544Szelenkov@nginx.com 93544Szelenkov@nginx.com def test_perl_application_input_read_empty(self): 94544Szelenkov@nginx.com self.load('input_read_empty') 95544Szelenkov@nginx.com 961596Szelenkov@nginx.com assert self.get()['body'] == '', 'read empty' 97544Szelenkov@nginx.com 98554Szelenkov@nginx.com def test_perl_application_input_read_parts(self): 99554Szelenkov@nginx.com self.load('input_read_parts') 100554Szelenkov@nginx.com 1011596Szelenkov@nginx.com assert ( 1021596Szelenkov@nginx.com self.post(body='0123456789')['body'] == '0123456789' 1031596Szelenkov@nginx.com ), 'input read parts' 104554Szelenkov@nginx.com 1051596Szelenkov@nginx.com @pytest.mark.skip('not yet') 106544Szelenkov@nginx.com def test_perl_application_input_read_offset(self): 107544Szelenkov@nginx.com self.load('input_read_offset') 108544Szelenkov@nginx.com 1091596Szelenkov@nginx.com assert self.post(body='0123456789')['body'] == '4567', 'read offset' 110544Szelenkov@nginx.com 111544Szelenkov@nginx.com def test_perl_application_input_copy(self): 112544Szelenkov@nginx.com self.load('input_copy') 113544Szelenkov@nginx.com 114544Szelenkov@nginx.com body = '0123456789' 1151596Szelenkov@nginx.com assert self.post(body=body)['body'] == body, 'input copy' 116544Szelenkov@nginx.com 117544Szelenkov@nginx.com def test_perl_application_errors_print(self): 118544Szelenkov@nginx.com self.load('errors_print') 119544Szelenkov@nginx.com 1201596Szelenkov@nginx.com assert self.get()['body'] == '1', 'errors result' 121544Szelenkov@nginx.com 122585Szelenkov@nginx.com self.stop() 123544Szelenkov@nginx.com 1241596Szelenkov@nginx.com assert ( 1251596Szelenkov@nginx.com self.wait_for_record(r'\[error\].+Error in application') 1261596Szelenkov@nginx.com is not None 1271596Szelenkov@nginx.com ), 'errors print' 128544Szelenkov@nginx.com 129554Szelenkov@nginx.com def test_perl_application_header_equal_names(self): 130554Szelenkov@nginx.com self.load('header_equal_names') 131554Szelenkov@nginx.com 1321596Szelenkov@nginx.com assert self.get()['headers']['Set-Cookie'] == [ 1331596Szelenkov@nginx.com 'tc=one,two,three', 1341596Szelenkov@nginx.com 'tc=four,five,six', 1351596Szelenkov@nginx.com ], 'header equal names' 136554Szelenkov@nginx.com 137544Szelenkov@nginx.com def test_perl_application_header_pairs(self): 138544Szelenkov@nginx.com self.load('header_pairs') 139544Szelenkov@nginx.com 1401596Szelenkov@nginx.com assert self.get()['headers']['blah'] == 'blah', 'header pairs' 141544Szelenkov@nginx.com 142544Szelenkov@nginx.com def test_perl_application_body_empty(self): 143544Szelenkov@nginx.com self.load('body_empty') 144544Szelenkov@nginx.com 1451596Szelenkov@nginx.com assert self.get()['body'] == '', 'body empty' 146544Szelenkov@nginx.com 147544Szelenkov@nginx.com def test_perl_application_body_array(self): 148544Szelenkov@nginx.com self.load('body_array') 149544Szelenkov@nginx.com 1501596Szelenkov@nginx.com assert self.get()['body'] == '0123456789', 'body array' 151544Szelenkov@nginx.com 152544Szelenkov@nginx.com def test_perl_application_body_large(self): 153544Szelenkov@nginx.com self.load('variables') 154544Szelenkov@nginx.com 155544Szelenkov@nginx.com body = '0123456789' * 1000 156544Szelenkov@nginx.com 157554Szelenkov@nginx.com resp = self.post(body=body)['body'] 158544Szelenkov@nginx.com 1591596Szelenkov@nginx.com assert resp == body, 'body large' 160544Szelenkov@nginx.com 161544Szelenkov@nginx.com def test_perl_application_body_io_empty(self): 162544Szelenkov@nginx.com self.load('body_io_empty') 163544Szelenkov@nginx.com 1641596Szelenkov@nginx.com assert self.get()['status'] == 200, 'body io empty' 165544Szelenkov@nginx.com 166544Szelenkov@nginx.com def test_perl_application_body_io_file(self): 167544Szelenkov@nginx.com self.load('body_io_file') 168544Szelenkov@nginx.com 1691596Szelenkov@nginx.com assert self.get()['body'] == 'body\n', 'body io file' 170544Szelenkov@nginx.com 1711596Szelenkov@nginx.com @pytest.mark.skip('not yet') 172607Szelenkov@nginx.com def test_perl_application_syntax_error(self): 1731596Szelenkov@nginx.com skip_alert(r'PSGI: Failed to parse script') 174607Szelenkov@nginx.com self.load('syntax_error') 175607Szelenkov@nginx.com 1761596Szelenkov@nginx.com assert self.get()['status'] == 500, 'syntax error' 177607Szelenkov@nginx.com 178581Szelenkov@nginx.com def test_perl_keepalive_body(self): 179581Szelenkov@nginx.com self.load('variables') 180581Szelenkov@nginx.com 1811596Szelenkov@nginx.com assert self.get()['status'] == 200, 'init' 1821029Szelenkov@nginx.com 1831453Szelenkov@nginx.com body = '0123456789' * 500 1841017Szelenkov@nginx.com (resp, sock) = self.post( 1851017Szelenkov@nginx.com headers={ 1861017Szelenkov@nginx.com 'Host': 'localhost', 1871017Szelenkov@nginx.com 'Connection': 'keep-alive', 1881017Szelenkov@nginx.com 'Content-Type': 'text/html', 1891017Szelenkov@nginx.com }, 1901017Szelenkov@nginx.com start=True, 1911453Szelenkov@nginx.com body=body, 1921029Szelenkov@nginx.com read_timeout=1, 1931017Szelenkov@nginx.com ) 194581Szelenkov@nginx.com 1951596Szelenkov@nginx.com assert resp['body'] == body, 'keep-alive 1' 196581Szelenkov@nginx.com 1971453Szelenkov@nginx.com body = '0123456789' 1981017Szelenkov@nginx.com resp = self.post( 1991017Szelenkov@nginx.com headers={ 2001017Szelenkov@nginx.com 'Host': 'localhost', 2011017Szelenkov@nginx.com 'Connection': 'close', 2021017Szelenkov@nginx.com 'Content-Type': 'text/html', 2031017Szelenkov@nginx.com }, 2041017Szelenkov@nginx.com sock=sock, 2051453Szelenkov@nginx.com body=body, 2061017Szelenkov@nginx.com ) 207581Szelenkov@nginx.com 2081596Szelenkov@nginx.com assert resp['body'] == body, 'keep-alive 2' 209581Szelenkov@nginx.com 210916Szelenkov@nginx.com def test_perl_body_io_fake(self): 211916Szelenkov@nginx.com self.load('body_io_fake') 212916Szelenkov@nginx.com 2131596Szelenkov@nginx.com assert self.get()['body'] == '21', 'body io fake' 214916Szelenkov@nginx.com 2151596Szelenkov@nginx.com assert ( 2161596Szelenkov@nginx.com self.wait_for_record(r'\[error\].+IOFake getline\(\) \$\/ is \d+') 2171596Szelenkov@nginx.com is not None 2181596Szelenkov@nginx.com ), 'body io fake $/ value' 219916Szelenkov@nginx.com 2201596Szelenkov@nginx.com assert ( 2211596Szelenkov@nginx.com self.wait_for_record(r'\[error\].+IOFake close\(\) called') 2221596Szelenkov@nginx.com is not None 2231596Szelenkov@nginx.com ), 'body io fake close' 224916Szelenkov@nginx.com 225988Szelenkov@nginx.com def test_perl_delayed_response(self): 226988Szelenkov@nginx.com self.load('delayed_response') 227988Szelenkov@nginx.com 228988Szelenkov@nginx.com resp = self.get() 229988Szelenkov@nginx.com 2301596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 2311596Szelenkov@nginx.com assert resp['body'] == 'Hello World!', 'body' 232988Szelenkov@nginx.com 233988Szelenkov@nginx.com def test_perl_streaming_body(self): 234988Szelenkov@nginx.com self.load('streaming_body') 235988Szelenkov@nginx.com 236988Szelenkov@nginx.com resp = self.get() 237988Szelenkov@nginx.com 2381596Szelenkov@nginx.com assert resp['status'] == 200, 'status' 2391596Szelenkov@nginx.com assert resp['body'] == 'Hello World!', 'body' 240