1484Szelenkov@nginx.comimport unittest
2484Szelenkov@nginx.comimport unit
3484Szelenkov@nginx.com
4552Szelenkov@nginx.comclass TestUnitPythonApplication(unit.TestUnitApplicationPython):
5484Szelenkov@nginx.com
6484Szelenkov@nginx.com    def setUpClass():
7550Szelenkov@nginx.com        unit.TestUnit().check_modules('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
14505Szelenkov@nginx.com        resp = self.post(headers={
15484Szelenkov@nginx.com            'Host': 'localhost',
16484Szelenkov@nginx.com            'Content-Type': 'text/html',
17484Szelenkov@nginx.com            'Custom-Header': 'blah'
18505Szelenkov@nginx.com        }, body=body)
19484Szelenkov@nginx.com
20505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
21505Szelenkov@nginx.com        headers = resp['headers']
22569Svbart@nginx.com        self.assertRegex(headers.pop('Server'), r'Unit/[\d\.]+',
23495Szelenkov@nginx.com            'server header')
24599Szelenkov@nginx.com
25599Szelenkov@nginx.com        date = headers.pop('Date')
26599Szelenkov@nginx.com        self.assertEqual(date[-4:], ' GMT', 'date header timezone')
27599Szelenkov@nginx.com        self.assertLess(abs(self.date_to_sec_epoch(date) - self.sec_epoch()), 5,
28599Szelenkov@nginx.com            'date header')
29599Szelenkov@nginx.com
30495Szelenkov@nginx.com        self.assertDictEqual(headers, {
31495Szelenkov@nginx.com            'Content-Length': str(len(body)),
32495Szelenkov@nginx.com            'Content-Type': 'text/html',
33495Szelenkov@nginx.com            'Request-Method': 'POST',
34495Szelenkov@nginx.com            'Request-Uri': '/',
35495Szelenkov@nginx.com            'Http-Host': 'localhost',
36495Szelenkov@nginx.com            'Server-Protocol': 'HTTP/1.1',
37603Szelenkov@nginx.com            'Custom-Header': 'blah',
38603Szelenkov@nginx.com            'Wsgi-Version': '(1, 0)',
39603Szelenkov@nginx.com            'Wsgi-Url-Scheme': 'http',
40603Szelenkov@nginx.com            'Wsgi-Multithread': 'False',
41603Szelenkov@nginx.com            'Wsgi-Multiprocess': 'True',
42603Szelenkov@nginx.com            'Wsgi-Run-Once': 'False'
43495Szelenkov@nginx.com        }, 'headers')
44505Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
45484Szelenkov@nginx.com
46497Szelenkov@nginx.com    def test_python_application_query_string(self):
47552Szelenkov@nginx.com        self.load('query_string')
48497Szelenkov@nginx.com
49505Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
50497Szelenkov@nginx.com
51513Szelenkov@nginx.com        self.assertEqual(resp['headers']['Query-String'], 'var1=val1&var2=val2',
52513Szelenkov@nginx.com            'Query-String header')
53497Szelenkov@nginx.com
54495Szelenkov@nginx.com    @unittest.expectedFailure
55495Szelenkov@nginx.com    def test_python_application_server_port(self):
56552Szelenkov@nginx.com        self.load('server_port')
57495Szelenkov@nginx.com
58505Szelenkov@nginx.com        self.assertEqual(self.get()['headers']['Server-Port'], '7080',
59495Szelenkov@nginx.com            'Server-Port header')
60484Szelenkov@nginx.com
61496Szelenkov@nginx.com    @unittest.expectedFailure
62496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
63552Szelenkov@nginx.com        self.load('204_no_content')
64496Szelenkov@nginx.com
65505Szelenkov@nginx.com        self.assertNotIn('Transfer-Encoding', self.get()['headers'],
66496Szelenkov@nginx.com            '204 header transfer encoding')
67484Szelenkov@nginx.com
68602Szelenkov@nginx.com    def test_python_application_ctx_iter_atexit(self):
69602Szelenkov@nginx.com        self.skip_alerts.append(r'sendmsg.+failed')
70602Szelenkov@nginx.com        self.load('ctx_iter_atexit')
71602Szelenkov@nginx.com
72602Szelenkov@nginx.com        resp = self.post(headers={
73602Szelenkov@nginx.com            'Connection': 'close',
74602Szelenkov@nginx.com            'Content-Type': 'text/html',
75602Szelenkov@nginx.com            'Host': 'localhost'
76602Szelenkov@nginx.com        }, body='0123456789')
77602Szelenkov@nginx.com
78602Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'ctx iter status')
79602Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'ctx iter body')
80602Szelenkov@nginx.com
81602Szelenkov@nginx.com        self.conf({
82602Szelenkov@nginx.com            "listeners": {},
83602Szelenkov@nginx.com            "applications": {}
84602Szelenkov@nginx.com        })
85602Szelenkov@nginx.com
86602Szelenkov@nginx.com        self.stop()
87602Szelenkov@nginx.com
88602Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'RuntimeError'),
89602Szelenkov@nginx.com            'ctx iter atexit')
90602Szelenkov@nginx.com
91603Szelenkov@nginx.com    def test_python_keepalive_body(self):
92603Szelenkov@nginx.com        self.load('mirror')
93603Szelenkov@nginx.com
94603Szelenkov@nginx.com        (resp, sock) = self.post(headers={
95603Szelenkov@nginx.com            'Connection': 'keep-alive',
96603Szelenkov@nginx.com            'Content-Type': 'text/html',
97603Szelenkov@nginx.com            'Host': 'localhost'
98603Szelenkov@nginx.com        }, start=True, body='0123456789' * 500)
99603Szelenkov@nginx.com
100603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')
101603Szelenkov@nginx.com
102603Szelenkov@nginx.com        resp = self.post(headers={
103603Szelenkov@nginx.com            'Connection': 'close',
104603Szelenkov@nginx.com            'Content-Type': 'text/html',
105603Szelenkov@nginx.com            'Host': 'localhost'
106603Szelenkov@nginx.com        }, sock=sock, body='0123456789')
107603Szelenkov@nginx.com
108603Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')
109603Szelenkov@nginx.com
110603Szelenkov@nginx.com    def test_python_atexit(self):
111603Szelenkov@nginx.com        self.skip_alerts.append(r'sendmsg.+failed')
112603Szelenkov@nginx.com        self.load('atexit')
113603Szelenkov@nginx.com
114603Szelenkov@nginx.com        self.get()
115603Szelenkov@nginx.com
116603Szelenkov@nginx.com        self.conf({
117603Szelenkov@nginx.com            "listeners": {},
118603Szelenkov@nginx.com            "applications": {}
119603Szelenkov@nginx.com        })
120603Szelenkov@nginx.com
121603Szelenkov@nginx.com        self.stop()
122603Szelenkov@nginx.com
123603Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'At exit called\.'), 'atexit')
124603Szelenkov@nginx.com
125603Szelenkov@nginx.com    @unittest.expectedFailure
126603Szelenkov@nginx.com    def test_python_application_start_response_exit(self):
127603Szelenkov@nginx.com        self.load('start_response_exit')
128603Szelenkov@nginx.com
129603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'start response exit')
130603Szelenkov@nginx.com
131603Szelenkov@nginx.com    @unittest.expectedFailure
132603Szelenkov@nginx.com    def test_python_application_input_iter(self):
133603Szelenkov@nginx.com        self.load('input_iter')
134603Szelenkov@nginx.com
135603Szelenkov@nginx.com        body = '0123456789'
136603Szelenkov@nginx.com
137603Szelenkov@nginx.com        self.assertEqual(self.post(body=body)['body'], body, 'input iter')
138603Szelenkov@nginx.com
139603Szelenkov@nginx.com    @unittest.expectedFailure
140603Szelenkov@nginx.com    def test_python_application_input_read_length(self):
141603Szelenkov@nginx.com        self.load('input_read_length')
142603Szelenkov@nginx.com
143603Szelenkov@nginx.com        body = '0123456789'
144603Szelenkov@nginx.com
145603Szelenkov@nginx.com        resp = self.post(headers={
146603Szelenkov@nginx.com            'Host': 'localhost',
147603Szelenkov@nginx.com            'Input-Length': '5',
148603Szelenkov@nginx.com            'Connection': 'close'
149603Szelenkov@nginx.com        }, body=body)
150603Szelenkov@nginx.com
151603Szelenkov@nginx.com        self.assertEqual(resp['body'], body[:5], 'input read length lt body')
152603Szelenkov@nginx.com
153603Szelenkov@nginx.com        resp = self.post(headers={
154603Szelenkov@nginx.com            'Host': 'localhost',
155603Szelenkov@nginx.com            'Input-Length': '15',
156603Szelenkov@nginx.com            'Connection': 'close'
157603Szelenkov@nginx.com        }, body=body)
158603Szelenkov@nginx.com
159603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length gt body')
160603Szelenkov@nginx.com
161603Szelenkov@nginx.com        resp = self.post(headers={
162603Szelenkov@nginx.com            'Host': 'localhost',
163603Szelenkov@nginx.com            'Input-Length': '0',
164603Szelenkov@nginx.com            'Connection': 'close'
165603Szelenkov@nginx.com        }, body=body)
166603Szelenkov@nginx.com
167603Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'input read length zero')
168603Szelenkov@nginx.com
169603Szelenkov@nginx.com        resp = self.post(headers={
170603Szelenkov@nginx.com            'Host': 'localhost',
171603Szelenkov@nginx.com            'Input-Length': '-1',
172603Szelenkov@nginx.com            'Connection': 'close'
173603Szelenkov@nginx.com        }, body=body)
174603Szelenkov@nginx.com
175603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length negative')
176603Szelenkov@nginx.com
177603Szelenkov@nginx.com    @unittest.expectedFailure
178603Szelenkov@nginx.com    def test_python_application_errors_write(self):
179603Szelenkov@nginx.com        self.load('errors_write')
180603Szelenkov@nginx.com
181603Szelenkov@nginx.com        self.get()
182603Szelenkov@nginx.com
183603Szelenkov@nginx.com        self.stop()
184603Szelenkov@nginx.com
185603Szelenkov@nginx.com        self.assertIsNotNone(
186603Szelenkov@nginx.com            self.search_in_log(r'\[error\].+Error in application\.'),
187603Szelenkov@nginx.com            'errors write')
188603Szelenkov@nginx.com
189603Szelenkov@nginx.com    def test_python_application_body_array(self):
190603Szelenkov@nginx.com        self.load('body_array')
191603Szelenkov@nginx.com
192603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body array')
193603Szelenkov@nginx.com
194603Szelenkov@nginx.com    def test_python_application_body_io(self):
195603Szelenkov@nginx.com        self.load('body_io')
196603Szelenkov@nginx.com
197603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body io')
198603Szelenkov@nginx.com
199603Szelenkov@nginx.com    def test_python_application_body_io_file(self):
200603Szelenkov@nginx.com        self.load('body_io_file')
201603Szelenkov@nginx.com
202603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], 'body\n', 'body io file')
203603Szelenkov@nginx.com
204603Szelenkov@nginx.com    @unittest.expectedFailure
205603Szelenkov@nginx.com    def test_python_application_syntax_error(self):
206603Szelenkov@nginx.com        self.skip_alerts.append(r'Python failed to import module "wsgi"')
207603Szelenkov@nginx.com        self.load('syntax_error')
208603Szelenkov@nginx.com
209603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'syntax error')
210603Szelenkov@nginx.com
211603Szelenkov@nginx.com    def test_python_application_close(self):
212603Szelenkov@nginx.com        self.load('close')
213603Szelenkov@nginx.com
214603Szelenkov@nginx.com        self.get()
215603Szelenkov@nginx.com
216603Szelenkov@nginx.com        self.stop()
217603Szelenkov@nginx.com
218603Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'Close called\.'), 'close')
219603Szelenkov@nginx.com
220603Szelenkov@nginx.com    def test_python_application_close_error(self):
221603Szelenkov@nginx.com        self.load('close_error')
222603Szelenkov@nginx.com
223603Szelenkov@nginx.com        self.get()
224603Szelenkov@nginx.com
225603Szelenkov@nginx.com        self.stop()
226603Szelenkov@nginx.com
227603Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(r'Close called\.'),
228603Szelenkov@nginx.com            'close error')
229603Szelenkov@nginx.com
230617Szelenkov@nginx.com    def test_python_application_not_iterable(self):
231617Szelenkov@nginx.com        self.load('not_iterable')
232617Szelenkov@nginx.com
233*665Szelenkov@nginx.com        self.get()
234617Szelenkov@nginx.com
235617Szelenkov@nginx.com        self.stop()
236617Szelenkov@nginx.com
237617Szelenkov@nginx.com        self.assertIsNotNone(self.search_in_log(
238617Szelenkov@nginx.com            r'\[error\].+the application returned not an iterable object'),
239617Szelenkov@nginx.com            'not iterable')
240617Szelenkov@nginx.com
241664Szelenkov@nginx.com    def test_python_application_write(self):
242664Szelenkov@nginx.com        self.load('write')
243664Szelenkov@nginx.com
244664Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'write')
245664Szelenkov@nginx.com
246484Szelenkov@nginx.comif __name__ == '__main__':
247484Szelenkov@nginx.com    unittest.main()
248