1899Szelenkov@nginx.comimport time
2484Szelenkov@nginx.comimport unittest
31019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
4484Szelenkov@nginx.com
51017Szelenkov@nginx.com
61019Szelenkov@nginx.comclass TestPythonApplication(TestApplicationPython):
71025Szelenkov@nginx.com    prerequisites = ['python']
8484Szelenkov@nginx.com
9552Szelenkov@nginx.com    def test_python_application_variables(self):
10552Szelenkov@nginx.com        self.load('variables')
11484Szelenkov@nginx.com
12484Szelenkov@nginx.com        body = 'Test body string.'
13484Szelenkov@nginx.com
141017Szelenkov@nginx.com        resp = self.post(
151017Szelenkov@nginx.com            headers={
161017Szelenkov@nginx.com                'Host': 'localhost',
171017Szelenkov@nginx.com                'Content-Type': 'text/html',
181017Szelenkov@nginx.com                'Custom-Header': 'blah',
191017Szelenkov@nginx.com                'Connection': 'close',
201017Szelenkov@nginx.com            },
211017Szelenkov@nginx.com            body=body,
221017Szelenkov@nginx.com        )
23484Szelenkov@nginx.com
24505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
25505Szelenkov@nginx.com        headers = resp['headers']
26674Szelenkov@nginx.com        header_server = headers.pop('Server')
27674Szelenkov@nginx.com        self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header')
281017Szelenkov@nginx.com        self.assertEqual(
291017Szelenkov@nginx.com            headers.pop('Server-Software'),
301017Szelenkov@nginx.com            header_server,
311017Szelenkov@nginx.com            'server software header',
321017Szelenkov@nginx.com        )
33599Szelenkov@nginx.com
34599Szelenkov@nginx.com        date = headers.pop('Date')
35599Szelenkov@nginx.com        self.assertEqual(date[-4:], ' GMT', 'date header timezone')
361017Szelenkov@nginx.com        self.assertLess(
371017Szelenkov@nginx.com            abs(self.date_to_sec_epoch(date) - self.sec_epoch()),
381017Szelenkov@nginx.com            5,
391017Szelenkov@nginx.com            'date header',
401017Szelenkov@nginx.com        )
41599Szelenkov@nginx.com
421017Szelenkov@nginx.com        self.assertDictEqual(
431017Szelenkov@nginx.com            headers,
441017Szelenkov@nginx.com            {
451017Szelenkov@nginx.com                'Connection': 'close',
461017Szelenkov@nginx.com                'Content-Length': str(len(body)),
471017Szelenkov@nginx.com                'Content-Type': 'text/html',
481017Szelenkov@nginx.com                'Request-Method': 'POST',
491017Szelenkov@nginx.com                'Request-Uri': '/',
501017Szelenkov@nginx.com                'Http-Host': 'localhost',
511017Szelenkov@nginx.com                'Server-Protocol': 'HTTP/1.1',
521017Szelenkov@nginx.com                'Custom-Header': 'blah',
531017Szelenkov@nginx.com                'Wsgi-Version': '(1, 0)',
541017Szelenkov@nginx.com                'Wsgi-Url-Scheme': 'http',
551017Szelenkov@nginx.com                'Wsgi-Multithread': 'False',
561017Szelenkov@nginx.com                'Wsgi-Multiprocess': 'True',
571017Szelenkov@nginx.com                'Wsgi-Run-Once': 'False',
581017Szelenkov@nginx.com            },
591017Szelenkov@nginx.com            'headers',
601017Szelenkov@nginx.com        )
61505Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
62484Szelenkov@nginx.com
63497Szelenkov@nginx.com    def test_python_application_query_string(self):
64552Szelenkov@nginx.com        self.load('query_string')
65497Szelenkov@nginx.com
66505Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
67497Szelenkov@nginx.com
681017Szelenkov@nginx.com        self.assertEqual(
691017Szelenkov@nginx.com            resp['headers']['Query-String'],
701017Szelenkov@nginx.com            'var1=val1&var2=val2',
711017Szelenkov@nginx.com            'Query-String header',
721017Szelenkov@nginx.com        )
73497Szelenkov@nginx.com
74894Szelenkov@nginx.com    def test_python_application_query_string_empty(self):
75894Szelenkov@nginx.com        self.load('query_string')
76894Szelenkov@nginx.com
77894Szelenkov@nginx.com        resp = self.get(url='/?')
78894Szelenkov@nginx.com
79894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string empty status')
801017Szelenkov@nginx.com        self.assertEqual(
811017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string empty'
821017Szelenkov@nginx.com        )
83894Szelenkov@nginx.com
84894Szelenkov@nginx.com    def test_python_application_query_string_absent(self):
85894Szelenkov@nginx.com        self.load('query_string')
86894Szelenkov@nginx.com
87894Szelenkov@nginx.com        resp = self.get()
88894Szelenkov@nginx.com
89894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string absent status')
901017Szelenkov@nginx.com        self.assertEqual(
911017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string absent'
921017Szelenkov@nginx.com        )
93894Szelenkov@nginx.com
94495Szelenkov@nginx.com    @unittest.expectedFailure
95495Szelenkov@nginx.com    def test_python_application_server_port(self):
96552Szelenkov@nginx.com        self.load('server_port')
97495Szelenkov@nginx.com
981017Szelenkov@nginx.com        self.assertEqual(
991017Szelenkov@nginx.com            self.get()['headers']['Server-Port'], '7080', 'Server-Port header'
1001017Szelenkov@nginx.com        )
101484Szelenkov@nginx.com
102496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
103552Szelenkov@nginx.com        self.load('204_no_content')
104496Szelenkov@nginx.com
1051017Szelenkov@nginx.com        self.assertNotIn(
1061017Szelenkov@nginx.com            'Transfer-Encoding',
1071017Szelenkov@nginx.com            self.get()['headers'],
1081017Szelenkov@nginx.com            '204 header transfer encoding',
1091017Szelenkov@nginx.com        )
110484Szelenkov@nginx.com
111602Szelenkov@nginx.com    def test_python_application_ctx_iter_atexit(self):
112602Szelenkov@nginx.com        self.load('ctx_iter_atexit')
113602Szelenkov@nginx.com
1141017Szelenkov@nginx.com        resp = self.post(
1151017Szelenkov@nginx.com            headers={
1161017Szelenkov@nginx.com                'Host': 'localhost',
1171017Szelenkov@nginx.com                'Connection': 'close',
1181017Szelenkov@nginx.com                'Content-Type': 'text/html',
1191017Szelenkov@nginx.com            },
1201017Szelenkov@nginx.com            body='0123456789',
1211017Szelenkov@nginx.com        )
122602Szelenkov@nginx.com
123602Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'ctx iter status')
124602Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'ctx iter body')
125602Szelenkov@nginx.com
1261017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
127602Szelenkov@nginx.com
128602Szelenkov@nginx.com        self.stop()
129602Szelenkov@nginx.com
1301017Szelenkov@nginx.com        self.assertIsNotNone(
131*1028Szelenkov@nginx.com            self.wait_for_record(r'RuntimeError'), 'ctx iter atexit'
1321017Szelenkov@nginx.com        )
133602Szelenkov@nginx.com
134603Szelenkov@nginx.com    def test_python_keepalive_body(self):
135603Szelenkov@nginx.com        self.load('mirror')
136603Szelenkov@nginx.com
1371017Szelenkov@nginx.com        (resp, sock) = self.post(
1381017Szelenkov@nginx.com            headers={
1391017Szelenkov@nginx.com                'Host': 'localhost',
1401017Szelenkov@nginx.com                'Connection': 'keep-alive',
1411017Szelenkov@nginx.com                'Content-Type': 'text/html',
1421017Szelenkov@nginx.com            },
1431017Szelenkov@nginx.com            start=True,
1441017Szelenkov@nginx.com            body='0123456789' * 500,
1451017Szelenkov@nginx.com        )
146603Szelenkov@nginx.com
147603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')
148603Szelenkov@nginx.com
1491017Szelenkov@nginx.com        resp = self.post(
1501017Szelenkov@nginx.com            headers={
1511017Szelenkov@nginx.com                'Host': 'localhost',
1521017Szelenkov@nginx.com                'Connection': 'close',
1531017Szelenkov@nginx.com                'Content-Type': 'text/html',
1541017Szelenkov@nginx.com            },
1551017Szelenkov@nginx.com            sock=sock,
1561017Szelenkov@nginx.com            body='0123456789',
1571017Szelenkov@nginx.com        )
158603Szelenkov@nginx.com
159603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')
160603Szelenkov@nginx.com
161684Szelenkov@nginx.com    def test_python_keepalive_reconfigure(self):
1621017Szelenkov@nginx.com        self.skip_alerts.extend(
1631017Szelenkov@nginx.com            [
1641017Szelenkov@nginx.com                r'pthread_mutex.+failed',
1651017Szelenkov@nginx.com                r'failed to apply',
1661017Szelenkov@nginx.com                r'process \d+ exited on signal',
1671017Szelenkov@nginx.com            ]
1681017Szelenkov@nginx.com        )
169684Szelenkov@nginx.com        self.load('mirror')
170684Szelenkov@nginx.com
171684Szelenkov@nginx.com        body = '0123456789'
172684Szelenkov@nginx.com        conns = 3
173684Szelenkov@nginx.com        socks = []
174684Szelenkov@nginx.com
175684Szelenkov@nginx.com        for i in range(conns):
1761017Szelenkov@nginx.com            (resp, sock) = self.post(
1771017Szelenkov@nginx.com                headers={
1781017Szelenkov@nginx.com                    'Host': 'localhost',
1791017Szelenkov@nginx.com                    'Connection': 'keep-alive',
1801017Szelenkov@nginx.com                    'Content-Type': 'text/html',
1811017Szelenkov@nginx.com                },
1821017Szelenkov@nginx.com                start=True,
1831017Szelenkov@nginx.com                body=body,
1841017Szelenkov@nginx.com            )
185684Szelenkov@nginx.com
186684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive open')
1871017Szelenkov@nginx.com            self.assertIn(
1881017Szelenkov@nginx.com                'success',
1891026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
1901017Szelenkov@nginx.com                'reconfigure',
1911017Szelenkov@nginx.com            )
192684Szelenkov@nginx.com
193684Szelenkov@nginx.com            socks.append(sock)
194684Szelenkov@nginx.com
195684Szelenkov@nginx.com        for i in range(conns):
1961017Szelenkov@nginx.com            (resp, sock) = self.post(
1971017Szelenkov@nginx.com                headers={
1981017Szelenkov@nginx.com                    'Host': 'localhost',
1991017Szelenkov@nginx.com                    'Connection': 'keep-alive',
2001017Szelenkov@nginx.com                    'Content-Type': 'text/html',
2011017Szelenkov@nginx.com                },
2021017Szelenkov@nginx.com                start=True,
2031017Szelenkov@nginx.com                sock=socks[i],
2041017Szelenkov@nginx.com                body=body,
2051017Szelenkov@nginx.com            )
206684Szelenkov@nginx.com
207684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive request')
2081017Szelenkov@nginx.com            self.assertIn(
2091017Szelenkov@nginx.com                'success',
2101026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
2111017Szelenkov@nginx.com                'reconfigure 2',
2121017Szelenkov@nginx.com            )
213684Szelenkov@nginx.com
214684Szelenkov@nginx.com        for i in range(conns):
2151017Szelenkov@nginx.com            resp = self.post(
2161017Szelenkov@nginx.com                headers={
2171017Szelenkov@nginx.com                    'Host': 'localhost',
2181017Szelenkov@nginx.com                    'Connection': 'close',
2191017Szelenkov@nginx.com                    'Content-Type': 'text/html',
2201017Szelenkov@nginx.com                },
2211017Szelenkov@nginx.com                sock=socks[i],
2221017Szelenkov@nginx.com                body=body,
2231017Szelenkov@nginx.com            )
224684Szelenkov@nginx.com
225684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive close')
2261017Szelenkov@nginx.com            self.assertIn(
2271017Szelenkov@nginx.com                'success',
2281026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
2291017Szelenkov@nginx.com                'reconfigure 3',
2301017Szelenkov@nginx.com            )
231684Szelenkov@nginx.com
232750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_2(self):
233750Szelenkov@nginx.com        self.load('mirror')
234750Szelenkov@nginx.com
235750Szelenkov@nginx.com        body = '0123456789'
236750Szelenkov@nginx.com
2371017Szelenkov@nginx.com        (resp, sock) = self.post(
2381017Szelenkov@nginx.com            headers={
2391017Szelenkov@nginx.com                'Host': 'localhost',
2401017Szelenkov@nginx.com                'Connection': 'keep-alive',
2411017Szelenkov@nginx.com                'Content-Type': 'text/html',
2421017Szelenkov@nginx.com            },
2431017Szelenkov@nginx.com            start=True,
2441017Szelenkov@nginx.com            body=body,
2451017Szelenkov@nginx.com        )
246750Szelenkov@nginx.com
247750Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1')
248750Szelenkov@nginx.com
249750Szelenkov@nginx.com        self.load('empty')
250750Szelenkov@nginx.com
2511017Szelenkov@nginx.com        (resp, sock) = self.post(
2521017Szelenkov@nginx.com            headers={
2531017Szelenkov@nginx.com                'Host': 'localhost',
2541017Szelenkov@nginx.com                'Connection': 'close',
2551017Szelenkov@nginx.com                'Content-Type': 'text/html',
2561017Szelenkov@nginx.com            },
2571017Szelenkov@nginx.com            start=True,
2581017Szelenkov@nginx.com            sock=sock,
2591017Szelenkov@nginx.com            body=body,
2601017Szelenkov@nginx.com        )
261750Szelenkov@nginx.com
262750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2')
263750Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body')
264750Szelenkov@nginx.com
2651017Szelenkov@nginx.com        self.assertIn(
2661017Szelenkov@nginx.com            'success',
2671017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
2681017Szelenkov@nginx.com            'reconfigure 2 clear configuration',
2691017Szelenkov@nginx.com        )
270750Szelenkov@nginx.com
271750Szelenkov@nginx.com        resp = self.get(sock=sock)
272750Szelenkov@nginx.com
273750Szelenkov@nginx.com        self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3')
274750Szelenkov@nginx.com
275750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_3(self):
276750Szelenkov@nginx.com        self.load('empty')
277750Szelenkov@nginx.com
2781017Szelenkov@nginx.com        (resp, sock) = self.http(
2791017Szelenkov@nginx.com            b"""GET / HTTP/1.1
2801017Szelenkov@nginx.com""",
2811017Szelenkov@nginx.com            start=True,
2821017Szelenkov@nginx.com            raw=True,
2831017Szelenkov@nginx.com        )
284750Szelenkov@nginx.com
2851017Szelenkov@nginx.com        self.assertIn(
2861017Szelenkov@nginx.com            'success',
2871017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
2881017Szelenkov@nginx.com            'reconfigure 3 clear configuration',
2891017Szelenkov@nginx.com        )
290750Szelenkov@nginx.com
2911017Szelenkov@nginx.com        resp = self.http(
2921017Szelenkov@nginx.com            b"""Host: localhost
293750Szelenkov@nginx.comConnection: close
294750Szelenkov@nginx.com
2951017Szelenkov@nginx.com""",
2961017Szelenkov@nginx.com            sock=sock,
2971017Szelenkov@nginx.com            raw=True,
2981017Szelenkov@nginx.com        )
299750Szelenkov@nginx.com
300750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 3')
301750Szelenkov@nginx.com
302603Szelenkov@nginx.com    def test_python_atexit(self):
303603Szelenkov@nginx.com        self.load('atexit')
304603Szelenkov@nginx.com
305603Szelenkov@nginx.com        self.get()
306603Szelenkov@nginx.com
3071017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
308603Szelenkov@nginx.com
309603Szelenkov@nginx.com        self.stop()
310603Szelenkov@nginx.com
311*1028Szelenkov@nginx.com        self.assertIsNotNone(
312*1028Szelenkov@nginx.com            self.wait_for_record(r'At exit called\.'), 'atexit'
313*1028Szelenkov@nginx.com        )
314603Szelenkov@nginx.com
315603Szelenkov@nginx.com    @unittest.expectedFailure
316603Szelenkov@nginx.com    def test_python_application_start_response_exit(self):
317603Szelenkov@nginx.com        self.load('start_response_exit')
318603Szelenkov@nginx.com
319603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'start response exit')
320603Szelenkov@nginx.com
321603Szelenkov@nginx.com    @unittest.expectedFailure
322603Szelenkov@nginx.com    def test_python_application_input_iter(self):
323603Szelenkov@nginx.com        self.load('input_iter')
324603Szelenkov@nginx.com
325603Szelenkov@nginx.com        body = '0123456789'
326603Szelenkov@nginx.com
327603Szelenkov@nginx.com        self.assertEqual(self.post(body=body)['body'], body, 'input iter')
328603Szelenkov@nginx.com
329603Szelenkov@nginx.com    def test_python_application_input_read_length(self):
330603Szelenkov@nginx.com        self.load('input_read_length')
331603Szelenkov@nginx.com
332603Szelenkov@nginx.com        body = '0123456789'
333603Szelenkov@nginx.com
3341017Szelenkov@nginx.com        resp = self.post(
3351017Szelenkov@nginx.com            headers={
3361017Szelenkov@nginx.com                'Host': 'localhost',
3371017Szelenkov@nginx.com                'Input-Length': '5',
3381017Szelenkov@nginx.com                'Connection': 'close',
3391017Szelenkov@nginx.com            },
3401017Szelenkov@nginx.com            body=body,
3411017Szelenkov@nginx.com        )
342603Szelenkov@nginx.com
343603Szelenkov@nginx.com        self.assertEqual(resp['body'], body[:5], 'input read length lt body')
344603Szelenkov@nginx.com
3451017Szelenkov@nginx.com        resp = self.post(
3461017Szelenkov@nginx.com            headers={
3471017Szelenkov@nginx.com                'Host': 'localhost',
3481017Szelenkov@nginx.com                'Input-Length': '15',
3491017Szelenkov@nginx.com                'Connection': 'close',
3501017Szelenkov@nginx.com            },
3511017Szelenkov@nginx.com            body=body,
3521017Szelenkov@nginx.com        )
353603Szelenkov@nginx.com
354603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length gt body')
355603Szelenkov@nginx.com
3561017Szelenkov@nginx.com        resp = self.post(
3571017Szelenkov@nginx.com            headers={
3581017Szelenkov@nginx.com                'Host': 'localhost',
3591017Szelenkov@nginx.com                'Input-Length': '0',
3601017Szelenkov@nginx.com                'Connection': 'close',
3611017Szelenkov@nginx.com            },
3621017Szelenkov@nginx.com            body=body,
3631017Szelenkov@nginx.com        )
364603Szelenkov@nginx.com
365603Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'input read length zero')
366603Szelenkov@nginx.com
3671017Szelenkov@nginx.com        resp = self.post(
3681017Szelenkov@nginx.com            headers={
3691017Szelenkov@nginx.com                'Host': 'localhost',
3701017Szelenkov@nginx.com                'Input-Length': '-1',
3711017Szelenkov@nginx.com                'Connection': 'close',
3721017Szelenkov@nginx.com            },
3731017Szelenkov@nginx.com            body=body,
3741017Szelenkov@nginx.com        )
375603Szelenkov@nginx.com
376603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length negative')
377603Szelenkov@nginx.com
378603Szelenkov@nginx.com    @unittest.expectedFailure
379603Szelenkov@nginx.com    def test_python_application_errors_write(self):
380603Szelenkov@nginx.com        self.load('errors_write')
381603Szelenkov@nginx.com
382603Szelenkov@nginx.com        self.get()
383603Szelenkov@nginx.com
384603Szelenkov@nginx.com        self.stop()
385603Szelenkov@nginx.com
386603Szelenkov@nginx.com        self.assertIsNotNone(
387*1028Szelenkov@nginx.com            self.wait_for_record(r'\[error\].+Error in application\.'),
3881017Szelenkov@nginx.com            'errors write',
3891017Szelenkov@nginx.com        )
390603Szelenkov@nginx.com
391603Szelenkov@nginx.com    def test_python_application_body_array(self):
392603Szelenkov@nginx.com        self.load('body_array')
393603Szelenkov@nginx.com
394603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body array')
395603Szelenkov@nginx.com
396603Szelenkov@nginx.com    def test_python_application_body_io(self):
397603Szelenkov@nginx.com        self.load('body_io')
398603Szelenkov@nginx.com
399603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body io')
400603Szelenkov@nginx.com
401603Szelenkov@nginx.com    def test_python_application_body_io_file(self):
402603Szelenkov@nginx.com        self.load('body_io_file')
403603Szelenkov@nginx.com
404603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], 'body\n', 'body io file')
405603Szelenkov@nginx.com
406603Szelenkov@nginx.com    @unittest.expectedFailure
407603Szelenkov@nginx.com    def test_python_application_syntax_error(self):
408603Szelenkov@nginx.com        self.skip_alerts.append(r'Python failed to import module "wsgi"')
409603Szelenkov@nginx.com        self.load('syntax_error')
410603Szelenkov@nginx.com
411603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'syntax error')
412603Szelenkov@nginx.com
413603Szelenkov@nginx.com    def test_python_application_close(self):
414603Szelenkov@nginx.com        self.load('close')
415603Szelenkov@nginx.com
416603Szelenkov@nginx.com        self.get()
417603Szelenkov@nginx.com
418603Szelenkov@nginx.com        self.stop()
419603Szelenkov@nginx.com
420*1028Szelenkov@nginx.com        self.assertIsNotNone(self.wait_for_record(r'Close called\.'), 'close')
421603Szelenkov@nginx.com
422603Szelenkov@nginx.com    def test_python_application_close_error(self):
423603Szelenkov@nginx.com        self.load('close_error')
424603Szelenkov@nginx.com
425603Szelenkov@nginx.com        self.get()
426603Szelenkov@nginx.com
427603Szelenkov@nginx.com        self.stop()
428603Szelenkov@nginx.com
4291017Szelenkov@nginx.com        self.assertIsNotNone(
430*1028Szelenkov@nginx.com            self.wait_for_record(r'Close called\.'), 'close error'
4311017Szelenkov@nginx.com        )
432603Szelenkov@nginx.com
433617Szelenkov@nginx.com    def test_python_application_not_iterable(self):
434617Szelenkov@nginx.com        self.load('not_iterable')
435617Szelenkov@nginx.com
436665Szelenkov@nginx.com        self.get()
437617Szelenkov@nginx.com
438617Szelenkov@nginx.com        self.stop()
439617Szelenkov@nginx.com
4401017Szelenkov@nginx.com        self.assertIsNotNone(
441*1028Szelenkov@nginx.com            self.wait_for_record(
4421017Szelenkov@nginx.com                r'\[error\].+the application returned not an iterable object'
4431017Szelenkov@nginx.com            ),
4441017Szelenkov@nginx.com            'not iterable',
4451017Szelenkov@nginx.com        )
446617Szelenkov@nginx.com
447664Szelenkov@nginx.com    def test_python_application_write(self):
448664Szelenkov@nginx.com        self.load('write')
449664Szelenkov@nginx.com
450664Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'write')
451664Szelenkov@nginx.com
4521017Szelenkov@nginx.com
453484Szelenkov@nginx.comif __name__ == '__main__':
4541019Szelenkov@nginx.com    TestPythonApplication.main()
455