xref: /unit/test/test_settings.py (revision 1025)
1730Szelenkov@nginx.comimport time
2730Szelenkov@nginx.comimport socket
3730Szelenkov@nginx.comimport unittest
41019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
5730Szelenkov@nginx.com
61017Szelenkov@nginx.com
71019Szelenkov@nginx.comclass TestSettings(TestApplicationPython):
8*1025Szelenkov@nginx.com    prerequisites = ['python']
9730Szelenkov@nginx.com
10730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
11730Szelenkov@nginx.com        self.load('empty')
12730Szelenkov@nginx.com
131017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 2}}, 'settings')
14730Szelenkov@nginx.com
151017Szelenkov@nginx.com        (resp, sock) = self.http(
161017Szelenkov@nginx.com            b"""GET / HTTP/1.1
171017Szelenkov@nginx.com""",
181017Szelenkov@nginx.com            start=True,
191017Szelenkov@nginx.com            read_timeout=1,
201017Szelenkov@nginx.com            raw=True,
211017Szelenkov@nginx.com        )
22730Szelenkov@nginx.com
23730Szelenkov@nginx.com        time.sleep(3)
24730Szelenkov@nginx.com
251017Szelenkov@nginx.com        resp = self.http(
261017Szelenkov@nginx.com            b"""Host: localhost
27730Szelenkov@nginx.comConnection: close
28730Szelenkov@nginx.com
291017Szelenkov@nginx.com""",
301017Szelenkov@nginx.com            sock=sock,
311017Szelenkov@nginx.com            raw=True,
321017Szelenkov@nginx.com        )
33730Szelenkov@nginx.com
34730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status header read timeout')
35730Szelenkov@nginx.com
36756Szelenkov@nginx.com    def test_settings_header_read_timeout_update(self):
37756Szelenkov@nginx.com        self.load('empty')
38756Szelenkov@nginx.com
391017Szelenkov@nginx.com        self.conf({'http': {'header_read_timeout': 4}}, 'settings')
40756Szelenkov@nginx.com
411017Szelenkov@nginx.com        (resp, sock) = self.http(
421017Szelenkov@nginx.com            b"""GET / HTTP/1.1
431017Szelenkov@nginx.com""",
441017Szelenkov@nginx.com            start=True,
451017Szelenkov@nginx.com            read_timeout=1,
461017Szelenkov@nginx.com            raw=True,
471017Szelenkov@nginx.com            no_recv=True,
481017Szelenkov@nginx.com        )
49756Szelenkov@nginx.com
50756Szelenkov@nginx.com        time.sleep(2)
51756Szelenkov@nginx.com
521017Szelenkov@nginx.com        (resp, sock) = self.http(
531017Szelenkov@nginx.com            b"""Host: localhost
541017Szelenkov@nginx.com""",
551017Szelenkov@nginx.com            start=True,
561017Szelenkov@nginx.com            sock=sock,
571017Szelenkov@nginx.com            read_timeout=1,
581017Szelenkov@nginx.com            raw=True,
591017Szelenkov@nginx.com            no_recv=True,
601017Szelenkov@nginx.com        )
61759Szelenkov@nginx.com
62759Szelenkov@nginx.com        time.sleep(2)
63759Szelenkov@nginx.com
641017Szelenkov@nginx.com        (resp, sock) = self.http(
651017Szelenkov@nginx.com            b"""X-Blah: blah
661017Szelenkov@nginx.com""",
671017Szelenkov@nginx.com            start=True,
681017Szelenkov@nginx.com            sock=sock,
691017Szelenkov@nginx.com            read_timeout=1,
701017Szelenkov@nginx.com            raw=True,
711017Szelenkov@nginx.com        )
72767Szelenkov@nginx.com
73767Szelenkov@nginx.com        if len(resp) != 0:
74767Szelenkov@nginx.com            sock.close()
75756Szelenkov@nginx.com
76767Szelenkov@nginx.com        else:
77767Szelenkov@nginx.com            time.sleep(2)
78756Szelenkov@nginx.com
791017Szelenkov@nginx.com            resp = self.http(
801017Szelenkov@nginx.com                b"""Connection: close
81756Szelenkov@nginx.com
821017Szelenkov@nginx.com""",
831017Szelenkov@nginx.com                sock=sock,
841017Szelenkov@nginx.com                raw=True,
851017Szelenkov@nginx.com            )
86756Szelenkov@nginx.com
871017Szelenkov@nginx.com        self.assertEqual(
881017Szelenkov@nginx.com            resp['status'], 408, 'status header read timeout update'
891017Szelenkov@nginx.com        )
90756Szelenkov@nginx.com
91730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
92730Szelenkov@nginx.com        self.load('empty')
93730Szelenkov@nginx.com
941017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 2}}, 'settings')
95730Szelenkov@nginx.com
961017Szelenkov@nginx.com        (resp, sock) = self.http(
971017Szelenkov@nginx.com            b"""POST / HTTP/1.1
98730Szelenkov@nginx.comHost: localhost
99730Szelenkov@nginx.comContent-Length: 10
100730Szelenkov@nginx.comConnection: close
101730Szelenkov@nginx.com
1021017Szelenkov@nginx.com""",
1031017Szelenkov@nginx.com            start=True,
1041017Szelenkov@nginx.com            raw_resp=True,
1051017Szelenkov@nginx.com            read_timeout=1,
1061017Szelenkov@nginx.com            raw=True,
1071017Szelenkov@nginx.com        )
108730Szelenkov@nginx.com
109730Szelenkov@nginx.com        time.sleep(3)
110730Szelenkov@nginx.com
111730Szelenkov@nginx.com        resp = self.http(b"""0123456789""", sock=sock, raw=True)
112730Szelenkov@nginx.com
113730Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status body read timeout')
114730Szelenkov@nginx.com
115756Szelenkov@nginx.com    def test_settings_body_read_timeout_update(self):
116756Szelenkov@nginx.com        self.load('empty')
117756Szelenkov@nginx.com
1181017Szelenkov@nginx.com        self.conf({'http': {'body_read_timeout': 4}}, 'settings')
119756Szelenkov@nginx.com
1201017Szelenkov@nginx.com        (resp, sock) = self.http(
1211017Szelenkov@nginx.com            b"""POST / HTTP/1.1
122756Szelenkov@nginx.comHost: localhost
123756Szelenkov@nginx.comContent-Length: 10
124756Szelenkov@nginx.comConnection: close
125756Szelenkov@nginx.com
1261017Szelenkov@nginx.com""",
1271017Szelenkov@nginx.com            start=True,
1281017Szelenkov@nginx.com            read_timeout=1,
1291017Szelenkov@nginx.com            raw=True,
1301017Szelenkov@nginx.com        )
131756Szelenkov@nginx.com
132756Szelenkov@nginx.com        time.sleep(2)
133756Szelenkov@nginx.com
1341017Szelenkov@nginx.com        (resp, sock) = self.http(
1351017Szelenkov@nginx.com            b"""012""", start=True, sock=sock, read_timeout=1, raw=True
1361017Szelenkov@nginx.com        )
137756Szelenkov@nginx.com
138756Szelenkov@nginx.com        time.sleep(2)
139756Szelenkov@nginx.com
1401017Szelenkov@nginx.com        (resp, sock) = self.http(
1411017Szelenkov@nginx.com            b"""345""", start=True, sock=sock, read_timeout=1, raw=True
1421017Szelenkov@nginx.com        )
143756Szelenkov@nginx.com
144756Szelenkov@nginx.com        time.sleep(2)
145756Szelenkov@nginx.com
146756Szelenkov@nginx.com        resp = self.http(b"""6789""", sock=sock, raw=True)
147756Szelenkov@nginx.com
1481017Szelenkov@nginx.com        self.assertEqual(
1491017Szelenkov@nginx.com            resp['status'], 200, 'status body read timeout update'
1501017Szelenkov@nginx.com        )
151756Szelenkov@nginx.com
152730Szelenkov@nginx.com    def test_settings_send_timeout(self):
153730Szelenkov@nginx.com        self.load('mirror')
154730Szelenkov@nginx.com
155730Szelenkov@nginx.com        data_len = 1048576
156730Szelenkov@nginx.com
1571017Szelenkov@nginx.com        self.conf({'http': {'send_timeout': 1}}, 'settings')
158730Szelenkov@nginx.com
159730Szelenkov@nginx.com        addr = self.testdir + '/sock'
160730Szelenkov@nginx.com
161760Szelenkov@nginx.com        self.conf({"unix:" + addr: {'application': 'mirror'}}, 'listeners')
162730Szelenkov@nginx.com
163730Szelenkov@nginx.com        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
164730Szelenkov@nginx.com        sock.connect(addr)
165730Szelenkov@nginx.com
166730Szelenkov@nginx.com        req = """POST / HTTP/1.1
167730Szelenkov@nginx.comHost: localhost
168730Szelenkov@nginx.comContent-Type: text/html
169730Szelenkov@nginx.comContent-Length: %d
170970Szelenkov@nginx.comConnection: close
171730Szelenkov@nginx.com
1721017Szelenkov@nginx.com""" % data_len + (
1731017Szelenkov@nginx.com            'X' * data_len
1741017Szelenkov@nginx.com        )
175730Szelenkov@nginx.com
176730Szelenkov@nginx.com        sock.sendall(req.encode())
177730Szelenkov@nginx.com
178730Szelenkov@nginx.com        data = sock.recv(16).decode()
179730Szelenkov@nginx.com
180730Szelenkov@nginx.com        time.sleep(3)
181730Szelenkov@nginx.com
182738Szelenkov@nginx.com        data += self.recvall(sock).decode()
183730Szelenkov@nginx.com
184730Szelenkov@nginx.com        sock.close()
185730Szelenkov@nginx.com
186730Szelenkov@nginx.com        self.assertRegex(data, r'200 OK', 'status send timeout')
187730Szelenkov@nginx.com        self.assertLess(len(data), data_len, 'data send timeout')
188730Szelenkov@nginx.com
189730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
190730Szelenkov@nginx.com        self.load('empty')
191730Szelenkov@nginx.com
1921017Szelenkov@nginx.com        self.conf({'http': {'idle_timeout': 2}}, 'settings')
193730Szelenkov@nginx.com
1941017Szelenkov@nginx.com        (resp, sock) = self.get(
1951017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'keep-alive'},
1961017Szelenkov@nginx.com            start=True,
1971017Szelenkov@nginx.com            read_timeout=1,
1981017Szelenkov@nginx.com        )
199730Szelenkov@nginx.com
200730Szelenkov@nginx.com        time.sleep(3)
201730Szelenkov@nginx.com
2021017Szelenkov@nginx.com        resp = self.get(
2031017Szelenkov@nginx.com            headers={'Host': 'localhost', 'Connection': 'close'}, sock=sock
2041017Szelenkov@nginx.com        )
205730Szelenkov@nginx.com
206755Szelenkov@nginx.com        self.assertEqual(resp['status'], 408, 'status idle timeout')
207730Szelenkov@nginx.com
208730Szelenkov@nginx.com    def test_settings_max_body_size(self):
209730Szelenkov@nginx.com        self.load('empty')
210730Szelenkov@nginx.com
2111017Szelenkov@nginx.com        self.conf({'http': {'max_body_size': 5}}, 'settings')
212730Szelenkov@nginx.com
213730Szelenkov@nginx.com        self.assertEqual(self.post(body='01234')['status'], 200, 'status size')
2141017Szelenkov@nginx.com        self.assertEqual(
2151017Szelenkov@nginx.com            self.post(body='012345')['status'], 413, 'status size max'
2161017Szelenkov@nginx.com        )
217730Szelenkov@nginx.com
218730Szelenkov@nginx.com    @unittest.expectedFailure
219730Szelenkov@nginx.com    def test_settings_negative_value(self):
2201017Szelenkov@nginx.com        self.assertIn(
2211017Szelenkov@nginx.com            'error',
2221017Szelenkov@nginx.com            self.conf({'http': {'max_body_size': -1}}, 'settings'),
2231017Szelenkov@nginx.com            'settings negative value',
2241017Szelenkov@nginx.com        )
2251017Szelenkov@nginx.com
226730Szelenkov@nginx.com
227730Szelenkov@nginx.comif __name__ == '__main__':
2281019Szelenkov@nginx.com    TestSettings.main()
229