summaryrefslogblamecommitdiffhomepage
path: root/test/test_settings.py
blob: 324042f9b32670e6c1c84da53542e5f343588f3a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                       
                                                                     












                                                                           


                                                       
                                                                     

                                                   
                                        



                                                    




                                                   
                                     
 




                          
 
                                                  


                         


                                                


                                              
                                                                   













                                                                         


                                                     
                                                                   





















                                                                                




                                         
                                                              


                                     
                                                                           







                                                                
                 








                                     
                                           





                                                                 


                                         
                                                              

                                         

                                      




                                 

                                 

                     
                                                                    



                                          
                                                               







                                                                               
                                                   

                          
                           
import time
import socket
import unittest
import unit

class TestUnitSettings(unit.TestUnitApplicationPython):

    def setUpClass():
        unit.TestUnit().check_modules('python')

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

        self.conf({'http': { 'header_read_timeout': 2 }}, 'settings')

        (resp, sock) = self.http(b"""GET / HTTP/1.1
""", start=True, raw=True)

        time.sleep(3)

        resp = self.http(b"""Host: localhost
Connection: close

""", sock=sock, raw=True)

        self.assertEqual(resp['status'], 408, 'status header read timeout')

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

        self.conf({'http': { 'header_read_timeout': 4 }}, 'settings')

        (resp, sock) = self.http(b"""GET / HTTP/1.1
""", start=True, raw=True, no_recv=True)

        time.sleep(2)

        (resp, sock) = self.http(b"""Host: localhost
""", start=True, sock=sock, raw=True, no_recv=True)

        time.sleep(2)

        (resp, sock) = self.http(b"""X-Blah: blah
""", start=True, sock=sock, raw=True)

        if len(resp) != 0:
            sock.close()

        else:
            time.sleep(2)

            resp = self.http(b"""Connection: close

""", sock=sock, raw=True)

        self.assertEqual(resp['status'], 408,
            'status header read timeout update')

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

        self.conf({'http': { 'body_read_timeout': 2 }}, 'settings')

        (resp, sock) = self.http(b"""POST / HTTP/1.1
Host: localhost
Content-Length: 10
Connection: close

""", start=True, raw_resp=True, raw=True)

        time.sleep(3)

        resp = self.http(b"""0123456789""", sock=sock, raw=True)

        self.assertEqual(resp['status'], 408, 'status body read timeout')

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

        self.conf({'http': { 'body_read_timeout': 4 }}, 'settings')

        (resp, sock) = self.http(b"""POST / HTTP/1.1
Host: localhost
Content-Length: 10
Connection: close

""", start=True, raw=True)

        time.sleep(2)

        (resp, sock) = self.http(b"""012""", start=True, sock=sock, raw=True)

        time.sleep(2)

        (resp, sock) = self.http(b"""345""", start=True, sock=sock, raw=True)

        time.sleep(2)

        resp = self.http(b"""6789""", sock=sock, raw=True)

        self.assertEqual(resp['status'], 200, 'status body read timeout update')

    def test_settings_send_timeout(self):
        self.load('mirror')

        data_len = 1048576

        self.conf({'http': { 'send_timeout': 1 }}, 'settings')

        addr = self.testdir + '/sock'

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

        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        sock.connect(addr)

        req = """POST / HTTP/1.1
Host: localhost
Content-Type: text/html
Content-Length: %d
Connection: close

""" % data_len + ('X' * data_len)

        sock.sendall(req.encode())

        data = sock.recv(16).decode()

        time.sleep(3)

        data += self.recvall(sock).decode()

        sock.close()

        self.assertRegex(data, r'200 OK', 'status send timeout')
        self.assertLess(len(data), data_len, 'data send timeout')

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

        self.conf({'http': { 'idle_timeout': 2 }}, 'settings')

        (resp, sock) = self.get(headers={
            'Host': 'localhost',
            'Connection': 'keep-alive'
        }, start=True)

        time.sleep(3)

        resp = self.get(headers={
            'Host': 'localhost',
            'Connection': 'close'
        }, sock=sock)

        self.assertEqual(resp['status'], 408, 'status idle timeout')

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

        self.conf({'http': { 'max_body_size': 5 }}, 'settings')

        self.assertEqual(self.post(body='01234')['status'], 200, 'status size')
        self.assertEqual(self.post(body='012345')['status'], 413,
            'status size max')

    @unittest.expectedFailure
    def test_settings_negative_value(self):
        self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }},
            'settings'), 'settings negative value')

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