xref: /unit/test/test_settings.py (revision 2616:ab2896c980ab)
11635Szelenkov@nginx.comimport re
21477Szelenkov@nginx.comimport socket
32482Szelenkov@nginx.comimport subprocess
4730Szelenkov@nginx.comimport time
51477Szelenkov@nginx.com
61635Szelenkov@nginx.comimport pytest
7*2616Szelenkov@nginx.com
82491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython
9730Szelenkov@nginx.com
102488Szelenkov@nginx.comprerequisites = {'modules': {'python': 'any'}}
112488Szelenkov@nginx.com
122491Szelenkov@nginx.comclient = ApplicationPython()
132482Szelenkov@nginx.com
142267Szelenkov@nginx.com
152491Szelenkov@nginx.comdef sysctl():
162491Szelenkov@nginx.com    try:
172491Szelenkov@nginx.com        out = subprocess.check_output(
182491Szelenkov@nginx.com            ['sysctl', '-a'], stderr=subprocess.STDOUT
192491Szelenkov@nginx.com        ).decode()
202491Szelenkov@nginx.com    except FileNotFoundError:
212491Szelenkov@nginx.com        pytest.skip('requires sysctl')
222267Szelenkov@nginx.com
232491Szelenkov@nginx.com    return out
242267Szelenkov@nginx.com
252267Szelenkov@nginx.com
262491Szelenkov@nginx.comdef test_settings_large_header_buffer_size():
272491Szelenkov@nginx.com    client.load('empty')
282267Szelenkov@nginx.com
292491Szelenkov@nginx.com    def set_buffer_size(size):
302491Szelenkov@nginx.com        assert 'success' in client.conf(
312491Szelenkov@nginx.com            {'http': {'large_header_buffer_size': size}},
322491Szelenkov@nginx.com            'settings',
332491Szelenkov@nginx.com        )
342470Szelenkov@nginx.com
352491Szelenkov@nginx.com    def header_value(size, expect=200):
362491Szelenkov@nginx.com        headers = {'Host': 'a' * (size - 1), 'Connection': 'close'}
372491Szelenkov@nginx.com        assert client.get(headers=headers)['status'] == expect
38730Szelenkov@nginx.com
392491Szelenkov@nginx.com    set_buffer_size(4096)
402491Szelenkov@nginx.com    header_value(4096)
412491Szelenkov@nginx.com    header_value(4097, 431)
42730Szelenkov@nginx.com
432491Szelenkov@nginx.com    set_buffer_size(16384)
442491Szelenkov@nginx.com    header_value(16384)
452491Szelenkov@nginx.com    header_value(16385, 431)
46730Szelenkov@nginx.com
471878Szelenkov@nginx.com
482491Szelenkov@nginx.comdef test_settings_large_header_buffers():
492491Szelenkov@nginx.com    client.load('empty')
50730Szelenkov@nginx.com
512491Szelenkov@nginx.com    def set_buffers(buffers):
522491Szelenkov@nginx.com        assert 'success' in client.conf(
532491Szelenkov@nginx.com            {'http': {'large_header_buffers': buffers}},
542491Szelenkov@nginx.com            'settings',
551878Szelenkov@nginx.com        )
56756Szelenkov@nginx.com
572491Szelenkov@nginx.com    def big_headers(headers_num, expect=200):
582491Szelenkov@nginx.com        headers = {'Host': 'localhost', 'Connection': 'close'}
592491Szelenkov@nginx.com
602491Szelenkov@nginx.com        for i in range(headers_num):
612491Szelenkov@nginx.com            headers[f'Custom-header-{i}'] = 'a' * 8000
622491Szelenkov@nginx.com
632491Szelenkov@nginx.com        assert client.get(headers=headers)['status'] == expect
642491Szelenkov@nginx.com
652491Szelenkov@nginx.com    set_buffers(1)
662491Szelenkov@nginx.com    big_headers(1)
672491Szelenkov@nginx.com    big_headers(2, 431)
682491Szelenkov@nginx.com
692491Szelenkov@nginx.com    set_buffers(2)
702491Szelenkov@nginx.com    big_headers(2)
712491Szelenkov@nginx.com    big_headers(3, 431)
722491Szelenkov@nginx.com
732491Szelenkov@nginx.com    set_buffers(8)
742491Szelenkov@nginx.com    big_headers(8)
752491Szelenkov@nginx.com    big_headers(9, 431)
762491Szelenkov@nginx.com
772491Szelenkov@nginx.com
782491Szelenkov@nginx.com@pytest.mark.skip('not yet')
792491Szelenkov@nginx.comdef test_settings_large_header_buffer_invalid():
802491Szelenkov@nginx.com    def check_error(conf):
812491Szelenkov@nginx.com        assert 'error' in client.conf({'http': conf}, 'settings')
822491Szelenkov@nginx.com
832491Szelenkov@nginx.com    check_error({'large_header_buffer_size': -1})
842491Szelenkov@nginx.com    check_error({'large_header_buffer_size': 0})
852491Szelenkov@nginx.com    check_error({'large_header_buffers': -1})
862491Szelenkov@nginx.com    check_error({'large_header_buffers': 0})
872491Szelenkov@nginx.com
882491Szelenkov@nginx.com
892491Szelenkov@nginx.comdef test_settings_server_version():
902491Szelenkov@nginx.com    client.load('empty')
912491Szelenkov@nginx.com
922491Szelenkov@nginx.com    assert client.get()['headers']['Server'].startswith('Unit/')
932491Szelenkov@nginx.com
942491Szelenkov@nginx.com    assert 'success' in client.conf(
952491Szelenkov@nginx.com        {"http": {"server_version": False}}, 'settings'
962491Szelenkov@nginx.com    ), 'remove version'
972491Szelenkov@nginx.com    assert client.get()['headers']['Server'] == 'Unit'
982491Szelenkov@nginx.com
992491Szelenkov@nginx.com    assert 'success' in client.conf(
1002491Szelenkov@nginx.com        {"http": {"server_version": True}}, 'settings'
1012491Szelenkov@nginx.com    ), 'add version'
1022491Szelenkov@nginx.com    assert client.get()['headers']['Server'].startswith('Unit/')
1032491Szelenkov@nginx.com
1042491Szelenkov@nginx.com
1052491Szelenkov@nginx.comdef test_settings_header_read_timeout():
1062491Szelenkov@nginx.com    client.load('empty')
1072491Szelenkov@nginx.com
1082491Szelenkov@nginx.com    def req():
1092491Szelenkov@nginx.com        (_, sock) = client.http(
1101017Szelenkov@nginx.com            b"""GET / HTTP/1.1
1111017Szelenkov@nginx.com""",
1121017Szelenkov@nginx.com            start=True,
1131017Szelenkov@nginx.com            read_timeout=1,
1141017Szelenkov@nginx.com            raw=True,
1151017Szelenkov@nginx.com        )
116767Szelenkov@nginx.com
1172491Szelenkov@nginx.com        time.sleep(3)
118756Szelenkov@nginx.com
1192491Szelenkov@nginx.com        return client.http(
1202491Szelenkov@nginx.com            b"""Host: localhost
121730Szelenkov@nginx.comConnection: close
122730Szelenkov@nginx.com
1231017Szelenkov@nginx.com""",
1242491Szelenkov@nginx.com            sock=sock,
1252491Szelenkov@nginx.com            raw=True,
1261878Szelenkov@nginx.com        )
127756Szelenkov@nginx.com
1282491Szelenkov@nginx.com    assert 'success' in client.conf(
1292491Szelenkov@nginx.com        {'http': {'header_read_timeout': 2}}, 'settings'
1302491Szelenkov@nginx.com    )
1312491Szelenkov@nginx.com    assert req()['status'] == 408, 'status header read timeout'
1322491Szelenkov@nginx.com
1332491Szelenkov@nginx.com    assert 'success' in client.conf(
1342491Szelenkov@nginx.com        {'http': {'header_read_timeout': 7}}, 'settings'
1352491Szelenkov@nginx.com    )
1362491Szelenkov@nginx.com    assert req()['status'] == 200, 'status header read timeout 2'
1372491Szelenkov@nginx.com
1382491Szelenkov@nginx.com
1392491Szelenkov@nginx.comdef test_settings_header_read_timeout_update():
1402491Szelenkov@nginx.com    client.load('empty')
1412491Szelenkov@nginx.com
1422491Szelenkov@nginx.com    assert 'success' in client.conf(
1432491Szelenkov@nginx.com        {'http': {'header_read_timeout': 4}}, 'settings'
1442491Szelenkov@nginx.com    )
1452491Szelenkov@nginx.com
1462491Szelenkov@nginx.com    sock = client.http(
1472491Szelenkov@nginx.com        b"""GET / HTTP/1.1
1482491Szelenkov@nginx.com""",
1492491Szelenkov@nginx.com        raw=True,
1502491Szelenkov@nginx.com        no_recv=True,
1512491Szelenkov@nginx.com    )
1522491Szelenkov@nginx.com
1532491Szelenkov@nginx.com    time.sleep(2)
1542491Szelenkov@nginx.com
1552491Szelenkov@nginx.com    sock = client.http(
1562491Szelenkov@nginx.com        b"""Host: localhost
1572491Szelenkov@nginx.com""",
1582491Szelenkov@nginx.com        sock=sock,
1592491Szelenkov@nginx.com        raw=True,
1602491Szelenkov@nginx.com        no_recv=True,
1612491Szelenkov@nginx.com    )
1622491Szelenkov@nginx.com
1632491Szelenkov@nginx.com    time.sleep(2)
1642491Szelenkov@nginx.com
1652491Szelenkov@nginx.com    (resp, sock) = client.http(
1662491Szelenkov@nginx.com        b"""X-Blah: blah
1672491Szelenkov@nginx.com""",
1682491Szelenkov@nginx.com        start=True,
1692491Szelenkov@nginx.com        sock=sock,
1702491Szelenkov@nginx.com        read_timeout=1,
1712491Szelenkov@nginx.com        raw=True,
1722491Szelenkov@nginx.com    )
1732491Szelenkov@nginx.com
1742491Szelenkov@nginx.com    if len(resp) != 0:
1752491Szelenkov@nginx.com        sock.close()
1762491Szelenkov@nginx.com
1772491Szelenkov@nginx.com    else:
1782491Szelenkov@nginx.com        time.sleep(2)
1792491Szelenkov@nginx.com
1802491Szelenkov@nginx.com        resp = client.http(
1812491Szelenkov@nginx.com            b"""Connection: close
1822491Szelenkov@nginx.com
1832491Szelenkov@nginx.com""",
1842491Szelenkov@nginx.com            sock=sock,
1852491Szelenkov@nginx.com            raw=True,
1862491Szelenkov@nginx.com        )
1872491Szelenkov@nginx.com
1882491Szelenkov@nginx.com    assert resp['status'] == 408, 'status header read timeout update'
1892491Szelenkov@nginx.com
1902491Szelenkov@nginx.com
1912491Szelenkov@nginx.comdef test_settings_body_read_timeout():
1922491Szelenkov@nginx.com    client.load('empty')
1932491Szelenkov@nginx.com
1942491Szelenkov@nginx.com    def req():
1952491Szelenkov@nginx.com        (_, sock) = client.http(
1961017Szelenkov@nginx.com            b"""POST / HTTP/1.1
197756Szelenkov@nginx.comHost: localhost
198756Szelenkov@nginx.comContent-Length: 10
199756Szelenkov@nginx.comConnection: close
200756Szelenkov@nginx.com
2011017Szelenkov@nginx.com""",
2021017Szelenkov@nginx.com            start=True,
2032491Szelenkov@nginx.com            raw_resp=True,
2041017Szelenkov@nginx.com            read_timeout=1,
2051017Szelenkov@nginx.com            raw=True,
2061017Szelenkov@nginx.com        )
207756Szelenkov@nginx.com
2082491Szelenkov@nginx.com        time.sleep(3)
2092491Szelenkov@nginx.com
2102491Szelenkov@nginx.com        return client.http(b"""0123456789""", sock=sock, raw=True)
211756Szelenkov@nginx.com
2122491Szelenkov@nginx.com    assert 'success' in client.conf(
2132491Szelenkov@nginx.com        {'http': {'body_read_timeout': 2}}, 'settings'
2142491Szelenkov@nginx.com    )
2152491Szelenkov@nginx.com    assert req()['status'] == 408, 'status body read timeout'
2162491Szelenkov@nginx.com
2172491Szelenkov@nginx.com    assert 'success' in client.conf(
2182491Szelenkov@nginx.com        {'http': {'body_read_timeout': 7}}, 'settings'
2192491Szelenkov@nginx.com    )
2202491Szelenkov@nginx.com    assert req()['status'] == 200, 'status body read timeout 2'
221756Szelenkov@nginx.com
2222491Szelenkov@nginx.com
2232491Szelenkov@nginx.comdef test_settings_body_read_timeout_update():
2242491Szelenkov@nginx.com    client.load('empty')
225756Szelenkov@nginx.com
2262491Szelenkov@nginx.com    assert 'success' in client.conf(
2272491Szelenkov@nginx.com        {'http': {'body_read_timeout': 4}}, 'settings'
2282491Szelenkov@nginx.com    )
2292491Szelenkov@nginx.com
2302491Szelenkov@nginx.com    (resp, sock) = client.http(
2312491Szelenkov@nginx.com        b"""POST / HTTP/1.1
2322491Szelenkov@nginx.comHost: localhost
2332491Szelenkov@nginx.comContent-Length: 10
2342491Szelenkov@nginx.comConnection: close
235756Szelenkov@nginx.com
2362491Szelenkov@nginx.com""",
2372491Szelenkov@nginx.com        start=True,
2382491Szelenkov@nginx.com        read_timeout=1,
2392491Szelenkov@nginx.com        raw=True,
2402491Szelenkov@nginx.com    )
241756Szelenkov@nginx.com
2422491Szelenkov@nginx.com    time.sleep(2)
243756Szelenkov@nginx.com
2442491Szelenkov@nginx.com    (resp, sock) = client.http(
2452491Szelenkov@nginx.com        b"""012""", start=True, sock=sock, read_timeout=1, raw=True
2462491Szelenkov@nginx.com    )
2472491Szelenkov@nginx.com
2482491Szelenkov@nginx.com    time.sleep(2)
249756Szelenkov@nginx.com
2502491Szelenkov@nginx.com    (resp, sock) = client.http(
2512491Szelenkov@nginx.com        b"""345""", start=True, sock=sock, read_timeout=1, raw=True
2522491Szelenkov@nginx.com    )
2532491Szelenkov@nginx.com
2542491Szelenkov@nginx.com    time.sleep(2)
2552491Szelenkov@nginx.com
2562491Szelenkov@nginx.com    resp = client.http(b"""6789""", sock=sock, raw=True)
2572491Szelenkov@nginx.com
2582491Szelenkov@nginx.com    assert resp['status'] == 200, 'status body read timeout update'
259730Szelenkov@nginx.com
2602491Szelenkov@nginx.com
2612491Szelenkov@nginx.comdef test_settings_send_timeout(temp_dir):
2622491Szelenkov@nginx.com    client.load('body_generate')
2631878Szelenkov@nginx.com
2642491Szelenkov@nginx.com    def req(addr, data_len):
2652491Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
2662491Szelenkov@nginx.com        sock.connect(addr)
2672491Szelenkov@nginx.com
2682491Szelenkov@nginx.com        req = f"""GET / HTTP/1.1
2691878Szelenkov@nginx.comHost: localhost
2702330Szelenkov@nginx.comX-Length: {data_len}
2711878Szelenkov@nginx.comConnection: close
2721878Szelenkov@nginx.com
2731878Szelenkov@nginx.com"""
2741878Szelenkov@nginx.com
2752491Szelenkov@nginx.com        sock.sendall(req.encode())
2761878Szelenkov@nginx.com
2772491Szelenkov@nginx.com        data = sock.recv(16).decode()
2781878Szelenkov@nginx.com
2792491Szelenkov@nginx.com        time.sleep(3)
2801878Szelenkov@nginx.com
2812491Szelenkov@nginx.com        data += client.recvall(sock).decode()
2821877Szelenkov@nginx.com
2832491Szelenkov@nginx.com        sock.close()
284730Szelenkov@nginx.com
2852491Szelenkov@nginx.com        return data
286730Szelenkov@nginx.com
2872491Szelenkov@nginx.com    sysctl_out = sysctl()
2882491Szelenkov@nginx.com    values = re.findall(r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out)
2892491Szelenkov@nginx.com    values = [int(v) for v in values]
290730Szelenkov@nginx.com
2912491Szelenkov@nginx.com    data_len = 1048576 if len(values) == 0 else 10 * max(values)
292730Szelenkov@nginx.com
2932491Szelenkov@nginx.com    addr = f'{temp_dir}/sock'
294730Szelenkov@nginx.com
2952491Szelenkov@nginx.com    assert 'success' in client.conf(
2962491Szelenkov@nginx.com        {f'unix:{addr}': {'application': 'body_generate'}}, 'listeners'
2972491Szelenkov@nginx.com    )
2981878Szelenkov@nginx.com
2992491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'send_timeout': 1}}, 'settings')
3001878Szelenkov@nginx.com
3012491Szelenkov@nginx.com    data = req(addr, data_len)
3022491Szelenkov@nginx.com    assert re.search(r'200 OK', data), 'send timeout status'
3032491Szelenkov@nginx.com    assert len(data) < data_len, 'send timeout data '
304730Szelenkov@nginx.com
3052491Szelenkov@nginx.com    client.conf({'http': {'send_timeout': 7}}, 'settings')
3061878Szelenkov@nginx.com
3072491Szelenkov@nginx.com    data = req(addr, data_len)
3082491Szelenkov@nginx.com    assert re.search(r'200 OK', data), 'send timeout status  2'
3092491Szelenkov@nginx.com    assert len(data) > data_len, 'send timeout data 2'
3101606Szelenkov@nginx.com
3111606Szelenkov@nginx.com
3122491Szelenkov@nginx.comdef test_settings_idle_timeout():
3132491Szelenkov@nginx.com    client.load('empty')
314730Szelenkov@nginx.com
3152491Szelenkov@nginx.com    def req():
3162491Szelenkov@nginx.com        (_, sock) = client.get(
3172491Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'keep-alive'},
3182491Szelenkov@nginx.com            start=True,
3192491Szelenkov@nginx.com            read_timeout=1,
3201878Szelenkov@nginx.com        )
3211365Szelenkov@nginx.com
3222491Szelenkov@nginx.com        time.sleep(3)
3232491Szelenkov@nginx.com
3242491Szelenkov@nginx.com        return client.get(sock=sock)
3252491Szelenkov@nginx.com
3262491Szelenkov@nginx.com    assert client.get()['status'] == 200, 'init'
3271365Szelenkov@nginx.com
3282491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'idle_timeout': 2}}, 'settings')
3292491Szelenkov@nginx.com    assert req()['status'] == 408, 'status idle timeout'
3302491Szelenkov@nginx.com
3312491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'idle_timeout': 7}}, 'settings')
3322491Szelenkov@nginx.com    assert req()['status'] == 200, 'status idle timeout 2'
3332491Szelenkov@nginx.com
3342491Szelenkov@nginx.com
3352491Szelenkov@nginx.comdef test_settings_idle_timeout_2():
3362491Szelenkov@nginx.com    client.load('empty')
3371365Szelenkov@nginx.com
3382491Szelenkov@nginx.com    def req():
3392491Szelenkov@nginx.com        sock = client.http(b'', raw=True, no_recv=True)
3402491Szelenkov@nginx.com
3412491Szelenkov@nginx.com        time.sleep(3)
3422491Szelenkov@nginx.com
3432491Szelenkov@nginx.com        return client.get(sock=sock)
3442491Szelenkov@nginx.com
3452491Szelenkov@nginx.com    assert client.get()['status'] == 200, 'init'
3461365Szelenkov@nginx.com
3472491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'idle_timeout': 1}}, 'settings')
3482491Szelenkov@nginx.com    assert req()['status'] == 408, 'status idle timeout'
3492491Szelenkov@nginx.com
3502491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'idle_timeout': 7}}, 'settings')
3512491Szelenkov@nginx.com    assert req()['status'] == 200, 'status idle timeout 2'
3522491Szelenkov@nginx.com
3532491Szelenkov@nginx.com
3542491Szelenkov@nginx.comdef test_settings_max_body_size():
3552491Szelenkov@nginx.com    client.load('empty')
3562491Szelenkov@nginx.com
3572491Szelenkov@nginx.com    assert 'success' in client.conf({'http': {'max_body_size': 5}}, 'settings')
3581365Szelenkov@nginx.com
3592491Szelenkov@nginx.com    assert client.post(body='01234')['status'] == 200, 'status size'
3602491Szelenkov@nginx.com    assert client.post(body='012345')['status'] == 413, 'status size max'
3612491Szelenkov@nginx.com
3622491Szelenkov@nginx.com
3632491Szelenkov@nginx.comdef test_settings_max_body_size_large():
3642491Szelenkov@nginx.com    client.load('mirror')
3651702Szelenkov@nginx.com
3662491Szelenkov@nginx.com    assert 'success' in client.conf(
3672491Szelenkov@nginx.com        {'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings'
3682491Szelenkov@nginx.com    )
3692491Szelenkov@nginx.com
3702491Szelenkov@nginx.com    body = '0123456789abcdef' * 4 * 64 * 1024
3712491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
3722491Szelenkov@nginx.com    assert resp['status'] == 200, 'status size 4'
3732491Szelenkov@nginx.com    assert resp['body'] == body, 'status body 4'
3742491Szelenkov@nginx.com
3752491Szelenkov@nginx.com    body = '0123456789abcdef' * 8 * 64 * 1024
3762491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
3772491Szelenkov@nginx.com    assert resp['status'] == 200, 'status size 8'
3782491Szelenkov@nginx.com    assert resp['body'] == body, 'status body 8'
3791702Szelenkov@nginx.com
3802491Szelenkov@nginx.com    body = '0123456789abcdef' * 16 * 64 * 1024
3812491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
3822491Szelenkov@nginx.com    assert resp['status'] == 200, 'status size 16'
3832491Szelenkov@nginx.com    assert resp['body'] == body, 'status body 16'
3842491Szelenkov@nginx.com
3852491Szelenkov@nginx.com    body = '0123456789abcdef' * 32 * 64 * 1024
3862491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
3872491Szelenkov@nginx.com    assert resp['status'] == 200, 'status size 32'
3882491Szelenkov@nginx.com    assert resp['body'] == body, 'status body 32'
3891702Szelenkov@nginx.com
3902491Szelenkov@nginx.com
3912491Szelenkov@nginx.com@pytest.mark.skip('not yet')
3922491Szelenkov@nginx.comdef test_settings_negative_value():
3932491Szelenkov@nginx.com    assert 'error' in client.conf(
3942491Szelenkov@nginx.com        {'http': {'max_body_size': -1}}, 'settings'
3952491Szelenkov@nginx.com    ), 'settings negative value'
3962491Szelenkov@nginx.com
3972491Szelenkov@nginx.com
3982491Szelenkov@nginx.comdef test_settings_body_buffer_size():
3992491Szelenkov@nginx.com    client.load('mirror')
4001702Szelenkov@nginx.com
4012491Szelenkov@nginx.com    assert 'success' in client.conf(
4022491Szelenkov@nginx.com        {
4032491Szelenkov@nginx.com            'http': {
4042491Szelenkov@nginx.com                'max_body_size': 64 * 1024 * 1024,
4052491Szelenkov@nginx.com                'body_buffer_size': 32 * 1024 * 1024,
4062491Szelenkov@nginx.com            }
4072491Szelenkov@nginx.com        },
4082491Szelenkov@nginx.com        'settings',
4092491Szelenkov@nginx.com    )
4102491Szelenkov@nginx.com
4112491Szelenkov@nginx.com    body = '0123456789abcdef'
4122491Szelenkov@nginx.com    resp = client.post(body=body)
4132491Szelenkov@nginx.com    assert bool(resp), 'response from application'
4142491Szelenkov@nginx.com    assert resp['status'] == 200, 'status'
4152491Szelenkov@nginx.com    assert resp['body'] == body, 'body'
4162491Szelenkov@nginx.com
4172491Szelenkov@nginx.com    body = '0123456789abcdef' * 1024 * 1024
4182491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
4192491Szelenkov@nginx.com    assert bool(resp), 'response from application 2'
4202491Szelenkov@nginx.com    assert resp['status'] == 200, 'status 2'
4212491Szelenkov@nginx.com    assert resp['body'] == body, 'body 2'
4221702Szelenkov@nginx.com
4232491Szelenkov@nginx.com    body = '0123456789abcdef' * 2 * 1024 * 1024
4242491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
4252491Szelenkov@nginx.com    assert bool(resp), 'response from application 3'
4262491Szelenkov@nginx.com    assert resp['status'] == 200, 'status 3'
4272491Szelenkov@nginx.com    assert resp['body'] == body, 'body 3'
4281702Szelenkov@nginx.com
4292491Szelenkov@nginx.com    body = '0123456789abcdef' * 3 * 1024 * 1024
4302491Szelenkov@nginx.com    resp = client.post(body=body, read_buffer_size=1024 * 1024)
4312491Szelenkov@nginx.com    assert bool(resp), 'response from application 4'
4322491Szelenkov@nginx.com    assert resp['status'] == 200, 'status 4'
4332491Szelenkov@nginx.com    assert resp['body'] == body, 'body 4'
4342491Szelenkov@nginx.com
4352382Szelenkov@nginx.com
4362491Szelenkov@nginx.comdef test_settings_log_route(findall, search_in_file, wait_for_record):
4372491Szelenkov@nginx.com    def count_fallbacks():
4382491Szelenkov@nginx.com        return len(findall(r'"fallback" taken'))
4392491Szelenkov@nginx.com
4402491Szelenkov@nginx.com    def check_record(template):
4412491Szelenkov@nginx.com        assert search_in_file(template) is not None
4422491Szelenkov@nginx.com
4432491Szelenkov@nginx.com    def check_no_record(template):
4442491Szelenkov@nginx.com        assert search_in_file(template) is None
4452382Szelenkov@nginx.com
4462491Szelenkov@nginx.com    def template_req_line(url):
4472491Szelenkov@nginx.com        return rf'\[notice\].*http request line "GET {url} HTTP/1\.1"'
4482382Szelenkov@nginx.com
4492491Szelenkov@nginx.com    def template_selected(route):
4502491Szelenkov@nginx.com        return rf'\[notice\].*"{route}" selected'
4512382Szelenkov@nginx.com
4522491Szelenkov@nginx.com    def template_discarded(route):
4532491Szelenkov@nginx.com        return rf'\[info\].*"{route}" discarded'
4542382Szelenkov@nginx.com
4552491Szelenkov@nginx.com    def wait_for_request_log(status, uri, route):
4562491Szelenkov@nginx.com        assert client.get(url=uri)['status'] == status
4572491Szelenkov@nginx.com        assert wait_for_record(template_req_line(uri)) is not None
4582491Szelenkov@nginx.com        assert wait_for_record(template_selected(route)) is not None
4592491Szelenkov@nginx.com
4602491Szelenkov@nginx.com    # routes array
4612382Szelenkov@nginx.com
4622491Szelenkov@nginx.com    assert 'success' in client.conf(
4632491Szelenkov@nginx.com        {
4642592Szelenkov@nginx.com            "listeners": {"*:8080": {"pass": "routes"}},
4652491Szelenkov@nginx.com            "routes": [
4662491Szelenkov@nginx.com                {
4672491Szelenkov@nginx.com                    "match": {
4682491Szelenkov@nginx.com                        "uri": "/zero",
4692491Szelenkov@nginx.com                    },
4702491Szelenkov@nginx.com                    "action": {"return": 200},
4712491Szelenkov@nginx.com                },
4722491Szelenkov@nginx.com                {
4732491Szelenkov@nginx.com                    "action": {"return": 201},
4742491Szelenkov@nginx.com                },
4752491Szelenkov@nginx.com            ],
4762491Szelenkov@nginx.com            "applications": {},
4772491Szelenkov@nginx.com            "settings": {"http": {"log_route": True}},
4782491Szelenkov@nginx.com        }
4792491Szelenkov@nginx.com    )
4802382Szelenkov@nginx.com
4812491Szelenkov@nginx.com    wait_for_request_log(200, '/zero', 'routes/0')
4822491Szelenkov@nginx.com    check_no_record(r'discarded')
4832491Szelenkov@nginx.com
4842491Szelenkov@nginx.com    wait_for_request_log(201, '/one', 'routes/1')
4852491Szelenkov@nginx.com    check_record(template_discarded('routes/0'))
4862382Szelenkov@nginx.com
4872491Szelenkov@nginx.com    # routes object
4882382Szelenkov@nginx.com
4892491Szelenkov@nginx.com    assert 'success' in client.conf(
4902491Szelenkov@nginx.com        {
4912592Szelenkov@nginx.com            "listeners": {"*:8080": {"pass": "routes/main"}},
4922491Szelenkov@nginx.com            "routes": {
4932491Szelenkov@nginx.com                "main": [
4942382Szelenkov@nginx.com                    {
4952382Szelenkov@nginx.com                        "match": {
4962491Szelenkov@nginx.com                            "uri": "/named_route",
4972382Szelenkov@nginx.com                        },
4982382Szelenkov@nginx.com                        "action": {"return": 200},
4992382Szelenkov@nginx.com                    },
5002382Szelenkov@nginx.com                    {
5012382Szelenkov@nginx.com                        "action": {"return": 201},
5022382Szelenkov@nginx.com                    },
5032491Szelenkov@nginx.com                ]
5042491Szelenkov@nginx.com            },
5052491Szelenkov@nginx.com            "applications": {},
5062491Szelenkov@nginx.com            "settings": {"http": {"log_route": True}},
5072491Szelenkov@nginx.com        }
5082491Szelenkov@nginx.com    )
5092382Szelenkov@nginx.com
5102491Szelenkov@nginx.com    wait_for_request_log(200, '/named_route', 'routes/main/0')
5112491Szelenkov@nginx.com    check_no_record(template_discarded('routes/main'))
5122382Szelenkov@nginx.com
5132491Szelenkov@nginx.com    wait_for_request_log(201, '/unnamed_route', 'routes/main/1')
5142491Szelenkov@nginx.com    check_record(template_discarded('routes/main/0'))
5152382Szelenkov@nginx.com
5162491Szelenkov@nginx.com    # routes sequence
5172382Szelenkov@nginx.com
5182491Szelenkov@nginx.com    assert 'success' in client.conf(
5192491Szelenkov@nginx.com        {
5202592Szelenkov@nginx.com            "listeners": {"*:8080": {"pass": "routes/first"}},
5212491Szelenkov@nginx.com            "routes": {
5222491Szelenkov@nginx.com                "first": [
5232491Szelenkov@nginx.com                    {
5242491Szelenkov@nginx.com                        "action": {"pass": "routes/second"},
5252491Szelenkov@nginx.com                    },
5262491Szelenkov@nginx.com                ],
5272491Szelenkov@nginx.com                "second": [
5282491Szelenkov@nginx.com                    {
5292491Szelenkov@nginx.com                        "action": {"return": 200},
5302491Szelenkov@nginx.com                    },
5312491Szelenkov@nginx.com                ],
5322491Szelenkov@nginx.com            },
5332491Szelenkov@nginx.com            "applications": {},
5342491Szelenkov@nginx.com            "settings": {"http": {"log_route": True}},
5352491Szelenkov@nginx.com        }
5362491Szelenkov@nginx.com    )
5372382Szelenkov@nginx.com
5382491Szelenkov@nginx.com    wait_for_request_log(200, '/sequence', 'routes/second/0')
5392491Szelenkov@nginx.com    check_record(template_selected('routes/first/0'))
5402382Szelenkov@nginx.com
5412491Szelenkov@nginx.com    # fallback
5422382Szelenkov@nginx.com
5432491Szelenkov@nginx.com    assert 'success' in client.conf(
5442491Szelenkov@nginx.com        {
5452592Szelenkov@nginx.com            "listeners": {"*:8080": {"pass": "routes/fall"}},
5462491Szelenkov@nginx.com            "routes": {
5472491Szelenkov@nginx.com                "fall": [
5482491Szelenkov@nginx.com                    {
5492491Szelenkov@nginx.com                        "action": {
5502491Szelenkov@nginx.com                            "share": "/blah",
5512491Szelenkov@nginx.com                            "fallback": {"pass": "routes/fall2"},
5522382Szelenkov@nginx.com                        },
5532491Szelenkov@nginx.com                    },
5542491Szelenkov@nginx.com                ],
5552491Szelenkov@nginx.com                "fall2": [
5562491Szelenkov@nginx.com                    {
5572491Szelenkov@nginx.com                        "action": {"return": 200},
5582491Szelenkov@nginx.com                    },
5592491Szelenkov@nginx.com                ],
5602491Szelenkov@nginx.com            },
5612491Szelenkov@nginx.com            "applications": {},
5622491Szelenkov@nginx.com            "settings": {"http": {"log_route": True}},
5632491Szelenkov@nginx.com        }
5642491Szelenkov@nginx.com    )
5652382Szelenkov@nginx.com
5662491Szelenkov@nginx.com    wait_for_request_log(200, '/', 'routes/fall2/0')
5672491Szelenkov@nginx.com    assert count_fallbacks() == 1
5682491Szelenkov@nginx.com    check_record(template_selected('routes/fall/0'))
5692382Szelenkov@nginx.com
5702491Szelenkov@nginx.com    assert client.head()['status'] == 200
5712491Szelenkov@nginx.com    assert count_fallbacks() == 2
5722491Szelenkov@nginx.com
5732491Szelenkov@nginx.com    # disable log
5742491Szelenkov@nginx.com
5752491Szelenkov@nginx.com    assert 'success' in client.conf({"log_route": False}, 'settings/http')
5762491Szelenkov@nginx.com
5772491Szelenkov@nginx.com    url = '/disable_logging'
5782491Szelenkov@nginx.com    assert client.get(url=url)['status'] == 200
5792382Szelenkov@nginx.com
5802491Szelenkov@nginx.com    time.sleep(1)
5812382Szelenkov@nginx.com
5822491Szelenkov@nginx.com    check_no_record(template_req_line(url))
5832382Szelenkov@nginx.com
5842491Szelenkov@nginx.com    # total
5852382Szelenkov@nginx.com
5862491Szelenkov@nginx.com    assert len(findall(r'\[notice\].*http request line')) == 7
5872491Szelenkov@nginx.com    assert len(findall(r'\[notice\].*selected')) == 10
5882491Szelenkov@nginx.com    assert len(findall(r'\[info\].*discarded')) == 2
589