xref: /unit/test/test_settings.py (revision 767)
1730Szelenkov@nginx.comimport time
2730Szelenkov@nginx.comimport socket
3730Szelenkov@nginx.comimport unittest
4730Szelenkov@nginx.comimport unit
5730Szelenkov@nginx.com
6730Szelenkov@nginx.comclass TestUnitSettings(unit.TestUnitApplicationPython):
7730Szelenkov@nginx.com
8730Szelenkov@nginx.com    def setUpClass():
9730Szelenkov@nginx.com        unit.TestUnit().check_modules('python')
10730Szelenkov@nginx.com
11730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
12730Szelenkov@nginx.com        self.load('empty')
13730Szelenkov@nginx.com
14760Szelenkov@nginx.com        self.conf({'http': { 'header_read_timeout': 2 }}, 'settings')
15730Szelenkov@nginx.com
16730Szelenkov@nginx.com        (resp, sock) = self.http(b"""GET / HTTP/1.1
17730Szelenkov@nginx.com""", start=True, raw=True)
18730Szelenkov@nginx.com
19730Szelenkov@nginx.com        time.sleep(3)
20730Szelenkov@nginx.com
21730Szelenkov@nginx.com        resp = self.http(b"""Host: localhost
22730Szelenkov@nginx.comConnection: close
23730Szelenkov@nginx.com
24730Szelenkov@nginx.com""", sock=sock, raw=True)
25730Szelenkov@nginx.com
26730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status header read timeout')
27730Szelenkov@nginx.com
28756Szelenkov@nginx.com    def test_settings_header_read_timeout_update(self):
29756Szelenkov@nginx.com        self.load('empty')
30756Szelenkov@nginx.com
31*767Szelenkov@nginx.com        r = None
32*767Szelenkov@nginx.com
33760Szelenkov@nginx.com        self.conf({'http': { 'header_read_timeout': 4 }}, 'settings')
34756Szelenkov@nginx.com
35756Szelenkov@nginx.com        (resp, sock) = self.http(b"""GET / HTTP/1.1
36759Szelenkov@nginx.com""", start=True, raw=True, no_recv=True)
37756Szelenkov@nginx.com
38756Szelenkov@nginx.com        time.sleep(2)
39756Szelenkov@nginx.com
40756Szelenkov@nginx.com        (resp, sock) = self.http(b"""Host: localhost
41759Szelenkov@nginx.com""", start=True, sock=sock, raw=True, no_recv=True)
42759Szelenkov@nginx.com
43759Szelenkov@nginx.com        time.sleep(2)
44759Szelenkov@nginx.com
45759Szelenkov@nginx.com        (resp, sock) = self.http(b"""X-Blah: blah
46*767Szelenkov@nginx.com""", start=True, sock=sock, raw=True)
47*767Szelenkov@nginx.com
48*767Szelenkov@nginx.com        if len(resp) != 0:
49*767Szelenkov@nginx.com            sock.close()
50756Szelenkov@nginx.com
51*767Szelenkov@nginx.com        else:
52*767Szelenkov@nginx.com            time.sleep(2)
53756Szelenkov@nginx.com
54*767Szelenkov@nginx.com            resp = self.http(b"""Connection: close
55756Szelenkov@nginx.com
56756Szelenkov@nginx.com""", sock=sock, raw=True)
57756Szelenkov@nginx.com
58756Szelenkov@nginx.com        self.assertEqual(resp['status'], 408,
59756Szelenkov@nginx.com            'status header read timeout update')
60756Szelenkov@nginx.com
61730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
62730Szelenkov@nginx.com        self.load('empty')
63730Szelenkov@nginx.com
64760Szelenkov@nginx.com        self.conf({'http': { 'body_read_timeout': 2 }}, 'settings')
65730Szelenkov@nginx.com
66730Szelenkov@nginx.com        (resp, sock) = self.http(b"""POST / HTTP/1.1
67730Szelenkov@nginx.comHost: localhost
68730Szelenkov@nginx.comContent-Length: 10
69730Szelenkov@nginx.comConnection: close
70730Szelenkov@nginx.com
71730Szelenkov@nginx.com""", start=True, raw_resp=True, raw=True)
72730Szelenkov@nginx.com
73730Szelenkov@nginx.com        time.sleep(3)
74730Szelenkov@nginx.com
75730Szelenkov@nginx.com        resp = self.http(b"""0123456789""", sock=sock, raw=True)
76730Szelenkov@nginx.com
77730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status body read timeout')
78730Szelenkov@nginx.com
79756Szelenkov@nginx.com    def test_settings_body_read_timeout_update(self):
80756Szelenkov@nginx.com        self.load('empty')
81756Szelenkov@nginx.com
82760Szelenkov@nginx.com        self.conf({'http': { 'body_read_timeout': 4 }}, 'settings')
83756Szelenkov@nginx.com
84756Szelenkov@nginx.com        (resp, sock) = self.http(b"""POST / HTTP/1.1
85756Szelenkov@nginx.comHost: localhost
86756Szelenkov@nginx.comContent-Length: 10
87756Szelenkov@nginx.comConnection: close
88756Szelenkov@nginx.com
89756Szelenkov@nginx.com""", start=True, raw=True)
90756Szelenkov@nginx.com
91756Szelenkov@nginx.com        time.sleep(2)
92756Szelenkov@nginx.com
93756Szelenkov@nginx.com        (resp, sock) = self.http(b"""012""", start=True, sock=sock, raw=True)
94756Szelenkov@nginx.com
95756Szelenkov@nginx.com        time.sleep(2)
96756Szelenkov@nginx.com
97756Szelenkov@nginx.com        (resp, sock) = self.http(b"""345""", start=True, sock=sock, raw=True)
98756Szelenkov@nginx.com
99756Szelenkov@nginx.com        time.sleep(2)
100756Szelenkov@nginx.com
101756Szelenkov@nginx.com        resp = self.http(b"""6789""", sock=sock, raw=True)
102756Szelenkov@nginx.com
103756Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status body read timeout update')
104756Szelenkov@nginx.com
105730Szelenkov@nginx.com    def test_settings_send_timeout(self):
106730Szelenkov@nginx.com        self.load('mirror')
107730Szelenkov@nginx.com
108730Szelenkov@nginx.com        data_len = 1048576
109730Szelenkov@nginx.com
110760Szelenkov@nginx.com        self.conf({'http': { 'send_timeout': 1 }}, 'settings')
111730Szelenkov@nginx.com
112730Szelenkov@nginx.com        addr = self.testdir + '/sock'
113730Szelenkov@nginx.com
114760Szelenkov@nginx.com        self.conf({"unix:" + addr: {'application': 'mirror'}}, 'listeners')
115730Szelenkov@nginx.com
116730Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
117730Szelenkov@nginx.com        sock.connect(addr)
118730Szelenkov@nginx.com
119730Szelenkov@nginx.com        req = """POST / HTTP/1.1
120730Szelenkov@nginx.comHost: localhost
121730Szelenkov@nginx.comContent-Type: text/html
122730Szelenkov@nginx.comContent-Length: %d
123730Szelenkov@nginx.com
124730Szelenkov@nginx.com""" % data_len + ('X' * data_len)
125730Szelenkov@nginx.com
126730Szelenkov@nginx.com        sock.sendall(req.encode())
127730Szelenkov@nginx.com
128730Szelenkov@nginx.com        data = sock.recv(16).decode()
129730Szelenkov@nginx.com
130730Szelenkov@nginx.com        time.sleep(3)
131730Szelenkov@nginx.com
132738Szelenkov@nginx.com        data += self.recvall(sock).decode()
133730Szelenkov@nginx.com
134730Szelenkov@nginx.com        sock.close()
135730Szelenkov@nginx.com
136730Szelenkov@nginx.com        self.assertRegex(data, r'200 OK', 'status send timeout')
137730Szelenkov@nginx.com        self.assertLess(len(data), data_len, 'data send timeout')
138730Szelenkov@nginx.com
139730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
140730Szelenkov@nginx.com        self.load('empty')
141730Szelenkov@nginx.com
142760Szelenkov@nginx.com        self.conf({'http': { 'idle_timeout': 2 }}, 'settings')
143730Szelenkov@nginx.com
144730Szelenkov@nginx.com        (resp, sock) = self.get(headers={
145730Szelenkov@nginx.com            'Connection': 'keep-alive',
146730Szelenkov@nginx.com            'Host': 'localhost'
147730Szelenkov@nginx.com        }, start=True)
148730Szelenkov@nginx.com
149730Szelenkov@nginx.com        time.sleep(3)
150730Szelenkov@nginx.com
151730Szelenkov@nginx.com        resp = self.get(headers={
152730Szelenkov@nginx.com            'Connection': 'close',
153730Szelenkov@nginx.com            'Host': 'localhost'
154730Szelenkov@nginx.com        }, sock=sock)
155730Szelenkov@nginx.com
156755Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status idle timeout')
157730Szelenkov@nginx.com
158730Szelenkov@nginx.com    def test_settings_max_body_size(self):
159730Szelenkov@nginx.com        self.load('empty')
160730Szelenkov@nginx.com
161760Szelenkov@nginx.com        self.conf({'http': { 'max_body_size': 5 }}, 'settings')
162730Szelenkov@nginx.com
163730Szelenkov@nginx.com        self.assertEqual(self.post(body='01234')['status'], 200, 'status size')
164730Szelenkov@nginx.com        self.assertEqual(self.post(body='012345')['status'], 413,
165730Szelenkov@nginx.com            'status size max')
166730Szelenkov@nginx.com
167730Szelenkov@nginx.com    @unittest.expectedFailure
168730Szelenkov@nginx.com    def test_settings_negative_value(self):
169730Szelenkov@nginx.com        self.assertIn('error', self.conf({'http': { 'max_body_size': -1 }},
170760Szelenkov@nginx.com            'settings'), 'settings negative value')
171730Szelenkov@nginx.com
172730Szelenkov@nginx.comif __name__ == '__main__':
173730Szelenkov@nginx.com    unittest.main()
174