xref: /unit/test/test_node_application.py (revision 2642:d92e92c69c5d)
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