xref: /unit/test/test_settings.py (revision 730)
1*730Szelenkov@nginx.comimport time
2*730Szelenkov@nginx.comimport socket
3*730Szelenkov@nginx.comimport unittest
4*730Szelenkov@nginx.comimport unit
5*730Szelenkov@nginx.com
6*730Szelenkov@nginx.comclass TestUnitSettings(unit.TestUnitApplicationPython):
7*730Szelenkov@nginx.com
8*730Szelenkov@nginx.com    def setUpClass():
9*730Szelenkov@nginx.com        unit.TestUnit().check_modules('python')
10*730Szelenkov@nginx.com
11*730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
12*730Szelenkov@nginx.com        self.load('empty')
13*730Szelenkov@nginx.com
14*730Szelenkov@nginx.com        self.conf({'http': { 'header_read_timeout': 2 }}, '/settings')
15*730Szelenkov@nginx.com
16*730Szelenkov@nginx.com        (resp, sock) = self.http(b"""GET / HTTP/1.1
17*730Szelenkov@nginx.com""", start=True, raw=True)
18*730Szelenkov@nginx.com
19*730Szelenkov@nginx.com        time.sleep(3)
20*730Szelenkov@nginx.com
21*730Szelenkov@nginx.com        resp = self.http(b"""Host: localhost
22*730Szelenkov@nginx.comConnection: close
23*730Szelenkov@nginx.com
24*730Szelenkov@nginx.com""", sock=sock, raw=True)
25*730Szelenkov@nginx.com
26*730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status header read timeout')
27*730Szelenkov@nginx.com
28*730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
29*730Szelenkov@nginx.com        self.load('empty')
30*730Szelenkov@nginx.com
31*730Szelenkov@nginx.com        self.conf({'http': { 'body_read_timeout': 2 }}, '/settings')
32*730Szelenkov@nginx.com
33*730Szelenkov@nginx.com        (resp, sock) = self.http(b"""POST / HTTP/1.1
34*730Szelenkov@nginx.comHost: localhost
35*730Szelenkov@nginx.comContent-Length: 10
36*730Szelenkov@nginx.comConnection: close
37*730Szelenkov@nginx.com
38*730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True)
39*730Szelenkov@nginx.com
40*730Szelenkov@nginx.com        time.sleep(3)
41*730Szelenkov@nginx.com
42*730Szelenkov@nginx.com        resp = self.http(b"""0123456789""", sock=sock, raw=True)
43*730Szelenkov@nginx.com
44*730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status body read timeout')
45*730Szelenkov@nginx.com
46*730Szelenkov@nginx.com    def test_settings_send_timeout(self):
47*730Szelenkov@nginx.com        self.load('mirror')
48*730Szelenkov@nginx.com
49*730Szelenkov@nginx.com        data_len = 1048576
50*730Szelenkov@nginx.com
51*730Szelenkov@nginx.com        self.conf({'http': { 'send_timeout': 1 }}, '/settings')
52*730Szelenkov@nginx.com
53*730Szelenkov@nginx.com        addr = self.testdir + '/sock'
54*730Szelenkov@nginx.com
55*730Szelenkov@nginx.com        self.conf({"unix:" + addr: {'application': 'mirror'}}, '/listeners')
56*730Szelenkov@nginx.com
57*730Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
58*730Szelenkov@nginx.com        sock.connect(addr)
59*730Szelenkov@nginx.com
60*730Szelenkov@nginx.com        req = """POST / HTTP/1.1
61*730Szelenkov@nginx.comHost: localhost
62*730Szelenkov@nginx.comContent-Type: text/html
63*730Szelenkov@nginx.comContent-Length: %d
64*730Szelenkov@nginx.com
65*730Szelenkov@nginx.com""" % data_len + ('X' * data_len)
66*730Szelenkov@nginx.com
67*730Szelenkov@nginx.com        sock.sendall(req.encode())
68*730Szelenkov@nginx.com
69*730Szelenkov@nginx.com        data = sock.recv(16).decode()
70*730Szelenkov@nginx.com
71*730Szelenkov@nginx.com        time.sleep(3)
72*730Szelenkov@nginx.com
73*730Szelenkov@nginx.com        data += self.recvall(sock)
74*730Szelenkov@nginx.com
75*730Szelenkov@nginx.com        sock.close()
76*730Szelenkov@nginx.com
77*730Szelenkov@nginx.com        self.assertRegex(data, r'200 OK', 'status send timeout')
78*730Szelenkov@nginx.com        self.assertLess(len(data), data_len, 'data send timeout')
79*730Szelenkov@nginx.com
80*730Szelenkov@nginx.com
81*730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
82*730Szelenkov@nginx.com        self.load('empty')
83*730Szelenkov@nginx.com
84*730Szelenkov@nginx.com        self.conf({'http': { 'idle_timeout': 2 }}, '/settings')
85*730Szelenkov@nginx.com
86*730Szelenkov@nginx.com        (resp, sock) = self.get(headers={
87*730Szelenkov@nginx.com            'Connection': 'keep-alive',
88*730Szelenkov@nginx.com            'Host': 'localhost'
89*730Szelenkov@nginx.com        }, start=True)
90*730Szelenkov@nginx.com
91*730Szelenkov@nginx.com        time.sleep(3)
92*730Szelenkov@nginx.com
93*730Szelenkov@nginx.com        resp = self.get(headers={
94*730Szelenkov@nginx.com            'Connection': 'close',
95*730Szelenkov@nginx.com            'Host': 'localhost'
96*730Szelenkov@nginx.com        }, sock=sock)
97*730Szelenkov@nginx.com
98*730Szelenkov@nginx.com        self.assertEqual(resp, {}, 'idle timeout')
99*730Szelenkov@nginx.com
100*730Szelenkov@nginx.com    def test_settings_max_body_size(self):
101*730Szelenkov@nginx.com        self.load('empty')
102*730Szelenkov@nginx.com
103*730Szelenkov@nginx.com        self.conf({'http': { 'max_body_size': 5 }}, '/settings')
104*730Szelenkov@nginx.com
105*730Szelenkov@nginx.com        self.assertEqual(self.post(body='01234')['status'], 200, 'status size')
106*730Szelenkov@nginx.com        self.assertEqual(self.post(body='012345')['status'], 413,
107*730Szelenkov@nginx.com            'status size max')
108*730Szelenkov@nginx.com
109*730Szelenkov@nginx.com    @unittest.expectedFailure
110*730Szelenkov@nginx.com    def test_settings_negative_value(self):
111*730Szelenkov@nginx.com        self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }},
112*730Szelenkov@nginx.com            '/settings'), 'settings negative value')
113*730Szelenkov@nginx.com
114*730Szelenkov@nginx.com
115*730Szelenkov@nginx.comif __name__ == '__main__':
116*730Szelenkov@nginx.com    unittest.main()
117