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