1899Szelenkov@nginx.comimport time
2484Szelenkov@nginx.comimport unittest
3484Szelenkov@nginx.comimport unit
4484Szelenkov@nginx.com
5*1017Szelenkov@nginx.com
6552Szelenkov@nginx.comclass TestUnitPythonApplication(unit.TestUnitApplicationPython):
7484Szelenkov@nginx.com    def setUpClass():
8550Szelenkov@nginx.com        unit.TestUnit().check_modules('python')
9484Szelenkov@nginx.com
10552Szelenkov@nginx.com    def test_python_application_variables(self):
11552Szelenkov@nginx.com        self.load('variables')
12484Szelenkov@nginx.com
13484Szelenkov@nginx.com        body = 'Test body string.'
14484Szelenkov@nginx.com
15*1017Szelenkov@nginx.com        resp = self.post(
16*1017Szelenkov@nginx.com            headers={
17*1017Szelenkov@nginx.com                'Host': 'localhost',
18*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
19*1017Szelenkov@nginx.com                'Custom-Header': 'blah',
20*1017Szelenkov@nginx.com                'Connection': 'close',
21*1017Szelenkov@nginx.com            },
22*1017Szelenkov@nginx.com            body=body,
23*1017Szelenkov@nginx.com        )
24484Szelenkov@nginx.com
25505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
26505Szelenkov@nginx.com        headers = resp['headers']
27674Szelenkov@nginx.com        header_server = headers.pop('Server')
28674Szelenkov@nginx.com        self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header')
29*1017Szelenkov@nginx.com        self.assertEqual(
30*1017Szelenkov@nginx.com            headers.pop('Server-Software'),
31*1017Szelenkov@nginx.com            header_server,
32*1017Szelenkov@nginx.com            'server software header',
33*1017Szelenkov@nginx.com        )
34599Szelenkov@nginx.com
35599Szelenkov@nginx.com        date = headers.pop('Date')
36599Szelenkov@nginx.com        self.assertEqual(date[-4:], ' GMT', 'date header timezone')
37*1017Szelenkov@nginx.com        self.assertLess(
38*1017Szelenkov@nginx.com            abs(self.date_to_sec_epoch(date) - self.sec_epoch()),
39*1017Szelenkov@nginx.com            5,
40*1017Szelenkov@nginx.com            'date header',
41*1017Szelenkov@nginx.com        )
42599Szelenkov@nginx.com
43*1017Szelenkov@nginx.com        self.assertDictEqual(
44*1017Szelenkov@nginx.com            headers,
45*1017Szelenkov@nginx.com            {
46*1017Szelenkov@nginx.com                'Connection': 'close',
47*1017Szelenkov@nginx.com                'Content-Length': str(len(body)),
48*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
49*1017Szelenkov@nginx.com                'Request-Method': 'POST',
50*1017Szelenkov@nginx.com                'Request-Uri': '/',
51*1017Szelenkov@nginx.com                'Http-Host': 'localhost',
52*1017Szelenkov@nginx.com                'Server-Protocol': 'HTTP/1.1',
53*1017Szelenkov@nginx.com                'Custom-Header': 'blah',
54*1017Szelenkov@nginx.com                'Wsgi-Version': '(1, 0)',
55*1017Szelenkov@nginx.com                'Wsgi-Url-Scheme': 'http',
56*1017Szelenkov@nginx.com                'Wsgi-Multithread': 'False',
57*1017Szelenkov@nginx.com                'Wsgi-Multiprocess': 'True',
58*1017Szelenkov@nginx.com                'Wsgi-Run-Once': 'False',
59*1017Szelenkov@nginx.com            },
60*1017Szelenkov@nginx.com            'headers',
61*1017Szelenkov@nginx.com        )
62505Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
63484Szelenkov@nginx.com
64497Szelenkov@nginx.com    def test_python_application_query_string(self):
65552Szelenkov@nginx.com        self.load('query_string')
66497Szelenkov@nginx.com
67505Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
68497Szelenkov@nginx.com
69*1017Szelenkov@nginx.com        self.assertEqual(
70*1017Szelenkov@nginx.com            resp['headers']['Query-String'],
71*1017Szelenkov@nginx.com            'var1=val1&var2=val2',
72*1017Szelenkov@nginx.com            'Query-String header',
73*1017Szelenkov@nginx.com        )
74497Szelenkov@nginx.com
75894Szelenkov@nginx.com    def test_python_application_query_string_empty(self):
76894Szelenkov@nginx.com        self.load('query_string')
77894Szelenkov@nginx.com
78894Szelenkov@nginx.com        resp = self.get(url='/?')
79894Szelenkov@nginx.com
80894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string empty status')
81*1017Szelenkov@nginx.com        self.assertEqual(
82*1017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string empty'
83*1017Szelenkov@nginx.com        )
84894Szelenkov@nginx.com
85894Szelenkov@nginx.com    def test_python_application_query_string_absent(self):
86894Szelenkov@nginx.com        self.load('query_string')
87894Szelenkov@nginx.com
88894Szelenkov@nginx.com        resp = self.get()
89894Szelenkov@nginx.com
90894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string absent status')
91*1017Szelenkov@nginx.com        self.assertEqual(
92*1017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string absent'
93*1017Szelenkov@nginx.com        )
94894Szelenkov@nginx.com
95495Szelenkov@nginx.com    @unittest.expectedFailure
96495Szelenkov@nginx.com    def test_python_application_server_port(self):
97552Szelenkov@nginx.com        self.load('server_port')
98495Szelenkov@nginx.com
99*1017Szelenkov@nginx.com        self.assertEqual(
100*1017Szelenkov@nginx.com            self.get()['headers']['Server-Port'], '7080', 'Server-Port header'
101*1017Szelenkov@nginx.com        )
102484Szelenkov@nginx.com
103496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
104552Szelenkov@nginx.com        self.load('204_no_content')
105496Szelenkov@nginx.com
106*1017Szelenkov@nginx.com        self.assertNotIn(
107*1017Szelenkov@nginx.com            'Transfer-Encoding',
108*1017Szelenkov@nginx.com            self.get()['headers'],
109*1017Szelenkov@nginx.com            '204 header transfer encoding',
110*1017Szelenkov@nginx.com        )
111484Szelenkov@nginx.com
112602Szelenkov@nginx.com    def test_python_application_ctx_iter_atexit(self):
113602Szelenkov@nginx.com        self.load('ctx_iter_atexit')
114602Szelenkov@nginx.com
115*1017Szelenkov@nginx.com        resp = self.post(
116*1017Szelenkov@nginx.com            headers={
117*1017Szelenkov@nginx.com                'Host': 'localhost',
118*1017Szelenkov@nginx.com                'Connection': 'close',
119*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
120*1017Szelenkov@nginx.com            },
121*1017Szelenkov@nginx.com            body='0123456789',
122*1017Szelenkov@nginx.com        )
123602Szelenkov@nginx.com
124602Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'ctx iter status')
125602Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'ctx iter body')
126602Szelenkov@nginx.com
127*1017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
128602Szelenkov@nginx.com
129602Szelenkov@nginx.com        self.stop()
130602Szelenkov@nginx.com
131899Szelenkov@nginx.com        time.sleep(0.2)
132899Szelenkov@nginx.com
133*1017Szelenkov@nginx.com        self.assertIsNotNone(
134*1017Szelenkov@nginx.com            self.search_in_log(r'RuntimeError'), 'ctx iter atexit'
135*1017Szelenkov@nginx.com        )
136602Szelenkov@nginx.com
137603Szelenkov@nginx.com    def test_python_keepalive_body(self):
138603Szelenkov@nginx.com        self.load('mirror')
139603Szelenkov@nginx.com
140*1017Szelenkov@nginx.com        (resp, sock) = self.post(
141*1017Szelenkov@nginx.com            headers={
142*1017Szelenkov@nginx.com                'Host': 'localhost',
143*1017Szelenkov@nginx.com                'Connection': 'keep-alive',
144*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
145*1017Szelenkov@nginx.com            },
146*1017Szelenkov@nginx.com            start=True,
147*1017Szelenkov@nginx.com            body='0123456789' * 500,
148*1017Szelenkov@nginx.com        )
149603Szelenkov@nginx.com
150603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')
151603Szelenkov@nginx.com
152*1017Szelenkov@nginx.com        resp = self.post(
153*1017Szelenkov@nginx.com            headers={
154*1017Szelenkov@nginx.com                'Host': 'localhost',
155*1017Szelenkov@nginx.com                'Connection': 'close',
156*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
157*1017Szelenkov@nginx.com            },
158*1017Szelenkov@nginx.com            sock=sock,
159*1017Szelenkov@nginx.com            body='0123456789',
160*1017Szelenkov@nginx.com        )
161603Szelenkov@nginx.com
162603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')
163603Szelenkov@nginx.com
164684Szelenkov@nginx.com    def test_python_keepalive_reconfigure(self):
165*1017Szelenkov@nginx.com        self.skip_alerts.extend(
166*1017Szelenkov@nginx.com            [
167*1017Szelenkov@nginx.com                r'pthread_mutex.+failed',
168*1017Szelenkov@nginx.com                r'failed to apply',
169*1017Szelenkov@nginx.com                r'process \d+ exited on signal',
170*1017Szelenkov@nginx.com            ]
171*1017Szelenkov@nginx.com        )
172684Szelenkov@nginx.com        self.load('mirror')
173684Szelenkov@nginx.com
174684Szelenkov@nginx.com        body = '0123456789'
175684Szelenkov@nginx.com        conns = 3
176684Szelenkov@nginx.com        socks = []
177684Szelenkov@nginx.com
178684Szelenkov@nginx.com        for i in range(conns):
179*1017Szelenkov@nginx.com            (resp, sock) = self.post(
180*1017Szelenkov@nginx.com                headers={
181*1017Szelenkov@nginx.com                    'Host': 'localhost',
182*1017Szelenkov@nginx.com                    'Connection': 'keep-alive',
183*1017Szelenkov@nginx.com                    'Content-Type': 'text/html',
184*1017Szelenkov@nginx.com                },
185*1017Szelenkov@nginx.com                start=True,
186*1017Szelenkov@nginx.com                body=body,
187*1017Szelenkov@nginx.com            )
188684Szelenkov@nginx.com
189684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive open')
190*1017Szelenkov@nginx.com            self.assertIn(
191*1017Szelenkov@nginx.com                'success',
192*1017Szelenkov@nginx.com                self.conf(
193*1017Szelenkov@nginx.com                    str(i + 1),
194*1017Szelenkov@nginx.com                    'applications/mirror/processes',
195*1017Szelenkov@nginx.com                ),
196*1017Szelenkov@nginx.com                'reconfigure',
197*1017Szelenkov@nginx.com            )
198684Szelenkov@nginx.com
199684Szelenkov@nginx.com            socks.append(sock)
200684Szelenkov@nginx.com
201684Szelenkov@nginx.com        for i in range(conns):
202*1017Szelenkov@nginx.com            (resp, sock) = self.post(
203*1017Szelenkov@nginx.com                headers={
204*1017Szelenkov@nginx.com                    'Host': 'localhost',
205*1017Szelenkov@nginx.com                    'Connection': 'keep-alive',
206*1017Szelenkov@nginx.com                    'Content-Type': 'text/html',
207*1017Szelenkov@nginx.com                },
208*1017Szelenkov@nginx.com                start=True,
209*1017Szelenkov@nginx.com                sock=socks[i],
210*1017Szelenkov@nginx.com                body=body,
211*1017Szelenkov@nginx.com            )
212684Szelenkov@nginx.com
213684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive request')
214*1017Szelenkov@nginx.com            self.assertIn(
215*1017Szelenkov@nginx.com                'success',
216*1017Szelenkov@nginx.com                self.conf(
217*1017Szelenkov@nginx.com                    str(i + 1),
218*1017Szelenkov@nginx.com                    'applications/mirror/processes',
219*1017Szelenkov@nginx.com                ),
220*1017Szelenkov@nginx.com                'reconfigure 2',
221*1017Szelenkov@nginx.com            )
222684Szelenkov@nginx.com
223684Szelenkov@nginx.com        for i in range(conns):
224*1017Szelenkov@nginx.com            resp = self.post(
225*1017Szelenkov@nginx.com                headers={
226*1017Szelenkov@nginx.com                    'Host': 'localhost',
227*1017Szelenkov@nginx.com                    'Connection': 'close',
228*1017Szelenkov@nginx.com                    'Content-Type': 'text/html',
229*1017Szelenkov@nginx.com                },
230*1017Szelenkov@nginx.com                sock=socks[i],
231*1017Szelenkov@nginx.com                body=body,
232*1017Szelenkov@nginx.com            )
233684Szelenkov@nginx.com
234684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive close')
235*1017Szelenkov@nginx.com            self.assertIn(
236*1017Szelenkov@nginx.com                'success',
237*1017Szelenkov@nginx.com                self.conf(
238*1017Szelenkov@nginx.com                    str(i + 1),
239*1017Szelenkov@nginx.com                    'applications/mirror/processes',
240*1017Szelenkov@nginx.com                ),
241*1017Szelenkov@nginx.com                'reconfigure 3',
242*1017Szelenkov@nginx.com            )
243684Szelenkov@nginx.com
244750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_2(self):
245750Szelenkov@nginx.com        self.load('mirror')
246750Szelenkov@nginx.com
247750Szelenkov@nginx.com        body = '0123456789'
248750Szelenkov@nginx.com
249*1017Szelenkov@nginx.com        (resp, sock) = self.post(
250*1017Szelenkov@nginx.com            headers={
251*1017Szelenkov@nginx.com                'Host': 'localhost',
252*1017Szelenkov@nginx.com                'Connection': 'keep-alive',
253*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
254*1017Szelenkov@nginx.com            },
255*1017Szelenkov@nginx.com            start=True,
256*1017Szelenkov@nginx.com            body=body,
257*1017Szelenkov@nginx.com        )
258750Szelenkov@nginx.com
259750Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1')
260750Szelenkov@nginx.com
261750Szelenkov@nginx.com        self.load('empty')
262750Szelenkov@nginx.com
263*1017Szelenkov@nginx.com        (resp, sock) = self.post(
264*1017Szelenkov@nginx.com            headers={
265*1017Szelenkov@nginx.com                'Host': 'localhost',
266*1017Szelenkov@nginx.com                'Connection': 'close',
267*1017Szelenkov@nginx.com                'Content-Type': 'text/html',
268*1017Szelenkov@nginx.com            },
269*1017Szelenkov@nginx.com            start=True,
270*1017Szelenkov@nginx.com            sock=sock,
271*1017Szelenkov@nginx.com            body=body,
272*1017Szelenkov@nginx.com        )
273750Szelenkov@nginx.com
274750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2')
275750Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body')
276750Szelenkov@nginx.com
277*1017Szelenkov@nginx.com        self.assertIn(
278*1017Szelenkov@nginx.com            'success',
279*1017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
280*1017Szelenkov@nginx.com            'reconfigure 2 clear configuration',
281*1017Szelenkov@nginx.com        )
282750Szelenkov@nginx.com
283750Szelenkov@nginx.com        resp = self.get(sock=sock)
284750Szelenkov@nginx.com
285750Szelenkov@nginx.com        self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3')
286750Szelenkov@nginx.com
287750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_3(self):
288750Szelenkov@nginx.com        self.load('empty')
289750Szelenkov@nginx.com
290*1017Szelenkov@nginx.com        (resp, sock) = self.http(
291*1017Szelenkov@nginx.com            b"""GET / HTTP/1.1
292*1017Szelenkov@nginx.com""",
293*1017Szelenkov@nginx.com            start=True,
294*1017Szelenkov@nginx.com            raw=True,
295*1017Szelenkov@nginx.com        )
296750Szelenkov@nginx.com
297*1017Szelenkov@nginx.com        self.assertIn(
298*1017Szelenkov@nginx.com            'success',
299*1017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
300*1017Szelenkov@nginx.com            'reconfigure 3 clear configuration',
301*1017Szelenkov@nginx.com        )
302750Szelenkov@nginx.com
303*1017Szelenkov@nginx.com        resp = self.http(
304*1017Szelenkov@nginx.com            b"""Host: localhost
305750Szelenkov@nginx.comConnection: close
306750Szelenkov@nginx.com
307*1017Szelenkov@nginx.com""",
308*1017Szelenkov@nginx.com            sock=sock,
309*1017Szelenkov@nginx.com            raw=True,
310*1017Szelenkov@nginx.com        )
311750Szelenkov@nginx.com
312750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 3')
313750Szelenkov@nginx.com
314603Szelenkov@nginx.com    def test_python_atexit(self):
315603Szelenkov@nginx.com        self.load('atexit')
316603Szelenkov@nginx.com
317603Szelenkov@nginx.com        self.get()
318603Szelenkov@nginx.com
319*1017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
320603Szelenkov@nginx.com
321603Szelenkov@nginx.com        self.stop()
322603Szelenkov@nginx.com
323603Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'At exit called\.'), 'atexit')
324603Szelenkov@nginx.com
325603Szelenkov@nginx.com    @unittest.expectedFailure
326603Szelenkov@nginx.com    def test_python_application_start_response_exit(self):
327603Szelenkov@nginx.com        self.load('start_response_exit')
328603Szelenkov@nginx.com
329603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'start response exit')
330603Szelenkov@nginx.com
331603Szelenkov@nginx.com    @unittest.expectedFailure
332603Szelenkov@nginx.com    def test_python_application_input_iter(self):
333603Szelenkov@nginx.com        self.load('input_iter')
334603Szelenkov@nginx.com
335603Szelenkov@nginx.com        body = '0123456789'
336603Szelenkov@nginx.com
337603Szelenkov@nginx.com        self.assertEqual(self.post(body=body)['body'], body, 'input iter')
338603Szelenkov@nginx.com
339603Szelenkov@nginx.com    def test_python_application_input_read_length(self):
340603Szelenkov@nginx.com        self.load('input_read_length')
341603Szelenkov@nginx.com
342603Szelenkov@nginx.com        body = '0123456789'
343603Szelenkov@nginx.com
344*1017Szelenkov@nginx.com        resp = self.post(
345*1017Szelenkov@nginx.com            headers={
346*1017Szelenkov@nginx.com                'Host': 'localhost',
347*1017Szelenkov@nginx.com                'Input-Length': '5',
348*1017Szelenkov@nginx.com                'Connection': 'close',
349*1017Szelenkov@nginx.com            },
350*1017Szelenkov@nginx.com            body=body,
351*1017Szelenkov@nginx.com        )
352603Szelenkov@nginx.com
353603Szelenkov@nginx.com        self.assertEqual(resp['body'], body[:5], 'input read length lt body')
354603Szelenkov@nginx.com
355*1017Szelenkov@nginx.com        resp = self.post(
356*1017Szelenkov@nginx.com            headers={
357*1017Szelenkov@nginx.com                'Host': 'localhost',
358*1017Szelenkov@nginx.com                'Input-Length': '15',
359*1017Szelenkov@nginx.com                'Connection': 'close',
360*1017Szelenkov@nginx.com            },
361*1017Szelenkov@nginx.com            body=body,
362*1017Szelenkov@nginx.com        )
363603Szelenkov@nginx.com
364603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length gt body')
365603Szelenkov@nginx.com
366*1017Szelenkov@nginx.com        resp = self.post(
367*1017Szelenkov@nginx.com            headers={
368*1017Szelenkov@nginx.com                'Host': 'localhost',
369*1017Szelenkov@nginx.com                'Input-Length': '0',
370*1017Szelenkov@nginx.com                'Connection': 'close',
371*1017Szelenkov@nginx.com            },
372*1017Szelenkov@nginx.com            body=body,
373*1017Szelenkov@nginx.com        )
374603Szelenkov@nginx.com
375603Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'input read length zero')
376603Szelenkov@nginx.com
377*1017Szelenkov@nginx.com        resp = self.post(
378*1017Szelenkov@nginx.com            headers={
379*1017Szelenkov@nginx.com                'Host': 'localhost',
380*1017Szelenkov@nginx.com                'Input-Length': '-1',
381*1017Szelenkov@nginx.com                'Connection': 'close',
382*1017Szelenkov@nginx.com            },
383*1017Szelenkov@nginx.com            body=body,
384*1017Szelenkov@nginx.com        )
385603Szelenkov@nginx.com
386603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length negative')
387603Szelenkov@nginx.com
388603Szelenkov@nginx.com    @unittest.expectedFailure
389603Szelenkov@nginx.com    def test_python_application_errors_write(self):
390603Szelenkov@nginx.com        self.load('errors_write')
391603Szelenkov@nginx.com
392603Szelenkov@nginx.com        self.get()
393603Szelenkov@nginx.com
394603Szelenkov@nginx.com        self.stop()
395603Szelenkov@nginx.com
396603Szelenkov@nginx.com        self.assertIsNotNone(
397603Szelenkov@nginx.com            self.search_in_log(r'\[error\].+Error in application\.'),
398*1017Szelenkov@nginx.com            'errors write',
399*1017Szelenkov@nginx.com        )
400603Szelenkov@nginx.com
401603Szelenkov@nginx.com    def test_python_application_body_array(self):
402603Szelenkov@nginx.com        self.load('body_array')
403603Szelenkov@nginx.com
404603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body array')
405603Szelenkov@nginx.com
406603Szelenkov@nginx.com    def test_python_application_body_io(self):
407603Szelenkov@nginx.com        self.load('body_io')
408603Szelenkov@nginx.com
409603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body io')
410603Szelenkov@nginx.com
411603Szelenkov@nginx.com    def test_python_application_body_io_file(self):
412603Szelenkov@nginx.com        self.load('body_io_file')
413603Szelenkov@nginx.com
414603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], 'body\n', 'body io file')
415603Szelenkov@nginx.com
416603Szelenkov@nginx.com    @unittest.expectedFailure
417603Szelenkov@nginx.com    def test_python_application_syntax_error(self):
418603Szelenkov@nginx.com        self.skip_alerts.append(r'Python failed to import module "wsgi"')
419603Szelenkov@nginx.com        self.load('syntax_error')
420603Szelenkov@nginx.com
421603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'syntax error')
422603Szelenkov@nginx.com
423603Szelenkov@nginx.com    def test_python_application_close(self):
424603Szelenkov@nginx.com        self.load('close')
425603Szelenkov@nginx.com
426603Szelenkov@nginx.com        self.get()
427603Szelenkov@nginx.com
428603Szelenkov@nginx.com        self.stop()
429603Szelenkov@nginx.com
430603Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'Close called\.'), 'close')
431603Szelenkov@nginx.com
432603Szelenkov@nginx.com    def test_python_application_close_error(self):
433603Szelenkov@nginx.com        self.load('close_error')
434603Szelenkov@nginx.com
435603Szelenkov@nginx.com        self.get()
436603Szelenkov@nginx.com
437603Szelenkov@nginx.com        self.stop()
438603Szelenkov@nginx.com
439*1017Szelenkov@nginx.com        self.assertIsNotNone(
440*1017Szelenkov@nginx.com            self.search_in_log(r'Close called\.'), 'close error'
441*1017Szelenkov@nginx.com        )
442603Szelenkov@nginx.com
443617Szelenkov@nginx.com    def test_python_application_not_iterable(self):
444617Szelenkov@nginx.com        self.load('not_iterable')
445617Szelenkov@nginx.com
446665Szelenkov@nginx.com        self.get()
447617Szelenkov@nginx.com
448617Szelenkov@nginx.com        self.stop()
449617Szelenkov@nginx.com
450*1017Szelenkov@nginx.com        self.assertIsNotNone(
451*1017Szelenkov@nginx.com            self.search_in_log(
452*1017Szelenkov@nginx.com                r'\[error\].+the application returned not an iterable object'
453*1017Szelenkov@nginx.com            ),
454*1017Szelenkov@nginx.com            'not iterable',
455*1017Szelenkov@nginx.com        )
456617Szelenkov@nginx.com
457664Szelenkov@nginx.com    def test_python_application_write(self):
458664Szelenkov@nginx.com        self.load('write')
459664Szelenkov@nginx.com
460664Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'write')
461664Szelenkov@nginx.com
462*1017Szelenkov@nginx.com
463484Szelenkov@nginx.comif __name__ == '__main__':
464853Szelenkov@nginx.com    TestUnitPythonApplication.main()
465