1647Szelenkov@nginx.comimport os 2647Szelenkov@nginx.comimport re 3657Szelenkov@nginx.comimport time 4647Szelenkov@nginx.comfrom subprocess import call 51019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython 6634Szelenkov@nginx.com 71017Szelenkov@nginx.com 81019Szelenkov@nginx.comclass TestAccessLog(TestApplicationPython): 91025Szelenkov@nginx.com prerequisites = ['python'] 10634Szelenkov@nginx.com 11634Szelenkov@nginx.com def load(self, script): 12634Szelenkov@nginx.com super().load(script) 13634Szelenkov@nginx.com 14760Szelenkov@nginx.com self.conf('"' + self.testdir + '/access.log"', 'access_log') 15634Szelenkov@nginx.com 16*1028Szelenkov@nginx.com def wait_for_record(self, pattern, name='access.log'): 17*1028Szelenkov@nginx.com return super().wait_for_record(pattern, name) 18634Szelenkov@nginx.com 19634Szelenkov@nginx.com def test_access_log_keepalive(self): 20634Szelenkov@nginx.com self.load('mirror') 21634Szelenkov@nginx.com 221017Szelenkov@nginx.com (resp, sock) = self.post( 231017Szelenkov@nginx.com headers={ 241017Szelenkov@nginx.com 'Host': 'localhost', 251017Szelenkov@nginx.com 'Connection': 'keep-alive', 261017Szelenkov@nginx.com 'Content-Type': 'text/html', 271017Szelenkov@nginx.com }, 281017Szelenkov@nginx.com start=True, 291017Szelenkov@nginx.com body='01234', 301017Szelenkov@nginx.com ) 31634Szelenkov@nginx.com 32634Szelenkov@nginx.com self.assertIsNotNone( 33*1028Szelenkov@nginx.com self.wait_for_record(r'"POST / HTTP/1.1" 200 5'), 'keepalive 1' 341017Szelenkov@nginx.com ) 35634Szelenkov@nginx.com 361017Szelenkov@nginx.com resp = self.post( 371017Szelenkov@nginx.com headers={ 381017Szelenkov@nginx.com 'Host': 'localhost', 391017Szelenkov@nginx.com 'Connection': 'close', 401017Szelenkov@nginx.com 'Content-Type': 'text/html', 411017Szelenkov@nginx.com }, 421017Szelenkov@nginx.com sock=sock, 431017Szelenkov@nginx.com body='0123456789', 441017Szelenkov@nginx.com ) 45634Szelenkov@nginx.com 46634Szelenkov@nginx.com self.stop() 47634Szelenkov@nginx.com 48634Szelenkov@nginx.com self.assertIsNotNone( 49*1028Szelenkov@nginx.com self.wait_for_record(r'"POST / HTTP/1.1" 200 10'), 'keepalive 2' 501017Szelenkov@nginx.com ) 51634Szelenkov@nginx.com 52634Szelenkov@nginx.com def test_access_log_pipeline(self): 53634Szelenkov@nginx.com self.load('empty') 54634Szelenkov@nginx.com 551017Szelenkov@nginx.com self.http( 561017Szelenkov@nginx.com b"""GET / HTTP/1.1 57634Szelenkov@nginx.comHost: localhost 58634Szelenkov@nginx.comReferer: Referer-1 59634Szelenkov@nginx.com 60634Szelenkov@nginx.comGET / HTTP/1.1 61634Szelenkov@nginx.comHost: localhost 62634Szelenkov@nginx.comReferer: Referer-2 63634Szelenkov@nginx.com 64634Szelenkov@nginx.comGET / HTTP/1.1 65634Szelenkov@nginx.comHost: localhost 66634Szelenkov@nginx.comReferer: Referer-3 67634Szelenkov@nginx.comConnection: close 68634Szelenkov@nginx.com 691017Szelenkov@nginx.com""", 701017Szelenkov@nginx.com raw_resp=True, 711017Szelenkov@nginx.com raw=True, 721017Szelenkov@nginx.com ) 73634Szelenkov@nginx.com 74634Szelenkov@nginx.com self.stop() 75634Szelenkov@nginx.com 76634Szelenkov@nginx.com self.assertIsNotNone( 77*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-1" "-"'), 781017Szelenkov@nginx.com 'pipeline 1', 791017Szelenkov@nginx.com ) 80634Szelenkov@nginx.com self.assertIsNotNone( 81*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-2" "-"'), 821017Szelenkov@nginx.com 'pipeline 2', 831017Szelenkov@nginx.com ) 84634Szelenkov@nginx.com self.assertIsNotNone( 85*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "Referer-3" "-"'), 861017Szelenkov@nginx.com 'pipeline 3', 871017Szelenkov@nginx.com ) 88634Szelenkov@nginx.com 89634Szelenkov@nginx.com def test_access_log_ipv6(self): 90634Szelenkov@nginx.com self.load('empty') 91634Szelenkov@nginx.com 921017Szelenkov@nginx.com self.conf({"[::1]:7080": {"application": "empty"}}, 'listeners') 93634Szelenkov@nginx.com 94634Szelenkov@nginx.com self.get(sock_type='ipv6') 95634Szelenkov@nginx.com 96634Szelenkov@nginx.com self.stop() 97634Szelenkov@nginx.com 98634Szelenkov@nginx.com self.assertIsNotNone( 99*1028Szelenkov@nginx.com self.wait_for_record( 1001017Szelenkov@nginx.com r'::1 - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"' 1011017Szelenkov@nginx.com ), 1021017Szelenkov@nginx.com 'ipv6', 1031017Szelenkov@nginx.com ) 104634Szelenkov@nginx.com 105658Szelenkov@nginx.com def test_access_log_unix(self): 106658Szelenkov@nginx.com self.load('empty') 107658Szelenkov@nginx.com 108658Szelenkov@nginx.com addr = self.testdir + '/sock' 109658Szelenkov@nginx.com 1101017Szelenkov@nginx.com self.conf({"unix:" + addr: {"application": "empty"}}, 'listeners') 111658Szelenkov@nginx.com 112658Szelenkov@nginx.com self.get(sock_type='unix', addr=addr) 113658Szelenkov@nginx.com 114658Szelenkov@nginx.com self.stop() 115658Szelenkov@nginx.com 1161017Szelenkov@nginx.com self.assertIsNotNone( 117*1028Szelenkov@nginx.com self.wait_for_record( 1181017Szelenkov@nginx.com r'unix: - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"' 1191017Szelenkov@nginx.com ), 1201017Szelenkov@nginx.com 'unix', 1211017Szelenkov@nginx.com ) 122658Szelenkov@nginx.com 123634Szelenkov@nginx.com def test_access_log_referer(self): 124634Szelenkov@nginx.com self.load('empty') 125634Szelenkov@nginx.com 1261017Szelenkov@nginx.com self.get( 1271017Szelenkov@nginx.com headers={ 1281017Szelenkov@nginx.com 'Host': 'localhost', 1291017Szelenkov@nginx.com 'Referer': 'referer-value', 1301017Szelenkov@nginx.com 'Connection': 'close', 1311017Szelenkov@nginx.com } 1321017Szelenkov@nginx.com ) 133634Szelenkov@nginx.com 134634Szelenkov@nginx.com self.stop() 135634Szelenkov@nginx.com 136634Szelenkov@nginx.com self.assertIsNotNone( 137*1028Szelenkov@nginx.com self.wait_for_record( 138*1028Szelenkov@nginx.com r'"GET / HTTP/1.1" 200 0 "referer-value" "-"' 139*1028Szelenkov@nginx.com ), 1401017Szelenkov@nginx.com 'referer', 1411017Szelenkov@nginx.com ) 142634Szelenkov@nginx.com 143634Szelenkov@nginx.com def test_access_log_user_agent(self): 144634Szelenkov@nginx.com self.load('empty') 145634Szelenkov@nginx.com 1461017Szelenkov@nginx.com self.get( 1471017Szelenkov@nginx.com headers={ 1481017Szelenkov@nginx.com 'Host': 'localhost', 1491017Szelenkov@nginx.com 'User-Agent': 'user-agent-value', 1501017Szelenkov@nginx.com 'Connection': 'close', 1511017Szelenkov@nginx.com } 1521017Szelenkov@nginx.com ) 153634Szelenkov@nginx.com 154634Szelenkov@nginx.com self.stop() 155634Szelenkov@nginx.com 156634Szelenkov@nginx.com self.assertIsNotNone( 157*1028Szelenkov@nginx.com self.wait_for_record( 1581017Szelenkov@nginx.com r'"GET / HTTP/1.1" 200 0 "-" "user-agent-value"' 1591017Szelenkov@nginx.com ), 1601017Szelenkov@nginx.com 'user agent', 1611017Szelenkov@nginx.com ) 162634Szelenkov@nginx.com 163634Szelenkov@nginx.com def test_access_log_http10(self): 164634Szelenkov@nginx.com self.load('empty') 165634Szelenkov@nginx.com 166634Szelenkov@nginx.com self.get(http_10=True) 167634Szelenkov@nginx.com 168634Szelenkov@nginx.com self.stop() 169634Szelenkov@nginx.com 170634Szelenkov@nginx.com self.assertIsNotNone( 171*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.0" 200 0 "-" "-"'), 'http 1.0' 1721017Szelenkov@nginx.com ) 173634Szelenkov@nginx.com 174634Szelenkov@nginx.com def test_access_log_partial(self): 175634Szelenkov@nginx.com self.load('empty') 176634Szelenkov@nginx.com 177665Szelenkov@nginx.com self.http(b"""GE""", raw=True) 178634Szelenkov@nginx.com 179634Szelenkov@nginx.com self.stop() 180634Szelenkov@nginx.com 181634Szelenkov@nginx.com self.assertIsNotNone( 182*1028Szelenkov@nginx.com self.wait_for_record(r'"GE" 400 0 "-" "-"'), 'partial' 1831017Szelenkov@nginx.com ) 184634Szelenkov@nginx.com 185634Szelenkov@nginx.com def test_access_log_partial_2(self): 186634Szelenkov@nginx.com self.load('empty') 187634Szelenkov@nginx.com 188665Szelenkov@nginx.com self.http(b"""GET /\n""", raw=True) 189634Szelenkov@nginx.com 190634Szelenkov@nginx.com self.stop() 191634Szelenkov@nginx.com 192634Szelenkov@nginx.com self.assertIsNotNone( 193*1028Szelenkov@nginx.com self.wait_for_record(r'"GET /" 400 \d+ "-" "-"'), 'partial 2' 1941017Szelenkov@nginx.com ) 195634Szelenkov@nginx.com 196634Szelenkov@nginx.com def test_access_log_partial_3(self): 197634Szelenkov@nginx.com self.load('empty') 198634Szelenkov@nginx.com 199665Szelenkov@nginx.com self.http(b"""GET / HTTP/1.1""", raw=True) 200634Szelenkov@nginx.com 201634Szelenkov@nginx.com self.stop() 202634Szelenkov@nginx.com 203634Szelenkov@nginx.com self.assertIsNotNone( 204*1028Szelenkov@nginx.com self.wait_for_record(r'"GET /" 400 0 "-" "-"'), 'partial 3' 2051017Szelenkov@nginx.com ) 206634Szelenkov@nginx.com 207634Szelenkov@nginx.com def test_access_log_partial_4(self): 208634Szelenkov@nginx.com self.load('empty') 209634Szelenkov@nginx.com 210665Szelenkov@nginx.com resp = self.http(b"""GET / HTTP/1.1\n""", raw=True) 211634Szelenkov@nginx.com 212634Szelenkov@nginx.com self.stop() 213634Szelenkov@nginx.com 214634Szelenkov@nginx.com self.assertIsNotNone( 215*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 400 0 "-" "-"'), 216*1028Szelenkov@nginx.com 'partial 4', 2171017Szelenkov@nginx.com ) 218634Szelenkov@nginx.com 219634Szelenkov@nginx.com def test_access_log_partial_5(self): 220634Szelenkov@nginx.com self.load('empty') 221634Szelenkov@nginx.com 222665Szelenkov@nginx.com self.http(b"""GET / HTTP/1.1\n\n""", raw=True) 223634Szelenkov@nginx.com 224634Szelenkov@nginx.com self.stop() 225634Szelenkov@nginx.com 226634Szelenkov@nginx.com self.assertIsNotNone( 227*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "-" "-"'), 228*1028Szelenkov@nginx.com 'partial 5', 2291017Szelenkov@nginx.com ) 230634Szelenkov@nginx.com 231634Szelenkov@nginx.com def test_access_log_get_parameters(self): 232634Szelenkov@nginx.com self.load('empty') 233634Szelenkov@nginx.com 234634Szelenkov@nginx.com self.get(url='/?blah&var=val') 235634Szelenkov@nginx.com 236634Szelenkov@nginx.com self.stop() 237634Szelenkov@nginx.com 238634Szelenkov@nginx.com self.assertIsNotNone( 239*1028Szelenkov@nginx.com self.wait_for_record( 2401017Szelenkov@nginx.com r'"GET /\?blah&var=val HTTP/1.1" 200 0 "-" "-"' 2411017Szelenkov@nginx.com ), 2421017Szelenkov@nginx.com 'get parameters', 2431017Szelenkov@nginx.com ) 244634Szelenkov@nginx.com 245634Szelenkov@nginx.com def test_access_log_delete(self): 246634Szelenkov@nginx.com self.load('empty') 247634Szelenkov@nginx.com 248760Szelenkov@nginx.com self.conf_delete('access_log') 249634Szelenkov@nginx.com 250634Szelenkov@nginx.com self.get(url='/delete') 251634Szelenkov@nginx.com 252634Szelenkov@nginx.com self.stop() 253634Szelenkov@nginx.com 254*1028Szelenkov@nginx.com self.assertIsNone( 255*1028Szelenkov@nginx.com self.search_in_log(r'/delete', 'access.log'), 'delete' 256*1028Szelenkov@nginx.com ) 257634Szelenkov@nginx.com 258634Szelenkov@nginx.com def test_access_log_change(self): 259634Szelenkov@nginx.com self.load('empty') 260634Szelenkov@nginx.com 261634Szelenkov@nginx.com self.get() 262634Szelenkov@nginx.com 263760Szelenkov@nginx.com self.conf('"' + self.testdir + '/new.log"', 'access_log') 264634Szelenkov@nginx.com 265634Szelenkov@nginx.com self.get() 266634Szelenkov@nginx.com 267634Szelenkov@nginx.com self.stop() 268634Szelenkov@nginx.com 269634Szelenkov@nginx.com self.assertIsNotNone( 270*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log'), 2711017Szelenkov@nginx.com 'change', 2721017Szelenkov@nginx.com ) 273634Szelenkov@nginx.com 274647Szelenkov@nginx.com def test_access_log_reopen(self): 275647Szelenkov@nginx.com self.load('empty') 276647Szelenkov@nginx.com 277647Szelenkov@nginx.com log_path = self.testdir + '/access.log' 278647Szelenkov@nginx.com 279647Szelenkov@nginx.com self.assertTrue(self.waitforfiles(log_path), 'open') 280647Szelenkov@nginx.com 281647Szelenkov@nginx.com log_path_new = self.testdir + '/new.log' 282647Szelenkov@nginx.com 283647Szelenkov@nginx.com os.rename(log_path, log_path_new) 284647Szelenkov@nginx.com 285647Szelenkov@nginx.com self.get() 286647Szelenkov@nginx.com 287647Szelenkov@nginx.com self.assertIsNotNone( 288*1028Szelenkov@nginx.com self.wait_for_record(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log'), 2891017Szelenkov@nginx.com 'rename new', 2901017Szelenkov@nginx.com ) 291647Szelenkov@nginx.com self.assertFalse(os.path.isfile(log_path), 'rename old') 292647Szelenkov@nginx.com 293647Szelenkov@nginx.com with open(self.testdir + '/unit.pid', 'r') as f: 294647Szelenkov@nginx.com pid = f.read().rstrip() 295647Szelenkov@nginx.com 296647Szelenkov@nginx.com call(['kill', '-s', 'USR1', pid]) 297647Szelenkov@nginx.com 298647Szelenkov@nginx.com self.assertTrue(self.waitforfiles(log_path), 'reopen') 299647Szelenkov@nginx.com 300647Szelenkov@nginx.com self.get(url='/usr1') 301647Szelenkov@nginx.com 302*1028Szelenkov@nginx.com self.assertIsNotNone( 303*1028Szelenkov@nginx.com self.wait_for_record(r'"GET /usr1 HTTP/1.1" 200 0 "-" "-"'), 304*1028Szelenkov@nginx.com 'reopen 2', 305*1028Szelenkov@nginx.com ) 306647Szelenkov@nginx.com self.assertIsNone( 3071017Szelenkov@nginx.com self.search_in_log(r'/usr1', 'new.log'), 'rename new 2' 3081017Szelenkov@nginx.com ) 3091017Szelenkov@nginx.com 310647Szelenkov@nginx.com 311634Szelenkov@nginx.comif __name__ == '__main__': 3121019Szelenkov@nginx.com TestAccessLog.main() 313