xref: /unit/test/test_access_log.py (revision 1028)
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