11596Szelenkov@nginx.comimport re 21477Szelenkov@nginx.com 31635Szelenkov@nginx.comimport pytest 42616Szelenkov@nginx.com 52491Szelenkov@nginx.comfrom unit.applications.lang.node import ApplicationNode 61735Szelenkov@nginx.comfrom unit.utils import waitforfiles 7855Spluknet@nginx.com 82488Szelenkov@nginx.comprerequisites = {'modules': {'node': 'all'}} 92488Szelenkov@nginx.com 102491Szelenkov@nginx.comclient = ApplicationNode() 111017Szelenkov@nginx.com 122491Szelenkov@nginx.com 132491Szelenkov@nginx.comdef assert_basic_application(): 142491Szelenkov@nginx.com resp = client.get() 152491Szelenkov@nginx.com assert resp['headers']['Content-Type'] == 'text/plain', 'basic header' 162491Szelenkov@nginx.com assert resp['body'] == 'Hello World\n', 'basic body' 172491Szelenkov@nginx.com 182491Szelenkov@nginx.com 192491Szelenkov@nginx.comdef test_node_application_basic(): 202491Szelenkov@nginx.com client.load('basic') 212491Szelenkov@nginx.com 222491Szelenkov@nginx.com assert_basic_application() 232491Szelenkov@nginx.com 24*2642Sg.javorszky@f5.comdef test_node_application_options(wait_for_record): 25*2642Sg.javorszky@f5.com client.load('options') 26*2642Sg.javorszky@f5.com 27*2642Sg.javorszky@f5.com assert_basic_application() 28*2642Sg.javorszky@f5.com assert wait_for_record(r'constructor was called with unsupported') is not None 29*2642Sg.javorszky@f5.com 302491Szelenkov@nginx.com 312491Szelenkov@nginx.comdef test_node_application_loader_unit_http(): 322491Szelenkov@nginx.com client.load('loader/unit_http') 332491Szelenkov@nginx.com 342491Szelenkov@nginx.com assert_basic_application() 352491Szelenkov@nginx.com 362491Szelenkov@nginx.com 372491Szelenkov@nginx.comdef test_node_application_loader_transitive_dependency(): 382491Szelenkov@nginx.com client.load('loader/transitive_dependency') 392491Szelenkov@nginx.com 402491Szelenkov@nginx.com assert_basic_application() 412491Szelenkov@nginx.com 422491Szelenkov@nginx.com 432491Szelenkov@nginx.comdef test_node_application_seq(): 442491Szelenkov@nginx.com client.load('basic') 452491Szelenkov@nginx.com 462491Szelenkov@nginx.com assert client.get()['status'] == 200, 'seq' 472491Szelenkov@nginx.com assert client.get()['status'] == 200, 'seq 2' 482491Szelenkov@nginx.com 492491Szelenkov@nginx.com 502491Szelenkov@nginx.comdef test_node_application_variables(date_to_sec_epoch, sec_epoch): 512491Szelenkov@nginx.com client.load('variables') 522491Szelenkov@nginx.com 532491Szelenkov@nginx.com body = 'Test body string.' 542491Szelenkov@nginx.com 552491Szelenkov@nginx.com resp = client.post( 562491Szelenkov@nginx.com headers={ 572491Szelenkov@nginx.com 'Host': 'localhost', 582491Szelenkov@nginx.com 'Content-Type': 'text/html', 592491Szelenkov@nginx.com 'Custom-Header': 'blah', 602491Szelenkov@nginx.com 'Connection': 'close', 612491Szelenkov@nginx.com }, 622491Szelenkov@nginx.com body=body, 632491Szelenkov@nginx.com ) 642491Szelenkov@nginx.com 652491Szelenkov@nginx.com assert resp['status'] == 200, 'status' 662491Szelenkov@nginx.com headers = resp['headers'] 672491Szelenkov@nginx.com header_server = headers.pop('Server') 682491Szelenkov@nginx.com assert re.search(r'Unit/[\d\.]+', header_server), 'server header' 692491Szelenkov@nginx.com 702491Szelenkov@nginx.com date = headers.pop('Date') 712491Szelenkov@nginx.com assert date[-4:] == ' GMT', 'date header timezone' 722491Szelenkov@nginx.com assert abs(date_to_sec_epoch(date) - sec_epoch) < 5, 'date header' 731865So.canty@f5.com 742491Szelenkov@nginx.com raw_headers = headers.pop('Request-Raw-Headers') 752491Szelenkov@nginx.com assert re.search( 762491Szelenkov@nginx.com r'^(?:Host|localhost|Content-Type|' 772491Szelenkov@nginx.com r'text\/html|Custom-Header|blah|Content-Length|17|Connection|' 782491Szelenkov@nginx.com r'close|,)+$', 792491Szelenkov@nginx.com raw_headers, 802491Szelenkov@nginx.com ), 'raw headers' 81855Spluknet@nginx.com 822491Szelenkov@nginx.com assert headers == { 832491Szelenkov@nginx.com 'Connection': 'close', 842491Szelenkov@nginx.com 'Content-Length': str(len(body)), 852491Szelenkov@nginx.com 'Content-Type': 'text/html', 862491Szelenkov@nginx.com 'Request-Method': 'POST', 872491Szelenkov@nginx.com 'Request-Uri': '/', 882491Szelenkov@nginx.com 'Http-Host': 'localhost', 892623Szelenkov@nginx.com 'Server-Protocol': '1.1', 902491Szelenkov@nginx.com 'Custom-Header': 'blah', 912491Szelenkov@nginx.com }, 'headers' 922491Szelenkov@nginx.com assert resp['body'] == body, 'body' 932491Szelenkov@nginx.com 942491Szelenkov@nginx.com 952491Szelenkov@nginx.comdef test_node_application_get_variables(): 962491Szelenkov@nginx.com client.load('get_variables') 972491Szelenkov@nginx.com 982491Szelenkov@nginx.com resp = client.get(url='/?var1=val1&var2=&var3') 992491Szelenkov@nginx.com assert resp['headers']['X-Var-1'] == 'val1', 'GET variables' 1002491Szelenkov@nginx.com assert resp['headers']['X-Var-2'] == '', 'GET variables 2' 1012491Szelenkov@nginx.com assert resp['headers']['X-Var-3'] == '', 'GET variables 3' 1022491Szelenkov@nginx.com 1031865So.canty@f5.com 1042491Szelenkov@nginx.comdef test_node_application_post_variables(): 1052491Szelenkov@nginx.com client.load('post_variables') 1062491Szelenkov@nginx.com 1072491Szelenkov@nginx.com resp = client.post( 1082491Szelenkov@nginx.com headers={ 1092491Szelenkov@nginx.com 'Content-Type': 'application/x-www-form-urlencoded', 1102491Szelenkov@nginx.com 'Host': 'localhost', 1112491Szelenkov@nginx.com 'Connection': 'close', 1122491Szelenkov@nginx.com }, 1132491Szelenkov@nginx.com body='var1=val1&var2=&var3', 1142491Szelenkov@nginx.com ) 1151865So.canty@f5.com 1162491Szelenkov@nginx.com assert resp['headers']['X-Var-1'] == 'val1', 'POST variables' 1172491Szelenkov@nginx.com assert resp['headers']['X-Var-2'] == '', 'POST variables 2' 1182491Szelenkov@nginx.com assert resp['headers']['X-Var-3'] == '', 'POST variables 3' 1192491Szelenkov@nginx.com 1202491Szelenkov@nginx.com 1212491Szelenkov@nginx.comdef test_node_application_404(): 1222491Szelenkov@nginx.com client.load('404') 1232491Szelenkov@nginx.com 1242491Szelenkov@nginx.com resp = client.get() 1252491Szelenkov@nginx.com 1262491Szelenkov@nginx.com assert resp['status'] == 404, '404 status' 1272491Szelenkov@nginx.com assert re.search(r'<title>404 Not Found</title>', resp['body']), '404 body' 1282491Szelenkov@nginx.com 1292491Szelenkov@nginx.com 1302491Szelenkov@nginx.comdef test_node_keepalive_body(): 1312491Szelenkov@nginx.com client.load('mirror') 1322491Szelenkov@nginx.com 1332491Szelenkov@nginx.com assert client.get()['status'] == 200, 'init' 1341865So.canty@f5.com 1352491Szelenkov@nginx.com body = '0123456789' * 500 1362491Szelenkov@nginx.com (resp, sock) = client.post( 1372491Szelenkov@nginx.com headers={ 1382491Szelenkov@nginx.com 'Host': 'localhost', 1392491Szelenkov@nginx.com 'Connection': 'keep-alive', 1402491Szelenkov@nginx.com }, 1412491Szelenkov@nginx.com start=True, 1422491Szelenkov@nginx.com body=body, 1432491Szelenkov@nginx.com read_timeout=1, 1442491Szelenkov@nginx.com ) 1452491Szelenkov@nginx.com 1462491Szelenkov@nginx.com assert resp['body'] == '0123456789' * 500, 'keep-alive 1' 1472491Szelenkov@nginx.com 1482491Szelenkov@nginx.com body = '0123456789' 1492491Szelenkov@nginx.com resp = client.post(sock=sock, body=body) 1502491Szelenkov@nginx.com 1512491Szelenkov@nginx.com assert resp['body'] == body, 'keep-alive 2' 1522491Szelenkov@nginx.com 1532491Szelenkov@nginx.com 1542491Szelenkov@nginx.comdef test_node_application_write_buffer(): 1552491Szelenkov@nginx.com client.load('write_buffer') 1562491Szelenkov@nginx.com 1572491Szelenkov@nginx.com assert client.get()['body'] == 'buffer', 'write buffer' 1582491Szelenkov@nginx.com 1592616Szelenkov@nginx.com 1602559Szelenkov@nginx.comdef test_node_application_write_array(): 1612559Szelenkov@nginx.com client.load('write_array') 1622559Szelenkov@nginx.com 1632559Szelenkov@nginx.com assert client.get()['body'] == 'array', 'write array' 1641865So.canty@f5.com 1652616Szelenkov@nginx.com 1662491Szelenkov@nginx.comdef test_node_application_write_callback(temp_dir): 1672491Szelenkov@nginx.com client.load('write_callback') 1682491Szelenkov@nginx.com 1692491Szelenkov@nginx.com assert client.get()['body'] == 'helloworld', 'write callback order' 1702491Szelenkov@nginx.com assert waitforfiles(f'{temp_dir}/node/callback'), 'write callback' 1712491Szelenkov@nginx.com 1722491Szelenkov@nginx.com 1732491Szelenkov@nginx.comdef test_node_application_write_before_write_head(): 1742491Szelenkov@nginx.com client.load('write_before_write_head') 1752491Szelenkov@nginx.com 1762491Szelenkov@nginx.com assert client.get()['status'] == 200, 'write before writeHead' 1772491Szelenkov@nginx.com 178855Spluknet@nginx.com 1792491Szelenkov@nginx.comdef test_node_application_double_end(): 1802491Szelenkov@nginx.com client.load('double_end') 1812491Szelenkov@nginx.com 1822491Szelenkov@nginx.com assert client.get()['status'] == 200, 'double end' 1832491Szelenkov@nginx.com assert client.get()['status'] == 200, 'double end 2' 1842491Szelenkov@nginx.com 1852491Szelenkov@nginx.com 1862491Szelenkov@nginx.comdef test_node_application_write_return(): 1872491Szelenkov@nginx.com client.load('write_return') 1882491Szelenkov@nginx.com 1892491Szelenkov@nginx.com assert client.get()['body'] == 'bodytrue', 'write return' 1902491Szelenkov@nginx.com 1912491Szelenkov@nginx.com 1922491Szelenkov@nginx.comdef test_node_application_remove_header(): 1932491Szelenkov@nginx.com client.load('remove_header') 194855Spluknet@nginx.com 1952491Szelenkov@nginx.com resp = client.get( 1962491Szelenkov@nginx.com headers={ 1972491Szelenkov@nginx.com 'Host': 'localhost', 1982491Szelenkov@nginx.com 'X-Remove': 'X-Header', 1992491Szelenkov@nginx.com 'Connection': 'close', 2002491Szelenkov@nginx.com } 2012491Szelenkov@nginx.com ) 2022491Szelenkov@nginx.com assert resp['headers']['Was-Header'] == 'true', 'was header' 2032491Szelenkov@nginx.com assert resp['headers']['Has-Header'] == 'false', 'has header' 2042491Szelenkov@nginx.com assert not ('X-Header' in resp['headers']), 'remove header' 2052491Szelenkov@nginx.com 2062491Szelenkov@nginx.com 2072491Szelenkov@nginx.comdef test_node_application_remove_header_nonexisting(): 2082491Szelenkov@nginx.com client.load('remove_header') 2092491Szelenkov@nginx.com 2102491Szelenkov@nginx.com assert ( 2112491Szelenkov@nginx.com client.get( 2122491Szelenkov@nginx.com headers={ 2132491Szelenkov@nginx.com 'Host': 'localhost', 2142491Szelenkov@nginx.com 'X-Remove': 'blah', 2152491Szelenkov@nginx.com 'Connection': 'close', 2162491Szelenkov@nginx.com } 2172491Szelenkov@nginx.com )['headers']['Has-Header'] 2182491Szelenkov@nginx.com == 'true' 2192491Szelenkov@nginx.com ), 'remove header nonexisting' 2202491Szelenkov@nginx.com 2212491Szelenkov@nginx.com 2222491Szelenkov@nginx.comdef test_node_application_update_header(): 2232491Szelenkov@nginx.com client.load('update_header') 2242491Szelenkov@nginx.com 2252491Szelenkov@nginx.com assert client.get()['headers']['X-Header'] == 'new', 'update header' 2262491Szelenkov@nginx.com 227855Spluknet@nginx.com 2282491Szelenkov@nginx.comdef test_node_application_set_header_array(): 2292491Szelenkov@nginx.com client.load('set_header_array') 2302491Szelenkov@nginx.com 2312491Szelenkov@nginx.com assert client.get()['headers']['Set-Cookie'] == [ 2322491Szelenkov@nginx.com 'tc=one,two,three', 2332491Szelenkov@nginx.com 'tc=four,five,six', 2342491Szelenkov@nginx.com ], 'set header array' 2352491Szelenkov@nginx.com 2362491Szelenkov@nginx.com 2372491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2382491Szelenkov@nginx.comdef test_node_application_status_message(): 2392491Szelenkov@nginx.com client.load('status_message') 2402491Szelenkov@nginx.com 2412491Szelenkov@nginx.com assert re.search(r'200 blah', client.get(raw_resp=True)), 'status message' 2422491Szelenkov@nginx.com 2432491Szelenkov@nginx.com 2442491Szelenkov@nginx.comdef test_node_application_get_header_type(): 2452491Szelenkov@nginx.com client.load('get_header_type') 246855Spluknet@nginx.com 2472491Szelenkov@nginx.com assert client.get()['headers']['X-Type'] == 'number', 'get header type' 2482491Szelenkov@nginx.com 2492491Szelenkov@nginx.com 2502491Szelenkov@nginx.comdef test_node_application_header_name_case(): 2512491Szelenkov@nginx.com client.load('header_name_case') 2522491Szelenkov@nginx.com 2532491Szelenkov@nginx.com headers = client.get()['headers'] 254855Spluknet@nginx.com 2552491Szelenkov@nginx.com assert headers['X-HEADER'] == '3', 'header value' 2562491Szelenkov@nginx.com assert 'X-Header' not in headers, 'insensitive' 2572491Szelenkov@nginx.com assert 'X-header' not in headers, 'insensitive 2' 2582491Szelenkov@nginx.com 2592491Szelenkov@nginx.com 2602491Szelenkov@nginx.comdef test_node_application_promise_handler_write_after_end(): 2612491Szelenkov@nginx.com client.load('promise_handler') 2622491Szelenkov@nginx.com 2632491Szelenkov@nginx.com assert ( 2642491Szelenkov@nginx.com client.post( 2651017Szelenkov@nginx.com headers={ 2661017Szelenkov@nginx.com 'Host': 'localhost', 2671017Szelenkov@nginx.com 'Content-Type': 'text/html', 2682491Szelenkov@nginx.com 'X-Write-Call': '1', 2691017Szelenkov@nginx.com 'Connection': 'close', 2701017Szelenkov@nginx.com }, 2712491Szelenkov@nginx.com body='callback', 2722491Szelenkov@nginx.com )['status'] 2732491Szelenkov@nginx.com == 200 2742491Szelenkov@nginx.com ), 'promise handler request write after end' 275855Spluknet@nginx.com 276855Spluknet@nginx.com 2772491Szelenkov@nginx.comdef test_node_application_promise_end(temp_dir): 2782491Szelenkov@nginx.com client.load('promise_end') 279855Spluknet@nginx.com 2802491Szelenkov@nginx.com assert ( 2812491Szelenkov@nginx.com client.post( 2821017Szelenkov@nginx.com headers={ 2831017Szelenkov@nginx.com 'Host': 'localhost', 2842491Szelenkov@nginx.com 'Content-Type': 'text/html', 2851017Szelenkov@nginx.com 'Connection': 'close', 2861017Szelenkov@nginx.com }, 2872491Szelenkov@nginx.com body='end', 2882491Szelenkov@nginx.com )['status'] 2892491Szelenkov@nginx.com == 200 2902491Szelenkov@nginx.com ), 'promise end request' 2912491Szelenkov@nginx.com assert waitforfiles(f'{temp_dir}/node/callback'), 'promise end' 2922491Szelenkov@nginx.com 293855Spluknet@nginx.com 2942491Szelenkov@nginx.com@pytest.mark.skip('not yet') 2952491Szelenkov@nginx.comdef test_node_application_header_name_valid(): 2962491Szelenkov@nginx.com client.load('header_name_valid') 297855Spluknet@nginx.com 2982491Szelenkov@nginx.com assert 'status' not in client.get(), 'header name valid' 2992491Szelenkov@nginx.com 300855Spluknet@nginx.com 3012491Szelenkov@nginx.comdef test_node_application_header_value_object(): 3022491Szelenkov@nginx.com client.load('header_value_object') 303855Spluknet@nginx.com 3042491Szelenkov@nginx.com assert 'X-Header' in client.get()['headers'], 'header value object' 3052491Szelenkov@nginx.com 3062491Szelenkov@nginx.com 3072491Szelenkov@nginx.comdef test_node_application_get_header_names(): 3082491Szelenkov@nginx.com client.load('get_header_names') 309855Spluknet@nginx.com 3102491Szelenkov@nginx.com assert client.get()['headers']['X-Names'] == [ 3112491Szelenkov@nginx.com 'date', 3122491Szelenkov@nginx.com 'x-header', 3132491Szelenkov@nginx.com ], 'get header names' 3142491Szelenkov@nginx.com 3152616Szelenkov@nginx.com 3162598Szelenkov@nginx.comdef test_node_application_flush_headers(): 3172598Szelenkov@nginx.com client.load('flush_headers') 3182598Szelenkov@nginx.com 3192598Szelenkov@nginx.com assert client.get()['headers']['X-Header'] == 'blah' 320855Spluknet@nginx.com 3212616Szelenkov@nginx.com 3222491Szelenkov@nginx.comdef test_node_application_has_header(): 3232491Szelenkov@nginx.com client.load('has_header') 3241029Szelenkov@nginx.com 3252491Szelenkov@nginx.com assert ( 3262491Szelenkov@nginx.com client.get( 3271017Szelenkov@nginx.com headers={ 3281017Szelenkov@nginx.com 'Host': 'localhost', 3292491Szelenkov@nginx.com 'X-Header': 'length', 3301017Szelenkov@nginx.com 'Connection': 'close', 3311017Szelenkov@nginx.com } 3322491Szelenkov@nginx.com )['headers']['X-Has-Header'] 3332491Szelenkov@nginx.com == 'false' 3342491Szelenkov@nginx.com ), 'has header length' 335866Szelenkov@nginx.com 3362491Szelenkov@nginx.com assert ( 3372491Szelenkov@nginx.com client.get( 3382491Szelenkov@nginx.com headers={ 3392491Szelenkov@nginx.com 'Host': 'localhost', 3402491Szelenkov@nginx.com 'X-Header': 'Date', 3412491Szelenkov@nginx.com 'Connection': 'close', 3422491Szelenkov@nginx.com } 3432491Szelenkov@nginx.com )['headers']['X-Has-Header'] 3442491Szelenkov@nginx.com == 'false' 3452491Szelenkov@nginx.com ), 'has header date' 346866Szelenkov@nginx.com 347866Szelenkov@nginx.com 3482491Szelenkov@nginx.comdef test_node_application_write_multiple(): 3492491Szelenkov@nginx.com client.load('write_multiple') 350866Szelenkov@nginx.com 3512491Szelenkov@nginx.com assert client.get()['body'] == 'writewrite2end', 'write multiple' 352