xref: /unit/test/test_access_log.py (revision 2627:36afea93a678)
11635Szelenkov@nginx.comimport time
21635Szelenkov@nginx.com
31596Szelenkov@nginx.comimport pytest
42616Szelenkov@nginx.com
52491Szelenkov@nginx.comfrom unit.applications.lang.python import ApplicationPython
61730Szelenkov@nginx.comfrom unit.option import option
7634Szelenkov@nginx.com
82488Szelenkov@nginx.comprerequisites = {'modules': {'python': 'any'}}
92488Szelenkov@nginx.com
102491Szelenkov@nginx.comclient = ApplicationPython()
111017Szelenkov@nginx.com
122491Szelenkov@nginx.com
132491Szelenkov@nginx.comdef load(script):
142491Szelenkov@nginx.com    client.load(script)
15634Szelenkov@nginx.com
162491Szelenkov@nginx.com    assert 'success' in client.conf(
172491Szelenkov@nginx.com        f'"{option.temp_dir}/access.log"', 'access_log'
182491Szelenkov@nginx.com    ), 'access_log configure'
192491Szelenkov@nginx.com
20634Szelenkov@nginx.com
212616Szelenkov@nginx.comdef set_format(log_format):
222491Szelenkov@nginx.com    assert 'success' in client.conf(
232491Szelenkov@nginx.com        {
242491Szelenkov@nginx.com            'path': f'{option.temp_dir}/access.log',
252616Szelenkov@nginx.com            'format': log_format,
262491Szelenkov@nginx.com        },
272491Szelenkov@nginx.com        'access_log',
282491Szelenkov@nginx.com    ), 'access_log format'
292168Szelenkov@nginx.com
30634Szelenkov@nginx.com
31*2627Szelenkov@nginx.comdef set_if(condition):
32*2627Szelenkov@nginx.com    assert 'success' in client.conf(f'"{condition}"', 'access_log/if')
33*2627Szelenkov@nginx.com
34*2627Szelenkov@nginx.com
352491Szelenkov@nginx.comdef test_access_log_keepalive(wait_for_record):
362491Szelenkov@nginx.com    load('mirror')
372491Szelenkov@nginx.com
382491Szelenkov@nginx.com    assert client.get()['status'] == 200, 'init'
391029Szelenkov@nginx.com
402491Szelenkov@nginx.com    (_, sock) = client.post(
412491Szelenkov@nginx.com        headers={
422491Szelenkov@nginx.com            'Host': 'localhost',
432491Szelenkov@nginx.com            'Connection': 'keep-alive',
442491Szelenkov@nginx.com        },
452491Szelenkov@nginx.com        start=True,
462491Szelenkov@nginx.com        body='01234',
472491Szelenkov@nginx.com        read_timeout=1,
482491Szelenkov@nginx.com    )
49634Szelenkov@nginx.com
502491Szelenkov@nginx.com    assert (
512491Szelenkov@nginx.com        wait_for_record(r'"POST / HTTP/1.1" 200 5', 'access.log') is not None
522491Szelenkov@nginx.com    ), 'keepalive 1'
53634Szelenkov@nginx.com
542491Szelenkov@nginx.com    _ = client.post(sock=sock, body='0123456789')
55634Szelenkov@nginx.com
562491Szelenkov@nginx.com    assert (
572491Szelenkov@nginx.com        wait_for_record(r'"POST / HTTP/1.1" 200 10', 'access.log') is not None
582491Szelenkov@nginx.com    ), 'keepalive 2'
592491Szelenkov@nginx.com
60634Szelenkov@nginx.com
612491Szelenkov@nginx.comdef test_access_log_pipeline(wait_for_record):
622491Szelenkov@nginx.com    load('empty')
63634Szelenkov@nginx.com
642491Szelenkov@nginx.com    client.http(
652491Szelenkov@nginx.com        b"""GET / HTTP/1.1
66634Szelenkov@nginx.comHost: localhost
67634Szelenkov@nginx.comReferer: Referer-1
68634Szelenkov@nginx.com
69634Szelenkov@nginx.comGET / HTTP/1.1
70634Szelenkov@nginx.comHost: localhost
71634Szelenkov@nginx.comReferer: Referer-2
72634Szelenkov@nginx.com
73634Szelenkov@nginx.comGET / HTTP/1.1
74634Szelenkov@nginx.comHost: localhost
75634Szelenkov@nginx.comReferer: Referer-3
76634Szelenkov@nginx.comConnection: close
77634Szelenkov@nginx.com
781017Szelenkov@nginx.com""",
792491Szelenkov@nginx.com        raw_resp=True,
802491Szelenkov@nginx.com        raw=True,
812491Szelenkov@nginx.com    )
82634Szelenkov@nginx.com
832491Szelenkov@nginx.com    assert (
842491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-1" "-"', 'access.log')
852491Szelenkov@nginx.com        is not None
862491Szelenkov@nginx.com    ), 'pipeline 1'
872491Szelenkov@nginx.com    assert (
882491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-2" "-"', 'access.log')
892491Szelenkov@nginx.com        is not None
902491Szelenkov@nginx.com    ), 'pipeline 2'
912491Szelenkov@nginx.com    assert (
922491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-3" "-"', 'access.log')
932491Szelenkov@nginx.com        is not None
942491Szelenkov@nginx.com    ), 'pipeline 3'
95634Szelenkov@nginx.com
962491Szelenkov@nginx.com
972491Szelenkov@nginx.comdef test_access_log_ipv6(wait_for_record):
982491Szelenkov@nginx.com    load('empty')
99634Szelenkov@nginx.com
1002491Szelenkov@nginx.com    assert 'success' in client.conf(
1012592Szelenkov@nginx.com        {"[::1]:8080": {"pass": "applications/empty"}}, 'listeners'
1022491Szelenkov@nginx.com    )
1032491Szelenkov@nginx.com
1042491Szelenkov@nginx.com    client.get(sock_type='ipv6')
105634Szelenkov@nginx.com
1062491Szelenkov@nginx.com    assert (
1072491Szelenkov@nginx.com        wait_for_record(
1082491Szelenkov@nginx.com            r'::1 - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"', 'access.log'
1092491Szelenkov@nginx.com        )
1102491Szelenkov@nginx.com        is not None
1112491Szelenkov@nginx.com    ), 'ipv6'
112634Szelenkov@nginx.com
113634Szelenkov@nginx.com
1142491Szelenkov@nginx.comdef test_access_log_unix(temp_dir, wait_for_record):
1152491Szelenkov@nginx.com    load('empty')
116658Szelenkov@nginx.com
1172491Szelenkov@nginx.com    addr = f'{temp_dir}/sock'
118658Szelenkov@nginx.com
1192491Szelenkov@nginx.com    assert 'success' in client.conf(
1202491Szelenkov@nginx.com        {f'unix:{addr}': {"pass": "applications/empty"}}, 'listeners'
1212491Szelenkov@nginx.com    )
122658Szelenkov@nginx.com
1232491Szelenkov@nginx.com    client.get(sock_type='unix', addr=addr)
124658Szelenkov@nginx.com
1252491Szelenkov@nginx.com    assert (
1262491Szelenkov@nginx.com        wait_for_record(
1272491Szelenkov@nginx.com            r'unix: - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"', 'access.log'
1282491Szelenkov@nginx.com        )
1292491Szelenkov@nginx.com        is not None
1302491Szelenkov@nginx.com    ), 'unix'
131658Szelenkov@nginx.com
1322491Szelenkov@nginx.com
1332491Szelenkov@nginx.comdef test_access_log_referer(wait_for_record):
1342491Szelenkov@nginx.com    load('empty')
135634Szelenkov@nginx.com
1362491Szelenkov@nginx.com    client.get(
1372491Szelenkov@nginx.com        headers={
1382491Szelenkov@nginx.com            'Host': 'localhost',
1392491Szelenkov@nginx.com            'Referer': 'referer-value',
1402491Szelenkov@nginx.com            'Connection': 'close',
1412491Szelenkov@nginx.com        }
1422491Szelenkov@nginx.com    )
143634Szelenkov@nginx.com
1442491Szelenkov@nginx.com    assert (
1452491Szelenkov@nginx.com        wait_for_record(
1462491Szelenkov@nginx.com            r'"GET / HTTP/1.1" 200 0 "referer-value" "-"', 'access.log'
1472491Szelenkov@nginx.com        )
1482491Szelenkov@nginx.com        is not None
1492491Szelenkov@nginx.com    ), 'referer'
1502491Szelenkov@nginx.com
151634Szelenkov@nginx.com
1522491Szelenkov@nginx.comdef test_access_log_user_agent(wait_for_record):
1532491Szelenkov@nginx.com    load('empty')
154634Szelenkov@nginx.com
1552491Szelenkov@nginx.com    client.get(
1562491Szelenkov@nginx.com        headers={
1572491Szelenkov@nginx.com            'Host': 'localhost',
1582491Szelenkov@nginx.com            'User-Agent': 'user-agent-value',
1592491Szelenkov@nginx.com            'Connection': 'close',
1602491Szelenkov@nginx.com        }
1612491Szelenkov@nginx.com    )
162634Szelenkov@nginx.com
1632491Szelenkov@nginx.com    assert (
1642491Szelenkov@nginx.com        wait_for_record(
1652491Szelenkov@nginx.com            r'"GET / HTTP/1.1" 200 0 "-" "user-agent-value"', 'access.log'
1662491Szelenkov@nginx.com        )
1672491Szelenkov@nginx.com        is not None
1682491Szelenkov@nginx.com    ), 'user agent'
1692491Szelenkov@nginx.com
170634Szelenkov@nginx.com
1712491Szelenkov@nginx.comdef test_access_log_http10(wait_for_record):
1722491Szelenkov@nginx.com    load('empty')
173634Szelenkov@nginx.com
1742491Szelenkov@nginx.com    client.get(http_10=True)
175634Szelenkov@nginx.com
1762491Szelenkov@nginx.com    assert (
1772491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.0" 200 0 "-" "-"', 'access.log')
1782491Szelenkov@nginx.com        is not None
1792491Szelenkov@nginx.com    ), 'http 1.0'
1802491Szelenkov@nginx.com
181634Szelenkov@nginx.com
1822491Szelenkov@nginx.comdef test_access_log_partial(wait_for_record):
1832491Szelenkov@nginx.com    load('empty')
184634Szelenkov@nginx.com
1852491Szelenkov@nginx.com    assert client.post()['status'] == 200, 'init'
1861035Szelenkov@nginx.com
1872491Szelenkov@nginx.com    _ = client.http(b"""GE""", raw=True, read_timeout=1)
1881111Szelenkov@nginx.com
1892491Szelenkov@nginx.com    time.sleep(1)
190634Szelenkov@nginx.com
1912491Szelenkov@nginx.com    assert (
1922491Szelenkov@nginx.com        wait_for_record(r'"-" 400 0 "-" "-"', 'access.log') is not None
1932491Szelenkov@nginx.com    ), 'partial'
1942491Szelenkov@nginx.com
195634Szelenkov@nginx.com
1962491Szelenkov@nginx.comdef test_access_log_partial_2(wait_for_record):
1972491Szelenkov@nginx.com    load('empty')
198634Szelenkov@nginx.com
1992491Szelenkov@nginx.com    assert client.post()['status'] == 200, 'init'
2002491Szelenkov@nginx.com
2012491Szelenkov@nginx.com    client.http(b"""GET /\n""", raw=True)
2021035Szelenkov@nginx.com
2032491Szelenkov@nginx.com    assert (
2042491Szelenkov@nginx.com        wait_for_record(r'"-" 400 \d+ "-" "-"', 'access.log') is not None
2052491Szelenkov@nginx.com    ), 'partial 2'
206634Szelenkov@nginx.com
207634Szelenkov@nginx.com
2082491Szelenkov@nginx.comdef test_access_log_partial_3(wait_for_record):
2092491Szelenkov@nginx.com    load('empty')
210634Szelenkov@nginx.com
2112491Szelenkov@nginx.com    assert client.post()['status'] == 200, 'init'
2121035Szelenkov@nginx.com
2132491Szelenkov@nginx.com    _ = client.http(b"""GET / HTTP/1.1""", raw=True, read_timeout=1)
2142491Szelenkov@nginx.com
2152491Szelenkov@nginx.com    time.sleep(1)
2161111Szelenkov@nginx.com
2172491Szelenkov@nginx.com    assert (
2182491Szelenkov@nginx.com        wait_for_record(r'"-" 400 0 "-" "-"', 'access.log') is not None
2192491Szelenkov@nginx.com    ), 'partial 3'
220634Szelenkov@nginx.com
221634Szelenkov@nginx.com
2222491Szelenkov@nginx.comdef test_access_log_partial_4(wait_for_record):
2232491Szelenkov@nginx.com    load('empty')
224634Szelenkov@nginx.com
2252491Szelenkov@nginx.com    assert client.post()['status'] == 200, 'init'
2261035Szelenkov@nginx.com
2272491Szelenkov@nginx.com    _ = client.http(b"""GET / HTTP/1.1\n""", raw=True, read_timeout=1)
2281111Szelenkov@nginx.com
2292491Szelenkov@nginx.com    time.sleep(1)
230634Szelenkov@nginx.com
2312491Szelenkov@nginx.com    assert (
2322491Szelenkov@nginx.com        wait_for_record(r'"-" 400 0 "-" "-"', 'access.log') is not None
2332491Szelenkov@nginx.com    ), 'partial 4'
2342491Szelenkov@nginx.com
235634Szelenkov@nginx.com
2362491Szelenkov@nginx.com@pytest.mark.skip('not yet')
2372491Szelenkov@nginx.comdef test_access_log_partial_5(wait_for_record):
2382491Szelenkov@nginx.com    load('empty')
239634Szelenkov@nginx.com
2402491Szelenkov@nginx.com    assert client.post()['status'] == 200, 'init'
2411029Szelenkov@nginx.com
2422491Szelenkov@nginx.com    client.get(headers={'Connection': 'close'})
243634Szelenkov@nginx.com
2442491Szelenkov@nginx.com    assert (
2452491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.1" 400 \d+ "-" "-"', 'access.log')
2462491Szelenkov@nginx.com        is not None
2472491Szelenkov@nginx.com    ), 'partial 5'
248634Szelenkov@nginx.com
249634Szelenkov@nginx.com
2502491Szelenkov@nginx.comdef test_access_log_get_parameters(wait_for_record):
2512491Szelenkov@nginx.com    load('empty')
2522491Szelenkov@nginx.com
2532491Szelenkov@nginx.com    client.get(url='/?blah&var=val')
254634Szelenkov@nginx.com
2552491Szelenkov@nginx.com    assert (
2562491Szelenkov@nginx.com        wait_for_record(
2572491Szelenkov@nginx.com            r'"GET /\?blah&var=val HTTP/1.1" 200 0 "-" "-"', 'access.log'
2582491Szelenkov@nginx.com        )
2592491Szelenkov@nginx.com        is not None
2602491Szelenkov@nginx.com    ), 'get parameters'
261634Szelenkov@nginx.com
2622491Szelenkov@nginx.com
2632491Szelenkov@nginx.comdef test_access_log_delete(search_in_file):
2642491Szelenkov@nginx.com    load('empty')
265634Szelenkov@nginx.com
2662491Szelenkov@nginx.com    assert 'success' in client.conf_delete('access_log')
267634Szelenkov@nginx.com
2682491Szelenkov@nginx.com    client.get(url='/delete')
269634Szelenkov@nginx.com
2702491Szelenkov@nginx.com    assert search_in_file(r'/delete', 'access.log') is None, 'delete'
2712491Szelenkov@nginx.com
272634Szelenkov@nginx.com
2732491Szelenkov@nginx.comdef test_access_log_change(temp_dir, wait_for_record):
2742491Szelenkov@nginx.com    load('empty')
275634Szelenkov@nginx.com
2762491Szelenkov@nginx.com    client.get()
277634Szelenkov@nginx.com
2782491Szelenkov@nginx.com    assert 'success' in client.conf(f'"{temp_dir}/new.log"', 'access_log')
279634Szelenkov@nginx.com
2802491Szelenkov@nginx.com    client.get()
281634Szelenkov@nginx.com
2822491Szelenkov@nginx.com    assert (
2832491Szelenkov@nginx.com        wait_for_record(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log')
2842491Szelenkov@nginx.com        is not None
2852491Szelenkov@nginx.com    ), 'change'
2862491Szelenkov@nginx.com
2872168Szelenkov@nginx.com
2882491Szelenkov@nginx.comdef test_access_log_format(wait_for_record):
2892491Szelenkov@nginx.com    load('empty')
2902168Szelenkov@nginx.com
2912616Szelenkov@nginx.com    def check_format(log_format, expect, url='/'):
2922616Szelenkov@nginx.com        set_format(log_format)
2932168Szelenkov@nginx.com
2942491Szelenkov@nginx.com        assert client.get(url=url)['status'] == 200
2952491Szelenkov@nginx.com        assert wait_for_record(expect, 'access.log') is not None, 'found'
2962168Szelenkov@nginx.com
2972616Szelenkov@nginx.com    log_format = 'BLAH\t0123456789'
2982616Szelenkov@nginx.com    check_format(log_format, log_format)
2992491Szelenkov@nginx.com    check_format('$uri $status $uri $status', '/ 200 / 200')
3002168Szelenkov@nginx.com
3012491Szelenkov@nginx.com
3022491Szelenkov@nginx.comdef test_access_log_variables(wait_for_record):
3032491Szelenkov@nginx.com    load('mirror')
3042168Szelenkov@nginx.com
3052491Szelenkov@nginx.com    # $body_bytes_sent
3062168Szelenkov@nginx.com
3072491Szelenkov@nginx.com    set_format('$uri $body_bytes_sent')
3082491Szelenkov@nginx.com    body = '0123456789' * 50
3092491Szelenkov@nginx.com    client.post(url='/bbs', body=body, read_timeout=1)
3102491Szelenkov@nginx.com    assert (
3112491Szelenkov@nginx.com        wait_for_record(fr'^\/bbs {len(body)}$', 'access.log') is not None
3122491Szelenkov@nginx.com    ), '$body_bytes_sent'
3132168Szelenkov@nginx.com
3142168Szelenkov@nginx.com
315*2627Szelenkov@nginx.comdef test_access_log_if(search_in_file, wait_for_record):
316*2627Szelenkov@nginx.com    load('empty')
317*2627Szelenkov@nginx.com    set_format('$uri')
318*2627Szelenkov@nginx.com
319*2627Szelenkov@nginx.com    def try_if(condition):
320*2627Szelenkov@nginx.com        set_if(condition)
321*2627Szelenkov@nginx.com        assert client.get(url=f'/{condition}')['status'] == 200
322*2627Szelenkov@nginx.com
323*2627Szelenkov@nginx.com    # const
324*2627Szelenkov@nginx.com
325*2627Szelenkov@nginx.com    try_if('')
326*2627Szelenkov@nginx.com    try_if('0')
327*2627Szelenkov@nginx.com    try_if('false')
328*2627Szelenkov@nginx.com    try_if('undefined')
329*2627Szelenkov@nginx.com    try_if('!')
330*2627Szelenkov@nginx.com    try_if('!null')
331*2627Szelenkov@nginx.com    try_if('1')
332*2627Szelenkov@nginx.com
333*2627Szelenkov@nginx.com    # variable
334*2627Szelenkov@nginx.com
335*2627Szelenkov@nginx.com    set_if('$arg_foo')
336*2627Szelenkov@nginx.com    assert client.get(url='/bar?bar')['status'] == 200
337*2627Szelenkov@nginx.com    assert client.get(url='/foo_empty?foo')['status'] == 200
338*2627Szelenkov@nginx.com    assert client.get(url='/foo?foo=1')['status'] == 200
339*2627Szelenkov@nginx.com
340*2627Szelenkov@nginx.com    # check results
341*2627Szelenkov@nginx.com
342*2627Szelenkov@nginx.com    assert wait_for_record(r'^/foo$', 'access.log') is not None
343*2627Szelenkov@nginx.com
344*2627Szelenkov@nginx.com    assert search_in_file(r'^/$', 'access.log') is None
345*2627Szelenkov@nginx.com    assert search_in_file(r'^/0$', 'access.log') is None
346*2627Szelenkov@nginx.com    assert search_in_file(r'^/false$', 'access.log') is None
347*2627Szelenkov@nginx.com    assert search_in_file(r'^/undefined$', 'access.log') is None
348*2627Szelenkov@nginx.com    assert search_in_file(r'^/!$', 'access.log') is not None
349*2627Szelenkov@nginx.com    assert search_in_file(r'^/!null$', 'access.log') is not None
350*2627Szelenkov@nginx.com    assert search_in_file(r'^/1$', 'access.log') is not None
351*2627Szelenkov@nginx.com
352*2627Szelenkov@nginx.com    assert search_in_file(r'^/bar$', 'access.log') is None
353*2627Szelenkov@nginx.com    assert search_in_file(r'^/foo_empty$', 'access.log') is None
354*2627Szelenkov@nginx.com
355*2627Szelenkov@nginx.com
356*2627Szelenkov@nginx.comdef test_access_log_if_njs(require, search_in_file, wait_for_record):
357*2627Szelenkov@nginx.com    require({'modules': {'njs': 'any'}})
358*2627Szelenkov@nginx.com
359*2627Szelenkov@nginx.com    load('empty')
360*2627Szelenkov@nginx.com    set_format('$uri')
361*2627Szelenkov@nginx.com
362*2627Szelenkov@nginx.com    set_if('`${args.foo == \'1\'}`')
363*2627Szelenkov@nginx.com
364*2627Szelenkov@nginx.com    assert client.get(url='/foo_2?foo=2')['status'] == 200
365*2627Szelenkov@nginx.com    assert client.get(url='/foo_1?foo=1')['status'] == 200
366*2627Szelenkov@nginx.com
367*2627Szelenkov@nginx.com    assert wait_for_record(r'^/foo_1$', 'access.log') is not None
368*2627Szelenkov@nginx.com    assert search_in_file(r'^/foo_2$', 'access.log') is None
369*2627Szelenkov@nginx.com
370*2627Szelenkov@nginx.com
3712491Szelenkov@nginx.comdef test_access_log_incorrect(temp_dir, skip_alert):
3722491Szelenkov@nginx.com    skip_alert(r'failed to apply new conf')
3732168Szelenkov@nginx.com
3742491Szelenkov@nginx.com    assert 'error' in client.conf(
3752491Szelenkov@nginx.com        f'{temp_dir}/blah/access.log',
3762491Szelenkov@nginx.com        'access_log/path',
3772491Szelenkov@nginx.com    ), 'access_log path incorrect'
3782491Szelenkov@nginx.com
3792491Szelenkov@nginx.com    assert 'error' in client.conf(
3802491Szelenkov@nginx.com        {
3812491Szelenkov@nginx.com            'path': f'{temp_dir}/access.log',
3822491Szelenkov@nginx.com            'format': '$remote_add',
3832491Szelenkov@nginx.com        },
3842491Szelenkov@nginx.com        'access_log',
3852491Szelenkov@nginx.com    ), 'access_log format incorrect'
386*2627Szelenkov@nginx.com
387*2627Szelenkov@nginx.com    assert 'error' in client.conf('$arg_', 'access_log/if')
388