summaryrefslogblamecommitdiffhomepage
path: root/test/test_access_log.py
blob: 05f5f54a6f7f04434e068d6848c021b4a96ea68d (plain) (tree)
1
2
3
4
5
6

         
           
                           

               








                                                        
                                                                    













                                                        

                       








                                                                          

                       






















                                                                           

                       


















                                                                          
                       


                                  

                       





                                                                          








                                      
                       









                                                                        








                                       

                       














                                                                              

                       










                                                                                

                       








                                                               
                                      
 

                       







                                                                 
                                           
 

                       







                                                                        
                                                  
 

                       







                                                                      
                                                           
 

                       








                                                                  
                                                      










                                                                               

                       









                                                                 
                                      


                               

                       








                                                                   
                                                                 


                  

                       





                                                                             












                                                            

                       













                                                                             

                       





                                                                      

                          
import os
import re
import time
from subprocess import call
import unittest
import unit

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')

        time.sleep(0.2)

        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')

        time.sleep(0.2)

        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)

        time.sleep(0.2)

        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')

        time.sleep(0.2)

        self.stop()

        self.assertIsNotNone(
            self.search_in_log(
                r'::1 - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"'), 'ipv6')

    def test_access_log_unix(self):
        self.load('empty')

        addr = self.testdir + '/sock'

        self.conf({
            "unix:" + addr: {
                "application": "empty"
            }
        }, 'listeners')

        self.get(sock_type='unix', addr=addr)

        time.sleep(0.2)

        self.stop()

        self.assertIsNotNone(self.search_in_log(
            r'unix: - - \[.+\] "GET / HTTP/1.1" 200 0 "-" "-"'), 'unix')

    def test_access_log_referer(self):
        self.load('empty')

        self.get(headers={
            'Host': 'localhost',
            'Referer': 'referer-value',
            'Connection': 'close'
        })

        time.sleep(0.2)

        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'
        })

        time.sleep(0.2)

        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)

        time.sleep(0.2)

        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=True)

        time.sleep(0.2)

        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=True)

        time.sleep(0.2)

        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=True)

        time.sleep(0.2)

        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=True)

        time.sleep(0.2)

        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=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')

        time.sleep(0.2)

        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')

        time.sleep(0.2)

        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()

        time.sleep(0.2)

        self.stop()

        self.assertIsNotNone(
            self.search_in_log(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log'),
            'change')

    def test_access_log_reopen(self):
        self.load('empty')

        log_path = self.testdir + '/access.log'

        self.assertTrue(self.waitforfiles(log_path), 'open')

        log_path_new = self.testdir + '/new.log'

        os.rename(log_path, log_path_new)

        self.get()

        time.sleep(0.2)

        self.assertIsNotNone(
            self.search_in_log(r'"GET / HTTP/1.1" 200 0 "-" "-"', 'new.log'),
            'rename new')
        self.assertFalse(os.path.isfile(log_path), 'rename old')

        with open(self.testdir + '/unit.pid', 'r') as f:
            pid = f.read().rstrip()

        call(['kill', '-s', 'USR1', pid])

        self.assertTrue(self.waitforfiles(log_path), 'reopen')

        self.get(url='/usr1')

        time.sleep(0.2)

        self.assertIsNone(
            self.search_in_log(r'/usr1', 'new.log'), 'rename new 2')
        self.assertIsNotNone(
            self.search_in_log(r'"GET /usr1 HTTP/1.1" 200 0 "-" "-"'),
            'reopen 2')

if __name__ == '__main__':
    unittest.main()