import unittest import unit import re class TestUnitAccessLog(unit.TestUnitApplicationPython): def setUpClass(): unit.TestUnit().check_modules('python') def load(self, script): super().load(script) self.conf('"' + self.testdir + '/access.log"', '/access_log') def search_in_log(self, pattern, name='access.log'): with open(self.testdir + '/' + name, 'r') as f: return re.search(pattern, f.read()) def test_access_log_keepalive(self): self.load('mirror') (resp, sock) = self.post(headers={ 'Connection': 'keep-alive', 'Content-Type': 'text/html', 'Host': 'localhost' }, start=True, body='01234') self.assertIsNotNone( self.search_in_log(r'"POST / HTTP/1.1" 200 5'), 'keepalive 1') resp = self.post(headers={ 'Connection': 'close', 'Content-Type': 'text/html', 'Host': 'localhost' }, sock=sock, body='0123456789') self.stop() self.assertIsNotNone( self.search_in_log(r'"POST / HTTP/1.1" 200 10'), 'keepalive 2') def test_access_log_pipeline(self): self.load('empty') self.http(b"""GET / HTTP/1.1 Host: localhost Referer: Referer-1 GET / HTTP/1.1 Host: localhost Referer: Referer-2 GET / HTTP/1.1 Host: localhost Referer: Referer-3 Connection: close """, raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "Referer-1" "-"'), 'pipeline 1') self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "Referer-2" "-"'), 'pipeline 2') self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "Referer-3" "-"'), 'pipeline 3') def test_access_log_ipv6(self): self.load('empty') self.conf({ "[::1]:7080": { "application": "empty" } }, '/listeners') self.get(sock_type='ipv6') self.stop() self.assertIsNotNone( self.search_in_log( r'::1 - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"'), 'ipv6') def test_access_log_referer(self): self.load('empty') self.get(headers={ 'Host': 'localhost', 'Referer': 'referer-value', 'Connection': 'close' }) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "referer-value" "-"'), 'referer') def test_access_log_user_agent(self): self.load('empty') self.get(headers={ 'Host': 'localhost', 'User-Agent': 'user-agent-value', 'Connection': 'close' }) self.stop() self.assertIsNotNone( self.search_in_log( r'"GET / HTTP/1.1" 200 0 "-" "user-agent-value"'), 'user agent') def test_access_log_http10(self): self.load('empty') self.get(http_10=True) self.stop() self.assertIsNotNone( self.search_in_log( r'"GET / HTTP/1.0" 200 0 "-" "-"'), 'http 1.0') def test_access_log_partial(self): self.load('empty') self.http(b"""GE""", raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GE" 400 0 "-" "-"'), 'partial') def test_access_log_partial_2(self): self.load('empty') self.http(b"""GET /\n""", raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET /" 400 \d+ "-" "-"'), 'partial 2') def test_access_log_partial_3(self): self.load('empty') self.http(b"""GET / HTTP/1.1""", raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET /" 400 0 "-" "-"'), 'partial 3') def test_access_log_partial_4(self): self.load('empty') resp = self.http(b"""GET / HTTP/1.1\n""", raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 400 0 "-" "-"'), 'partial 4') def test_access_log_partial_5(self): self.load('empty') self.http(b"""GET / HTTP/1.1\n\n""", raw_resp=True, raw=True) self.stop() self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "-" "-"'), 'partial 5') def test_access_log_get_parameters(self): self.load('empty') self.get(url='/?blah&var=val') self.stop() self.assertIsNotNone( self.search_in_log( r'"GET /\?blah&var=val HTTP/1.1" 200 0 "-" "-"'), 'get parameters') def test_access_log_delete(self): self.load('empty') self.conf_delete('/access_log') self.get(url='/delete') self.stop() self.assertIsNone(self.search_in_log(r'/delete'), 'delete') def test_access_log_change(self): self.load('empty') self.get() self.conf('"' + self.testdir + '/new.log"', '/access_log') self.get() self.stop() self.assertIsNotNone( self.search_in_log(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log'), 'change') if __name__ == '__main__': unittest.main()