xref: /unit/test/test_settings.py (revision 2073)
11635Szelenkov@nginx.comimport re
21477Szelenkov@nginx.comimport socket
3730Szelenkov@nginx.comimport time
41477Szelenkov@nginx.com
51635Szelenkov@nginx.comimport pytest
61019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
71877Szelenkov@nginx.comfrom unit.utils import sysctl
8730Szelenkov@nginx.com
91017Szelenkov@nginx.com
101019Szelenkov@nginx.comclass TestSettings(TestApplicationPython):
111467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'any'}}
12730Szelenkov@nginx.com
13730Szelenkov@nginx.com    def test_settings_header_read_timeout(self):
14730Szelenkov@nginx.com        self.load('empty')
15730Szelenkov@nginx.com
161878Szelenkov@nginx.com        def req():
171878Szelenkov@nginx.com            (resp, sock) = self.http(
181878Szelenkov@nginx.com                b"""GET / HTTP/1.1
191017Szelenkov@nginx.com""",
201878Szelenkov@nginx.com                start=True,
211878Szelenkov@nginx.com                read_timeout=1,
221878Szelenkov@nginx.com                raw=True,
231878Szelenkov@nginx.com            )
24730Szelenkov@nginx.com
251878Szelenkov@nginx.com            time.sleep(3)
26730Szelenkov@nginx.com
271878Szelenkov@nginx.com            return self.http(
281878Szelenkov@nginx.com                b"""Host: localhost
29730Szelenkov@nginx.comConnection: close
30730Szelenkov@nginx.com
311878Szelenkov@nginx.com    """,
321878Szelenkov@nginx.com                sock=sock,
331878Szelenkov@nginx.com                raw=True,
341878Szelenkov@nginx.com            )
351878Szelenkov@nginx.com
361878Szelenkov@nginx.com        assert 'success' in self.conf(
371878Szelenkov@nginx.com            {'http': {'header_read_timeout': 2}}, 'settings'
381017Szelenkov@nginx.com        )
391878Szelenkov@nginx.com        assert req()['status'] == 408, 'status header read timeout'
40730Szelenkov@nginx.com
411878Szelenkov@nginx.com        assert 'success' in self.conf(
421878Szelenkov@nginx.com            {'http': {'header_read_timeout': 7}}, 'settings'
431878Szelenkov@nginx.com        )
441878Szelenkov@nginx.com        assert req()['status'] == 200, 'status header read timeout 2'
45730Szelenkov@nginx.com
46756Szelenkov@nginx.com    def test_settings_header_read_timeout_update(self):
47756Szelenkov@nginx.com        self.load('empty')
48756Szelenkov@nginx.com
491878Szelenkov@nginx.com        assert 'success' in self.conf(
501878Szelenkov@nginx.com            {'http': {'header_read_timeout': 4}}, 'settings'
511878Szelenkov@nginx.com        )
52756Szelenkov@nginx.com
531017Szelenkov@nginx.com        (resp, sock) = self.http(
541017Szelenkov@nginx.com            b"""GET / HTTP/1.1
551017Szelenkov@nginx.com""",
561017Szelenkov@nginx.com            start=True,
571017Szelenkov@nginx.com            raw=True,
581017Szelenkov@nginx.com            no_recv=True,
591017Szelenkov@nginx.com        )
60756Szelenkov@nginx.com
61756Szelenkov@nginx.com        time.sleep(2)
62756Szelenkov@nginx.com
631017Szelenkov@nginx.com        (resp, sock) = self.http(
641017Szelenkov@nginx.com            b"""Host: localhost
651017Szelenkov@nginx.com""",
661017Szelenkov@nginx.com            start=True,
671017Szelenkov@nginx.com            sock=sock,
681017Szelenkov@nginx.com            raw=True,
691017Szelenkov@nginx.com            no_recv=True,
701017Szelenkov@nginx.com        )
71759Szelenkov@nginx.com
72759Szelenkov@nginx.com        time.sleep(2)
73759Szelenkov@nginx.com
741017Szelenkov@nginx.com        (resp, sock) = self.http(
751017Szelenkov@nginx.com            b"""X-Blah: blah
761017Szelenkov@nginx.com""",
771017Szelenkov@nginx.com            start=True,
781017Szelenkov@nginx.com            sock=sock,
791017Szelenkov@nginx.com            read_timeout=1,
801017Szelenkov@nginx.com            raw=True,
811017Szelenkov@nginx.com        )
82767Szelenkov@nginx.com
83767Szelenkov@nginx.com        if len(resp) != 0:
84767Szelenkov@nginx.com            sock.close()
85756Szelenkov@nginx.com
86767Szelenkov@nginx.com        else:
87767Szelenkov@nginx.com            time.sleep(2)
88756Szelenkov@nginx.com
891017Szelenkov@nginx.com            resp = self.http(
901017Szelenkov@nginx.com                b"""Connection: close
91756Szelenkov@nginx.com
921017Szelenkov@nginx.com""",
931017Szelenkov@nginx.com                sock=sock,
941017Szelenkov@nginx.com                raw=True,
951017Szelenkov@nginx.com            )
96756Szelenkov@nginx.com
971596Szelenkov@nginx.com        assert resp['status'] == 408, 'status header read timeout update'
98756Szelenkov@nginx.com
99730Szelenkov@nginx.com    def test_settings_body_read_timeout(self):
100730Szelenkov@nginx.com        self.load('empty')
101730Szelenkov@nginx.com
1021878Szelenkov@nginx.com        def req():
1031878Szelenkov@nginx.com            (resp, sock) = self.http(
1041878Szelenkov@nginx.com                b"""POST / HTTP/1.1
105730Szelenkov@nginx.comHost: localhost
106730Szelenkov@nginx.comContent-Length: 10
107730Szelenkov@nginx.comConnection: close
108730Szelenkov@nginx.com
1091017Szelenkov@nginx.com""",
1101878Szelenkov@nginx.com                start=True,
1111878Szelenkov@nginx.com                raw_resp=True,
1121878Szelenkov@nginx.com                read_timeout=1,
1131878Szelenkov@nginx.com                raw=True,
1141878Szelenkov@nginx.com            )
1151878Szelenkov@nginx.com
1161878Szelenkov@nginx.com            time.sleep(3)
1171878Szelenkov@nginx.com
1181878Szelenkov@nginx.com            return self.http(b"""0123456789""", sock=sock, raw=True)
119730Szelenkov@nginx.com
1201878Szelenkov@nginx.com        assert 'success' in self.conf(
1211878Szelenkov@nginx.com            {'http': {'body_read_timeout': 2}}, 'settings'
1221878Szelenkov@nginx.com        )
1231878Szelenkov@nginx.com        assert req()['status'] == 408, 'status body read timeout'
124730Szelenkov@nginx.com
1251878Szelenkov@nginx.com        assert 'success' in self.conf(
1261878Szelenkov@nginx.com            {'http': {'body_read_timeout': 7}}, 'settings'
1271878Szelenkov@nginx.com        )
1281878Szelenkov@nginx.com        assert req()['status'] == 200, 'status body read timeout 2'
129730Szelenkov@nginx.com
130756Szelenkov@nginx.com    def test_settings_body_read_timeout_update(self):
131756Szelenkov@nginx.com        self.load('empty')
132756Szelenkov@nginx.com
1331878Szelenkov@nginx.com        assert 'success' in self.conf(
1341878Szelenkov@nginx.com            {'http': {'body_read_timeout': 4}}, 'settings'
1351878Szelenkov@nginx.com        )
136756Szelenkov@nginx.com
1371017Szelenkov@nginx.com        (resp, sock) = self.http(
1381017Szelenkov@nginx.com            b"""POST / HTTP/1.1
139756Szelenkov@nginx.comHost: localhost
140756Szelenkov@nginx.comContent-Length: 10
141756Szelenkov@nginx.comConnection: close
142756Szelenkov@nginx.com
1431017Szelenkov@nginx.com""",
1441017Szelenkov@nginx.com            start=True,
1451017Szelenkov@nginx.com            read_timeout=1,
1461017Szelenkov@nginx.com            raw=True,
1471017Szelenkov@nginx.com        )
148756Szelenkov@nginx.com
149756Szelenkov@nginx.com        time.sleep(2)
150756Szelenkov@nginx.com
1511017Szelenkov@nginx.com        (resp, sock) = self.http(
1521017Szelenkov@nginx.com            b"""012""", start=True, sock=sock, read_timeout=1, raw=True
1531017Szelenkov@nginx.com        )
154756Szelenkov@nginx.com
155756Szelenkov@nginx.com        time.sleep(2)
156756Szelenkov@nginx.com
1571017Szelenkov@nginx.com        (resp, sock) = self.http(
1581017Szelenkov@nginx.com            b"""345""", start=True, sock=sock, read_timeout=1, raw=True
1591017Szelenkov@nginx.com        )
160756Szelenkov@nginx.com
161756Szelenkov@nginx.com        time.sleep(2)
162756Szelenkov@nginx.com
163756Szelenkov@nginx.com        resp = self.http(b"""6789""", sock=sock, raw=True)
164756Szelenkov@nginx.com
1651596Szelenkov@nginx.com        assert resp['status'] == 200, 'status body read timeout update'
166756Szelenkov@nginx.com
1671654Szelenkov@nginx.com    def test_settings_send_timeout(self, temp_dir):
1681877Szelenkov@nginx.com        self.load('body_generate')
169730Szelenkov@nginx.com
1701878Szelenkov@nginx.com        def req(addr, data_len):
1711878Szelenkov@nginx.com            sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
1721878Szelenkov@nginx.com            sock.connect(addr)
1731878Szelenkov@nginx.com
1741878Szelenkov@nginx.com            req = (
1751878Szelenkov@nginx.com                """GET / HTTP/1.1
1761878Szelenkov@nginx.comHost: localhost
1771878Szelenkov@nginx.comX-Length: %d
1781878Szelenkov@nginx.comConnection: close
1791878Szelenkov@nginx.com
1801878Szelenkov@nginx.com"""
1811878Szelenkov@nginx.com                % data_len
1821878Szelenkov@nginx.com            )
1831878Szelenkov@nginx.com
1841878Szelenkov@nginx.com            sock.sendall(req.encode())
1851878Szelenkov@nginx.com
1861878Szelenkov@nginx.com            data = sock.recv(16).decode()
1871878Szelenkov@nginx.com
1881878Szelenkov@nginx.com            time.sleep(3)
1891878Szelenkov@nginx.com
1901878Szelenkov@nginx.com            data += self.recvall(sock).decode()
1911878Szelenkov@nginx.com
1921878Szelenkov@nginx.com            sock.close()
1931878Szelenkov@nginx.com
1941878Szelenkov@nginx.com            return data
1951878Szelenkov@nginx.com
1961877Szelenkov@nginx.com        sysctl_out = sysctl()
1971877Szelenkov@nginx.com        values = re.findall(
1981877Szelenkov@nginx.com            r'net.core.[rw]mem_(?:max|default).*?(\d+)', sysctl_out
1991877Szelenkov@nginx.com        )
2001877Szelenkov@nginx.com        values = [int(v) for v in values]
2011877Szelenkov@nginx.com
2021877Szelenkov@nginx.com        data_len = 1048576 if len(values) == 0 else 10 * max(values)
203730Szelenkov@nginx.com
2041654Szelenkov@nginx.com        addr = temp_dir + '/sock'
205730Szelenkov@nginx.com
2061878Szelenkov@nginx.com        assert 'success' in self.conf(
2071877Szelenkov@nginx.com            {"unix:" + addr: {'application': 'body_generate'}}, 'listeners'
2081877Szelenkov@nginx.com        )
209730Szelenkov@nginx.com
210*2073Szelenkov@nginx.com        assert 'success' in self.conf({'http': {'send_timeout': 1}}, 'settings')
211730Szelenkov@nginx.com
2121878Szelenkov@nginx.com        data = req(addr, data_len)
2131878Szelenkov@nginx.com        assert re.search(r'200 OK', data), 'send timeout status'
2141878Szelenkov@nginx.com        assert len(data) < data_len, 'send timeout data '
215730Szelenkov@nginx.com
2161878Szelenkov@nginx.com        self.conf({'http': {'send_timeout': 7}}, 'settings')
217730Szelenkov@nginx.com
2181878Szelenkov@nginx.com        data = req(addr, data_len)
2191878Szelenkov@nginx.com        assert re.search(r'200 OK', data), 'send timeout status  2'
2201878Szelenkov@nginx.com        assert len(data) > data_len, 'send timeout data 2'
221730Szelenkov@nginx.com
222730Szelenkov@nginx.com    def test_settings_idle_timeout(self):
223730Szelenkov@nginx.com        self.load('empty')
224730Szelenkov@nginx.com
2251878Szelenkov@nginx.com        def req():
2261878Szelenkov@nginx.com            (resp, sock) = self.get(
2271878Szelenkov@nginx.com                headers={'Host': 'localhost', 'Connection': 'keep-alive'},
2281878Szelenkov@nginx.com                start=True,
2291878Szelenkov@nginx.com                read_timeout=1,
2301878Szelenkov@nginx.com            )
2311878Szelenkov@nginx.com
2321878Szelenkov@nginx.com            time.sleep(3)
2331878Szelenkov@nginx.com
2341878Szelenkov@nginx.com            return self.get(sock=sock)
2351878Szelenkov@nginx.com
2361596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
2371029Szelenkov@nginx.com
238*2073Szelenkov@nginx.com        assert 'success' in self.conf({'http': {'idle_timeout': 2}}, 'settings')
2391878Szelenkov@nginx.com        assert req()['status'] == 408, 'status idle timeout'
240730Szelenkov@nginx.com
241*2073Szelenkov@nginx.com        assert 'success' in self.conf({'http': {'idle_timeout': 7}}, 'settings')
2421878Szelenkov@nginx.com        assert req()['status'] == 200, 'status idle timeout 2'
243730Szelenkov@nginx.com
2441606Szelenkov@nginx.com    def test_settings_idle_timeout_2(self):
2451606Szelenkov@nginx.com        self.load('empty')
2461606Szelenkov@nginx.com
2471878Szelenkov@nginx.com        def req():
2481878Szelenkov@nginx.com            _, sock = self.http(b'', start=True, raw=True, no_recv=True)
2491878Szelenkov@nginx.com
2501878Szelenkov@nginx.com            time.sleep(3)
2511878Szelenkov@nginx.com
2521878Szelenkov@nginx.com            return self.get(sock=sock)
2531878Szelenkov@nginx.com
2541606Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
2551606Szelenkov@nginx.com
256*2073Szelenkov@nginx.com        assert 'success' in self.conf({'http': {'idle_timeout': 1}}, 'settings')
2571878Szelenkov@nginx.com        assert req()['status'] == 408, 'status idle timeout'
2581606Szelenkov@nginx.com
259*2073Szelenkov@nginx.com        assert 'success' in self.conf({'http': {'idle_timeout': 7}}, 'settings')
2601878Szelenkov@nginx.com        assert req()['status'] == 200, 'status idle timeout 2'
2611606Szelenkov@nginx.com
262730Szelenkov@nginx.com    def test_settings_max_body_size(self):
263730Szelenkov@nginx.com        self.load('empty')
264730Szelenkov@nginx.com
2651878Szelenkov@nginx.com        assert 'success' in self.conf(
2661878Szelenkov@nginx.com            {'http': {'max_body_size': 5}}, 'settings'
2671878Szelenkov@nginx.com        )
268730Szelenkov@nginx.com
2691596Szelenkov@nginx.com        assert self.post(body='01234')['status'] == 200, 'status size'
2701596Szelenkov@nginx.com        assert self.post(body='012345')['status'] == 413, 'status size max'
271730Szelenkov@nginx.com
2721365Szelenkov@nginx.com    def test_settings_max_body_size_large(self):
2731365Szelenkov@nginx.com        self.load('mirror')
2741365Szelenkov@nginx.com
2751878Szelenkov@nginx.com        assert 'success' in self.conf(
2761878Szelenkov@nginx.com            {'http': {'max_body_size': 32 * 1024 * 1024}}, 'settings'
2771878Szelenkov@nginx.com        )
2781365Szelenkov@nginx.com
2791365Szelenkov@nginx.com        body = '0123456789abcdef' * 4 * 64 * 1024
2801365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2811596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 4'
2821596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 4'
2831365Szelenkov@nginx.com
2841365Szelenkov@nginx.com        body = '0123456789abcdef' * 8 * 64 * 1024
2851365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2861596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 8'
2871596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 8'
2881365Szelenkov@nginx.com
2891365Szelenkov@nginx.com        body = '0123456789abcdef' * 16 * 64 * 1024
2901365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2911596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 16'
2921596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 16'
2931365Szelenkov@nginx.com
2941365Szelenkov@nginx.com        body = '0123456789abcdef' * 32 * 64 * 1024
2951365Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
2961596Szelenkov@nginx.com        assert resp['status'] == 200, 'status size 32'
2971596Szelenkov@nginx.com        assert resp['body'] == body, 'status body 32'
2981365Szelenkov@nginx.com
2991596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
300730Szelenkov@nginx.com    def test_settings_negative_value(self):
3011596Szelenkov@nginx.com        assert 'error' in self.conf(
3021596Szelenkov@nginx.com            {'http': {'max_body_size': -1}}, 'settings'
3031596Szelenkov@nginx.com        ), 'settings negative value'
3041702Szelenkov@nginx.com
3051702Szelenkov@nginx.com    def test_settings_body_buffer_size(self):
3061702Szelenkov@nginx.com        self.load('mirror')
3071702Szelenkov@nginx.com
3081702Szelenkov@nginx.com        assert 'success' in self.conf(
3091702Szelenkov@nginx.com            {
3101702Szelenkov@nginx.com                'http': {
3111702Szelenkov@nginx.com                    'max_body_size': 64 * 1024 * 1024,
3121702Szelenkov@nginx.com                    'body_buffer_size': 32 * 1024 * 1024,
3131702Szelenkov@nginx.com                }
3141702Szelenkov@nginx.com            },
3151702Szelenkov@nginx.com            'settings',
3161702Szelenkov@nginx.com        )
3171702Szelenkov@nginx.com
3181702Szelenkov@nginx.com        body = '0123456789abcdef'
3191702Szelenkov@nginx.com        resp = self.post(body=body)
3201702Szelenkov@nginx.com        assert bool(resp), 'response from application'
3211702Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
3221702Szelenkov@nginx.com        assert resp['body'] == body, 'body'
3231702Szelenkov@nginx.com
3241702Szelenkov@nginx.com        body = '0123456789abcdef' * 1024 * 1024
3251702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
3261702Szelenkov@nginx.com        assert bool(resp), 'response from application 2'
3271702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 2'
3281702Szelenkov@nginx.com        assert resp['body'] == body, 'body 2'
3291702Szelenkov@nginx.com
3301702Szelenkov@nginx.com        body = '0123456789abcdef' * 2 * 1024 * 1024
3311702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
3321702Szelenkov@nginx.com        assert bool(resp), 'response from application 3'
3331702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 3'
3341702Szelenkov@nginx.com        assert resp['body'] == body, 'body 3'
3351702Szelenkov@nginx.com
3361702Szelenkov@nginx.com        body = '0123456789abcdef' * 3 * 1024 * 1024
3371702Szelenkov@nginx.com        resp = self.post(body=body, read_buffer_size=1024 * 1024)
3381702Szelenkov@nginx.com        assert bool(resp), 'response from application 4'
3391702Szelenkov@nginx.com        assert resp['status'] == 200, 'status 4'
3401702Szelenkov@nginx.com        assert resp['body'] == body, 'body 4'
341