11283Szelenkov@nginx.comimport re
21304St.nateldemoura@f5.comimport os
31304St.nateldemoura@f5.comimport grp
41304St.nateldemoura@f5.comimport pwd
5899Szelenkov@nginx.comimport time
6484Szelenkov@nginx.comimport unittest
71019Szelenkov@nginx.comfrom unit.applications.lang.python import TestApplicationPython
8484Szelenkov@nginx.com
91017Szelenkov@nginx.com
101019Szelenkov@nginx.comclass TestPythonApplication(TestApplicationPython):
11*1467Szelenkov@nginx.com    prerequisites = {'modules': {'python': 'all'}}
12484Szelenkov@nginx.com
131283Szelenkov@nginx.com    def findall(self, pattern):
141283Szelenkov@nginx.com        with open(self.testdir + '/unit.log', 'r', errors='ignore') as f:
151283Szelenkov@nginx.com            return re.findall(pattern, f.read())
161283Szelenkov@nginx.com
17552Szelenkov@nginx.com    def test_python_application_variables(self):
18552Szelenkov@nginx.com        self.load('variables')
19484Szelenkov@nginx.com
20484Szelenkov@nginx.com        body = 'Test body string.'
21484Szelenkov@nginx.com
221017Szelenkov@nginx.com        resp = self.post(
231017Szelenkov@nginx.com            headers={
241017Szelenkov@nginx.com                'Host': 'localhost',
251017Szelenkov@nginx.com                'Content-Type': 'text/html',
261017Szelenkov@nginx.com                'Custom-Header': 'blah',
271017Szelenkov@nginx.com                'Connection': 'close',
281017Szelenkov@nginx.com            },
291017Szelenkov@nginx.com            body=body,
301017Szelenkov@nginx.com        )
31484Szelenkov@nginx.com
32505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
33505Szelenkov@nginx.com        headers = resp['headers']
34674Szelenkov@nginx.com        header_server = headers.pop('Server')
35674Szelenkov@nginx.com        self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header')
361017Szelenkov@nginx.com        self.assertEqual(
371017Szelenkov@nginx.com            headers.pop('Server-Software'),
381017Szelenkov@nginx.com            header_server,
391017Szelenkov@nginx.com            'server software header',
401017Szelenkov@nginx.com        )
41599Szelenkov@nginx.com
42599Szelenkov@nginx.com        date = headers.pop('Date')
43599Szelenkov@nginx.com        self.assertEqual(date[-4:], ' GMT', 'date header timezone')
441017Szelenkov@nginx.com        self.assertLess(
451017Szelenkov@nginx.com            abs(self.date_to_sec_epoch(date) - self.sec_epoch()),
461017Szelenkov@nginx.com            5,
471017Szelenkov@nginx.com            'date header',
481017Szelenkov@nginx.com        )
49599Szelenkov@nginx.com
501017Szelenkov@nginx.com        self.assertDictEqual(
511017Szelenkov@nginx.com            headers,
521017Szelenkov@nginx.com            {
531017Szelenkov@nginx.com                'Connection': 'close',
541017Szelenkov@nginx.com                'Content-Length': str(len(body)),
551017Szelenkov@nginx.com                'Content-Type': 'text/html',
561017Szelenkov@nginx.com                'Request-Method': 'POST',
571017Szelenkov@nginx.com                'Request-Uri': '/',
581017Szelenkov@nginx.com                'Http-Host': 'localhost',
591017Szelenkov@nginx.com                'Server-Protocol': 'HTTP/1.1',
601017Szelenkov@nginx.com                'Custom-Header': 'blah',
611017Szelenkov@nginx.com                'Wsgi-Version': '(1, 0)',
621017Szelenkov@nginx.com                'Wsgi-Url-Scheme': 'http',
631017Szelenkov@nginx.com                'Wsgi-Multithread': 'False',
641017Szelenkov@nginx.com                'Wsgi-Multiprocess': 'True',
651017Szelenkov@nginx.com                'Wsgi-Run-Once': 'False',
661017Szelenkov@nginx.com            },
671017Szelenkov@nginx.com            'headers',
681017Szelenkov@nginx.com        )
69505Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
70484Szelenkov@nginx.com
71497Szelenkov@nginx.com    def test_python_application_query_string(self):
72552Szelenkov@nginx.com        self.load('query_string')
73497Szelenkov@nginx.com
74505Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
75497Szelenkov@nginx.com
761017Szelenkov@nginx.com        self.assertEqual(
771017Szelenkov@nginx.com            resp['headers']['Query-String'],
781017Szelenkov@nginx.com            'var1=val1&var2=val2',
791017Szelenkov@nginx.com            'Query-String header',
801017Szelenkov@nginx.com        )
81497Szelenkov@nginx.com
821171Svbart@nginx.com    def test_python_application_query_string_space(self):
831171Svbart@nginx.com        self.load('query_string')
841171Svbart@nginx.com
851171Svbart@nginx.com        resp = self.get(url='/ ?var1=val1&var2=val2')
861171Svbart@nginx.com        self.assertEqual(
871171Svbart@nginx.com            resp['headers']['Query-String'],
881171Svbart@nginx.com            'var1=val1&var2=val2',
891171Svbart@nginx.com            'Query-String space',
901171Svbart@nginx.com        )
911171Svbart@nginx.com
921171Svbart@nginx.com        resp = self.get(url='/ %20?var1=val1&var2=val2')
931171Svbart@nginx.com        self.assertEqual(
941171Svbart@nginx.com            resp['headers']['Query-String'],
951171Svbart@nginx.com            'var1=val1&var2=val2',
961171Svbart@nginx.com            'Query-String space 2',
971171Svbart@nginx.com        )
981171Svbart@nginx.com
991171Svbart@nginx.com        resp = self.get(url='/ %20 ?var1=val1&var2=val2')
1001171Svbart@nginx.com        self.assertEqual(
1011171Svbart@nginx.com            resp['headers']['Query-String'],
1021171Svbart@nginx.com            'var1=val1&var2=val2',
1031171Svbart@nginx.com            'Query-String space 3',
1041171Svbart@nginx.com        )
1051171Svbart@nginx.com
1061171Svbart@nginx.com        resp = self.get(url='/blah %20 blah? var1= val1 & var2=val2')
1071171Svbart@nginx.com        self.assertEqual(
1081171Svbart@nginx.com            resp['headers']['Query-String'],
1091171Svbart@nginx.com            ' var1= val1 & var2=val2',
1101171Svbart@nginx.com            'Query-String space 4',
1111171Svbart@nginx.com        )
1121171Svbart@nginx.com
113894Szelenkov@nginx.com    def test_python_application_query_string_empty(self):
114894Szelenkov@nginx.com        self.load('query_string')
115894Szelenkov@nginx.com
116894Szelenkov@nginx.com        resp = self.get(url='/?')
117894Szelenkov@nginx.com
118894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string empty status')
1191017Szelenkov@nginx.com        self.assertEqual(
1201017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string empty'
1211017Szelenkov@nginx.com        )
122894Szelenkov@nginx.com
123894Szelenkov@nginx.com    def test_python_application_query_string_absent(self):
124894Szelenkov@nginx.com        self.load('query_string')
125894Szelenkov@nginx.com
126894Szelenkov@nginx.com        resp = self.get()
127894Szelenkov@nginx.com
128894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string absent status')
1291017Szelenkov@nginx.com        self.assertEqual(
1301017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string absent'
1311017Szelenkov@nginx.com        )
132894Szelenkov@nginx.com
1331064Szelenkov@nginx.com    @unittest.skip('not yet')
134495Szelenkov@nginx.com    def test_python_application_server_port(self):
135552Szelenkov@nginx.com        self.load('server_port')
136495Szelenkov@nginx.com
1371017Szelenkov@nginx.com        self.assertEqual(
1381017Szelenkov@nginx.com            self.get()['headers']['Server-Port'], '7080', 'Server-Port header'
1391017Szelenkov@nginx.com        )
140484Szelenkov@nginx.com
1411250Szelenkov@nginx.com    @unittest.skip('not yet')
1421250Szelenkov@nginx.com    def test_python_application_working_directory_invalid(self):
1431250Szelenkov@nginx.com        self.load('empty')
1441250Szelenkov@nginx.com
1451250Szelenkov@nginx.com        self.assertIn(
1461250Szelenkov@nginx.com            'success',
1471250Szelenkov@nginx.com            self.conf('"/blah"', 'applications/empty/working_directory'),
1481250Szelenkov@nginx.com            'configure invalid working_directory',
1491250Szelenkov@nginx.com        )
1501250Szelenkov@nginx.com
1511250Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'status')
1521250Szelenkov@nginx.com
153496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
154552Szelenkov@nginx.com        self.load('204_no_content')
155496Szelenkov@nginx.com
1561017Szelenkov@nginx.com        self.assertNotIn(
1571017Szelenkov@nginx.com            'Transfer-Encoding',
1581017Szelenkov@nginx.com            self.get()['headers'],
1591017Szelenkov@nginx.com            '204 header transfer encoding',
1601017Szelenkov@nginx.com        )
161484Szelenkov@nginx.com
162602Szelenkov@nginx.com    def test_python_application_ctx_iter_atexit(self):
163602Szelenkov@nginx.com        self.load('ctx_iter_atexit')
164602Szelenkov@nginx.com
1651017Szelenkov@nginx.com        resp = self.post(
1661017Szelenkov@nginx.com            headers={
1671017Szelenkov@nginx.com                'Host': 'localhost',
1681017Szelenkov@nginx.com                'Connection': 'close',
1691017Szelenkov@nginx.com                'Content-Type': 'text/html',
1701017Szelenkov@nginx.com            },
1711017Szelenkov@nginx.com            body='0123456789',
1721017Szelenkov@nginx.com        )
173602Szelenkov@nginx.com
174602Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'ctx iter status')
175602Szelenkov@nginx.com        self.assertEqual(resp['body'], '0123456789', 'ctx iter body')
176602Szelenkov@nginx.com
1771017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
178602Szelenkov@nginx.com
179602Szelenkov@nginx.com        self.stop()
180602Szelenkov@nginx.com
1811017Szelenkov@nginx.com        self.assertIsNotNone(
1821028Szelenkov@nginx.com            self.wait_for_record(r'RuntimeError'), 'ctx iter atexit'
1831017Szelenkov@nginx.com        )
184602Szelenkov@nginx.com
185603Szelenkov@nginx.com    def test_python_keepalive_body(self):
186603Szelenkov@nginx.com        self.load('mirror')
187603Szelenkov@nginx.com
1881029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
1891029Szelenkov@nginx.com
1901453Szelenkov@nginx.com        body = '0123456789' * 500
1911017Szelenkov@nginx.com        (resp, sock) = self.post(
1921017Szelenkov@nginx.com            headers={
1931017Szelenkov@nginx.com                'Host': 'localhost',
1941017Szelenkov@nginx.com                'Connection': 'keep-alive',
1951017Szelenkov@nginx.com                'Content-Type': 'text/html',
1961017Szelenkov@nginx.com            },
1971017Szelenkov@nginx.com            start=True,
1981453Szelenkov@nginx.com            body=body,
1991029Szelenkov@nginx.com            read_timeout=1,
2001017Szelenkov@nginx.com        )
201603Szelenkov@nginx.com
2021453Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'keep-alive 1')
203603Szelenkov@nginx.com
2041453Szelenkov@nginx.com        body = '0123456789'
2051017Szelenkov@nginx.com        resp = self.post(
2061017Szelenkov@nginx.com            headers={
2071017Szelenkov@nginx.com                'Host': 'localhost',
2081017Szelenkov@nginx.com                'Connection': 'close',
2091017Szelenkov@nginx.com                'Content-Type': 'text/html',
2101017Szelenkov@nginx.com            },
2111017Szelenkov@nginx.com            sock=sock,
2121453Szelenkov@nginx.com            body=body,
2131017Szelenkov@nginx.com        )
214603Szelenkov@nginx.com
2151453Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'keep-alive 2')
216603Szelenkov@nginx.com
217684Szelenkov@nginx.com    def test_python_keepalive_reconfigure(self):
2181017Szelenkov@nginx.com        self.skip_alerts.extend(
2191017Szelenkov@nginx.com            [
2201017Szelenkov@nginx.com                r'pthread_mutex.+failed',
2211017Szelenkov@nginx.com                r'failed to apply',
2221017Szelenkov@nginx.com                r'process \d+ exited on signal',
2231017Szelenkov@nginx.com            ]
2241017Szelenkov@nginx.com        )
225684Szelenkov@nginx.com        self.load('mirror')
226684Szelenkov@nginx.com
2271029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
2281029Szelenkov@nginx.com
229684Szelenkov@nginx.com        body = '0123456789'
230684Szelenkov@nginx.com        conns = 3
231684Szelenkov@nginx.com        socks = []
232684Szelenkov@nginx.com
233684Szelenkov@nginx.com        for i in range(conns):
2341017Szelenkov@nginx.com            (resp, sock) = self.post(
2351017Szelenkov@nginx.com                headers={
2361017Szelenkov@nginx.com                    'Host': 'localhost',
2371017Szelenkov@nginx.com                    'Connection': 'keep-alive',
2381017Szelenkov@nginx.com                    'Content-Type': 'text/html',
2391017Szelenkov@nginx.com                },
2401017Szelenkov@nginx.com                start=True,
2411017Szelenkov@nginx.com                body=body,
2421029Szelenkov@nginx.com                read_timeout=1,
2431017Szelenkov@nginx.com            )
244684Szelenkov@nginx.com
245684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive open')
2461017Szelenkov@nginx.com            self.assertIn(
2471017Szelenkov@nginx.com                'success',
2481026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
2491017Szelenkov@nginx.com                'reconfigure',
2501017Szelenkov@nginx.com            )
251684Szelenkov@nginx.com
252684Szelenkov@nginx.com            socks.append(sock)
253684Szelenkov@nginx.com
254684Szelenkov@nginx.com        for i in range(conns):
2551017Szelenkov@nginx.com            (resp, sock) = self.post(
2561017Szelenkov@nginx.com                headers={
2571017Szelenkov@nginx.com                    'Host': 'localhost',
2581017Szelenkov@nginx.com                    'Connection': 'keep-alive',
2591017Szelenkov@nginx.com                    'Content-Type': 'text/html',
2601017Szelenkov@nginx.com                },
2611017Szelenkov@nginx.com                start=True,
2621017Szelenkov@nginx.com                sock=socks[i],
2631017Szelenkov@nginx.com                body=body,
2641029Szelenkov@nginx.com                read_timeout=1,
2651017Szelenkov@nginx.com            )
266684Szelenkov@nginx.com
267684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive request')
2681017Szelenkov@nginx.com            self.assertIn(
2691017Szelenkov@nginx.com                'success',
2701026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
2711017Szelenkov@nginx.com                'reconfigure 2',
2721017Szelenkov@nginx.com            )
273684Szelenkov@nginx.com
274684Szelenkov@nginx.com        for i in range(conns):
2751017Szelenkov@nginx.com            resp = self.post(
2761017Szelenkov@nginx.com                headers={
2771017Szelenkov@nginx.com                    'Host': 'localhost',
2781017Szelenkov@nginx.com                    'Connection': 'close',
2791017Szelenkov@nginx.com                    'Content-Type': 'text/html',
2801017Szelenkov@nginx.com                },
2811017Szelenkov@nginx.com                sock=socks[i],
2821017Szelenkov@nginx.com                body=body,
2831017Szelenkov@nginx.com            )
284684Szelenkov@nginx.com
285684Szelenkov@nginx.com            self.assertEqual(resp['body'], body, 'keep-alive close')
2861017Szelenkov@nginx.com            self.assertIn(
2871017Szelenkov@nginx.com                'success',
2881026Szelenkov@nginx.com                self.conf(str(i + 1), 'applications/mirror/processes'),
2891017Szelenkov@nginx.com                'reconfigure 3',
2901017Szelenkov@nginx.com            )
291684Szelenkov@nginx.com
292750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_2(self):
293750Szelenkov@nginx.com        self.load('mirror')
294750Szelenkov@nginx.com
2951029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
2961029Szelenkov@nginx.com
297750Szelenkov@nginx.com        body = '0123456789'
298750Szelenkov@nginx.com
2991017Szelenkov@nginx.com        (resp, sock) = self.post(
3001017Szelenkov@nginx.com            headers={
3011017Szelenkov@nginx.com                'Host': 'localhost',
3021017Szelenkov@nginx.com                'Connection': 'keep-alive',
3031017Szelenkov@nginx.com                'Content-Type': 'text/html',
3041017Szelenkov@nginx.com            },
3051017Szelenkov@nginx.com            start=True,
3061017Szelenkov@nginx.com            body=body,
3071029Szelenkov@nginx.com            read_timeout=1,
3081017Szelenkov@nginx.com        )
309750Szelenkov@nginx.com
310750Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'reconfigure 2 keep-alive 1')
311750Szelenkov@nginx.com
312750Szelenkov@nginx.com        self.load('empty')
313750Szelenkov@nginx.com
3141029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
3151029Szelenkov@nginx.com
3161017Szelenkov@nginx.com        (resp, sock) = self.post(
3171017Szelenkov@nginx.com            headers={
3181017Szelenkov@nginx.com                'Host': 'localhost',
3191017Szelenkov@nginx.com                'Connection': 'close',
3201017Szelenkov@nginx.com                'Content-Type': 'text/html',
3211017Szelenkov@nginx.com            },
3221017Szelenkov@nginx.com            start=True,
3231017Szelenkov@nginx.com            sock=sock,
3241017Szelenkov@nginx.com            body=body,
3251017Szelenkov@nginx.com        )
326750Szelenkov@nginx.com
327750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 2 keep-alive 2')
328750Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'reconfigure 2 keep-alive 2 body')
329750Szelenkov@nginx.com
3301017Szelenkov@nginx.com        self.assertIn(
3311017Szelenkov@nginx.com            'success',
3321017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
3331017Szelenkov@nginx.com            'reconfigure 2 clear configuration',
3341017Szelenkov@nginx.com        )
335750Szelenkov@nginx.com
336750Szelenkov@nginx.com        resp = self.get(sock=sock)
337750Szelenkov@nginx.com
338750Szelenkov@nginx.com        self.assertEqual(resp, {}, 'reconfigure 2 keep-alive 3')
339750Szelenkov@nginx.com
340750Szelenkov@nginx.com    def test_python_keepalive_reconfigure_3(self):
341750Szelenkov@nginx.com        self.load('empty')
342750Szelenkov@nginx.com
3431029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
3441029Szelenkov@nginx.com
3451453Szelenkov@nginx.com        (_, sock) = self.http(
3461017Szelenkov@nginx.com            b"""GET / HTTP/1.1
3471017Szelenkov@nginx.com""",
3481017Szelenkov@nginx.com            start=True,
3491017Szelenkov@nginx.com            raw=True,
3501453Szelenkov@nginx.com            no_recv=True,
3511017Szelenkov@nginx.com        )
352750Szelenkov@nginx.com
3531453Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200)
3541453Szelenkov@nginx.com
3551017Szelenkov@nginx.com        self.assertIn(
3561017Szelenkov@nginx.com            'success',
3571017Szelenkov@nginx.com            self.conf({"listeners": {}, "applications": {}}),
3581017Szelenkov@nginx.com            'reconfigure 3 clear configuration',
3591017Szelenkov@nginx.com        )
360750Szelenkov@nginx.com
3611017Szelenkov@nginx.com        resp = self.http(
3621017Szelenkov@nginx.com            b"""Host: localhost
363750Szelenkov@nginx.comConnection: close
364750Szelenkov@nginx.com
3651017Szelenkov@nginx.com""",
3661017Szelenkov@nginx.com            sock=sock,
3671017Szelenkov@nginx.com            raw=True,
3681017Szelenkov@nginx.com        )
369750Szelenkov@nginx.com
370750Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'reconfigure 3')
371750Szelenkov@nginx.com
372603Szelenkov@nginx.com    def test_python_atexit(self):
373603Szelenkov@nginx.com        self.load('atexit')
374603Szelenkov@nginx.com
375603Szelenkov@nginx.com        self.get()
376603Szelenkov@nginx.com
3771017Szelenkov@nginx.com        self.conf({"listeners": {}, "applications": {}})
378603Szelenkov@nginx.com
379603Szelenkov@nginx.com        self.stop()
380603Szelenkov@nginx.com
3811028Szelenkov@nginx.com        self.assertIsNotNone(
3821028Szelenkov@nginx.com            self.wait_for_record(r'At exit called\.'), 'atexit'
3831028Szelenkov@nginx.com        )
384603Szelenkov@nginx.com
3851454Szelenkov@nginx.com    def test_python_process_switch(self):
3861454Szelenkov@nginx.com        self.load('delayed')
3871454Szelenkov@nginx.com
3881454Szelenkov@nginx.com        self.assertIn(
3891454Szelenkov@nginx.com            'success',
3901454Szelenkov@nginx.com            self.conf('2', 'applications/delayed/processes'),
3911454Szelenkov@nginx.com            'configure 2 processes',
3921454Szelenkov@nginx.com        )
3931454Szelenkov@nginx.com
3941454Szelenkov@nginx.com        self.get(headers={
3951454Szelenkov@nginx.com            'Host': 'localhost',
3961454Szelenkov@nginx.com            'Content-Length': '0',
3971454Szelenkov@nginx.com            'X-Delay': '5',
3981454Szelenkov@nginx.com            'Connection': 'close',
3991454Szelenkov@nginx.com        }, no_recv=True)
4001454Szelenkov@nginx.com
4011454Szelenkov@nginx.com        headers_delay_1 = {
4021454Szelenkov@nginx.com            'Connection': 'close',
4031454Szelenkov@nginx.com            'Host': 'localhost',
4041454Szelenkov@nginx.com            'Content-Length': '0',
4051454Szelenkov@nginx.com            'X-Delay': '1',
4061454Szelenkov@nginx.com        }
4071454Szelenkov@nginx.com
4081454Szelenkov@nginx.com        self.get(headers=headers_delay_1, no_recv=True)
4091454Szelenkov@nginx.com
4101454Szelenkov@nginx.com        time.sleep(0.5)
4111454Szelenkov@nginx.com
4121454Szelenkov@nginx.com        for _ in range(10):
4131454Szelenkov@nginx.com            self.get(headers=headers_delay_1, no_recv=True)
4141454Szelenkov@nginx.com
4151454Szelenkov@nginx.com        self.get(headers=headers_delay_1)
4161454Szelenkov@nginx.com
4171064Szelenkov@nginx.com    @unittest.skip('not yet')
418603Szelenkov@nginx.com    def test_python_application_start_response_exit(self):
419603Szelenkov@nginx.com        self.load('start_response_exit')
420603Szelenkov@nginx.com
421603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'start response exit')
422603Szelenkov@nginx.com
423603Szelenkov@nginx.com    def test_python_application_input_iter(self):
424603Szelenkov@nginx.com        self.load('input_iter')
425603Szelenkov@nginx.com
4261400Smax.romanov@nginx.com        body = '''0123456789
4271400Smax.romanov@nginx.comnext line
4281400Smax.romanov@nginx.com
4291400Smax.romanov@nginx.comlast line'''
4301400Smax.romanov@nginx.com
4311400Smax.romanov@nginx.com        resp = self.post(body=body)
4321400Smax.romanov@nginx.com        self.assertEqual(resp['body'], body, 'input iter')
4331400Smax.romanov@nginx.com        self.assertEqual(
4341400Smax.romanov@nginx.com            resp['headers']['X-Lines-Count'], '4', 'input iter lines'
4351400Smax.romanov@nginx.com        )
4361400Smax.romanov@nginx.com
4371400Smax.romanov@nginx.com    def test_python_application_input_readline(self):
4381400Smax.romanov@nginx.com        self.load('input_readline')
4391400Smax.romanov@nginx.com
4401400Smax.romanov@nginx.com        body = '''0123456789
4411400Smax.romanov@nginx.comnext line
4421400Smax.romanov@nginx.com
4431400Smax.romanov@nginx.comlast line'''
4441400Smax.romanov@nginx.com
4451400Smax.romanov@nginx.com        resp = self.post(body=body)
4461400Smax.romanov@nginx.com        self.assertEqual(resp['body'], body, 'input readline')
4471400Smax.romanov@nginx.com        self.assertEqual(
4481400Smax.romanov@nginx.com            resp['headers']['X-Lines-Count'], '4', 'input readline lines'
4491400Smax.romanov@nginx.com        )
4501400Smax.romanov@nginx.com
4511400Smax.romanov@nginx.com    def test_python_application_input_readline_size(self):
4521400Smax.romanov@nginx.com        self.load('input_readline_size')
4531400Smax.romanov@nginx.com
4541400Smax.romanov@nginx.com        body = '''0123456789
4551400Smax.romanov@nginx.comnext line
4561400Smax.romanov@nginx.com
4571400Smax.romanov@nginx.comlast line'''
458603Szelenkov@nginx.com
4591400Smax.romanov@nginx.com        self.assertEqual(
4601400Smax.romanov@nginx.com            self.post(body=body)['body'], body, 'input readline size'
4611400Smax.romanov@nginx.com        )
4621400Smax.romanov@nginx.com        self.assertEqual(
4631400Smax.romanov@nginx.com            self.post(body='0123')['body'], '0123', 'input readline size less'
4641400Smax.romanov@nginx.com        )
4651400Smax.romanov@nginx.com
4661400Smax.romanov@nginx.com    def test_python_application_input_readlines(self):
4671400Smax.romanov@nginx.com        self.load('input_readlines')
4681400Smax.romanov@nginx.com
4691400Smax.romanov@nginx.com        body = '''0123456789
4701400Smax.romanov@nginx.comnext line
4711400Smax.romanov@nginx.com
4721400Smax.romanov@nginx.comlast line'''
4731400Smax.romanov@nginx.com
4741400Smax.romanov@nginx.com        resp = self.post(body=body)
4751400Smax.romanov@nginx.com        self.assertEqual(resp['body'], body, 'input readlines')
4761400Smax.romanov@nginx.com        self.assertEqual(
4771400Smax.romanov@nginx.com            resp['headers']['X-Lines-Count'], '4', 'input readlines lines'
4781400Smax.romanov@nginx.com        )
4791400Smax.romanov@nginx.com
4801400Smax.romanov@nginx.com    def test_python_application_input_readlines_huge(self):
4811400Smax.romanov@nginx.com        self.load('input_readlines')
4821400Smax.romanov@nginx.com
4831400Smax.romanov@nginx.com        body = (
4841400Smax.romanov@nginx.com            '''0123456789 abcdefghi
4851400Smax.romanov@nginx.comnext line: 0123456789 abcdefghi
4861400Smax.romanov@nginx.com
4871400Smax.romanov@nginx.comlast line: 987654321
4881400Smax.romanov@nginx.com'''
4891400Smax.romanov@nginx.com            * 512
4901400Smax.romanov@nginx.com        )
4911400Smax.romanov@nginx.com
4921400Smax.romanov@nginx.com        self.assertEqual(
4931400Smax.romanov@nginx.com            self.post(body=body, read_buffer_size=16384)['body'],
4941400Smax.romanov@nginx.com            body,
4951400Smax.romanov@nginx.com            'input readlines huge',
4961400Smax.romanov@nginx.com        )
497603Szelenkov@nginx.com
498603Szelenkov@nginx.com    def test_python_application_input_read_length(self):
499603Szelenkov@nginx.com        self.load('input_read_length')
500603Szelenkov@nginx.com
501603Szelenkov@nginx.com        body = '0123456789'
502603Szelenkov@nginx.com
5031017Szelenkov@nginx.com        resp = self.post(
5041017Szelenkov@nginx.com            headers={
5051017Szelenkov@nginx.com                'Host': 'localhost',
5061017Szelenkov@nginx.com                'Input-Length': '5',
5071017Szelenkov@nginx.com                'Connection': 'close',
5081017Szelenkov@nginx.com            },
5091017Szelenkov@nginx.com            body=body,
5101017Szelenkov@nginx.com        )
511603Szelenkov@nginx.com
512603Szelenkov@nginx.com        self.assertEqual(resp['body'], body[:5], 'input read length lt body')
513603Szelenkov@nginx.com
5141017Szelenkov@nginx.com        resp = self.post(
5151017Szelenkov@nginx.com            headers={
5161017Szelenkov@nginx.com                'Host': 'localhost',
5171017Szelenkov@nginx.com                'Input-Length': '15',
5181017Szelenkov@nginx.com                'Connection': 'close',
5191017Szelenkov@nginx.com            },
5201017Szelenkov@nginx.com            body=body,
5211017Szelenkov@nginx.com        )
522603Szelenkov@nginx.com
523603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length gt body')
524603Szelenkov@nginx.com
5251017Szelenkov@nginx.com        resp = self.post(
5261017Szelenkov@nginx.com            headers={
5271017Szelenkov@nginx.com                'Host': 'localhost',
5281017Szelenkov@nginx.com                'Input-Length': '0',
5291017Szelenkov@nginx.com                'Connection': 'close',
5301017Szelenkov@nginx.com            },
5311017Szelenkov@nginx.com            body=body,
5321017Szelenkov@nginx.com        )
533603Szelenkov@nginx.com
534603Szelenkov@nginx.com        self.assertEqual(resp['body'], '', 'input read length zero')
535603Szelenkov@nginx.com
5361017Szelenkov@nginx.com        resp = self.post(
5371017Szelenkov@nginx.com            headers={
5381017Szelenkov@nginx.com                'Host': 'localhost',
5391017Szelenkov@nginx.com                'Input-Length': '-1',
5401017Szelenkov@nginx.com                'Connection': 'close',
5411017Szelenkov@nginx.com            },
5421017Szelenkov@nginx.com            body=body,
5431017Szelenkov@nginx.com        )
544603Szelenkov@nginx.com
545603Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'input read length negative')
546603Szelenkov@nginx.com
5471064Szelenkov@nginx.com    @unittest.skip('not yet')
548603Szelenkov@nginx.com    def test_python_application_errors_write(self):
549603Szelenkov@nginx.com        self.load('errors_write')
550603Szelenkov@nginx.com
551603Szelenkov@nginx.com        self.get()
552603Szelenkov@nginx.com
553603Szelenkov@nginx.com        self.stop()
554603Szelenkov@nginx.com
555603Szelenkov@nginx.com        self.assertIsNotNone(
5561028Szelenkov@nginx.com            self.wait_for_record(r'\[error\].+Error in application\.'),
5571017Szelenkov@nginx.com            'errors write',
5581017Szelenkov@nginx.com        )
559603Szelenkov@nginx.com
560603Szelenkov@nginx.com    def test_python_application_body_array(self):
561603Szelenkov@nginx.com        self.load('body_array')
562603Szelenkov@nginx.com
563603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body array')
564603Szelenkov@nginx.com
565603Szelenkov@nginx.com    def test_python_application_body_io(self):
566603Szelenkov@nginx.com        self.load('body_io')
567603Szelenkov@nginx.com
568603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'body io')
569603Szelenkov@nginx.com
570603Szelenkov@nginx.com    def test_python_application_body_io_file(self):
571603Szelenkov@nginx.com        self.load('body_io_file')
572603Szelenkov@nginx.com
573603Szelenkov@nginx.com        self.assertEqual(self.get()['body'], 'body\n', 'body io file')
574603Szelenkov@nginx.com
5751064Szelenkov@nginx.com    @unittest.skip('not yet')
576603Szelenkov@nginx.com    def test_python_application_syntax_error(self):
577603Szelenkov@nginx.com        self.skip_alerts.append(r'Python failed to import module "wsgi"')
578603Szelenkov@nginx.com        self.load('syntax_error')
579603Szelenkov@nginx.com
580603Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 500, 'syntax error')
581603Szelenkov@nginx.com
582603Szelenkov@nginx.com    def test_python_application_close(self):
583603Szelenkov@nginx.com        self.load('close')
584603Szelenkov@nginx.com
585603Szelenkov@nginx.com        self.get()
586603Szelenkov@nginx.com
587603Szelenkov@nginx.com        self.stop()
588603Szelenkov@nginx.com
5891028Szelenkov@nginx.com        self.assertIsNotNone(self.wait_for_record(r'Close called\.'), 'close')
590603Szelenkov@nginx.com
591603Szelenkov@nginx.com    def test_python_application_close_error(self):
592603Szelenkov@nginx.com        self.load('close_error')
593603Szelenkov@nginx.com
594603Szelenkov@nginx.com        self.get()
595603Szelenkov@nginx.com
596603Szelenkov@nginx.com        self.stop()
597603Szelenkov@nginx.com
5981017Szelenkov@nginx.com        self.assertIsNotNone(
5991028Szelenkov@nginx.com            self.wait_for_record(r'Close called\.'), 'close error'
6001017Szelenkov@nginx.com        )
601603Szelenkov@nginx.com
602617Szelenkov@nginx.com    def test_python_application_not_iterable(self):
603617Szelenkov@nginx.com        self.load('not_iterable')
604617Szelenkov@nginx.com
605665Szelenkov@nginx.com        self.get()
606617Szelenkov@nginx.com
607617Szelenkov@nginx.com        self.stop()
608617Szelenkov@nginx.com
6091017Szelenkov@nginx.com        self.assertIsNotNone(
6101028Szelenkov@nginx.com            self.wait_for_record(
6111017Szelenkov@nginx.com                r'\[error\].+the application returned not an iterable object'
6121017Szelenkov@nginx.com            ),
6131017Szelenkov@nginx.com            'not iterable',
6141017Szelenkov@nginx.com        )
615617Szelenkov@nginx.com
616664Szelenkov@nginx.com    def test_python_application_write(self):
617664Szelenkov@nginx.com        self.load('write')
618664Szelenkov@nginx.com
619664Szelenkov@nginx.com        self.assertEqual(self.get()['body'], '0123456789', 'write')
620664Szelenkov@nginx.com
6211261Szelenkov@nginx.com    def test_python_application_threading(self):
6221261Szelenkov@nginx.com        """wait_for_record() timeouts after 5s while every thread works at
6231261Szelenkov@nginx.com        least 3s.  So without releasing GIL test should fail.
6241261Szelenkov@nginx.com        """
6251261Szelenkov@nginx.com
6261261Szelenkov@nginx.com        self.load('threading')
6271261Szelenkov@nginx.com
6281261Szelenkov@nginx.com        for _ in range(10):
6291261Szelenkov@nginx.com            self.get(no_recv=True)
6301261Szelenkov@nginx.com
6311261Szelenkov@nginx.com        self.assertIsNotNone(
6321261Szelenkov@nginx.com            self.wait_for_record(r'\(5\) Thread: 100'), 'last thread finished'
6331261Szelenkov@nginx.com        )
6341017Szelenkov@nginx.com
6351283Szelenkov@nginx.com    def test_python_application_iter_exception(self):
6361283Szelenkov@nginx.com        self.load('iter_exception')
6371283Szelenkov@nginx.com
6381283Szelenkov@nginx.com        # Default request doesn't lead to the exception.
6391283Szelenkov@nginx.com
6401283Szelenkov@nginx.com        resp = self.get(
6411283Szelenkov@nginx.com            headers={
6421283Szelenkov@nginx.com                'Host': 'localhost',
6431283Szelenkov@nginx.com                'X-Skip': '9',
6441283Szelenkov@nginx.com                'X-Chunked': '1',
6451283Szelenkov@nginx.com                'Connection': 'close',
6461283Szelenkov@nginx.com            }
6471283Szelenkov@nginx.com        )
6481283Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
6491295St.nateldemoura@f5.com        self.assertEqual(resp['body'], 'XXXXXXX', 'body')
6501283Szelenkov@nginx.com
6511283Szelenkov@nginx.com        # Exception before start_response().
6521283Szelenkov@nginx.com
6531283Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 503, 'error')
6541283Szelenkov@nginx.com
6551283Szelenkov@nginx.com        self.assertIsNotNone(self.wait_for_record(r'Traceback'), 'traceback')
6561283Szelenkov@nginx.com        self.assertIsNotNone(
6571283Szelenkov@nginx.com            self.wait_for_record(r'raise Exception\(\'first exception\'\)'),
6581283Szelenkov@nginx.com            'first exception raise',
6591283Szelenkov@nginx.com        )
6601283Szelenkov@nginx.com        self.assertEqual(
6611283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 1, 'traceback count 1'
6621283Szelenkov@nginx.com        )
6631283Szelenkov@nginx.com
6641283Szelenkov@nginx.com        # Exception after start_response(), before first write().
6651283Szelenkov@nginx.com
6661283Szelenkov@nginx.com        self.assertEqual(
6671283Szelenkov@nginx.com            self.get(
6681283Szelenkov@nginx.com                headers={
6691283Szelenkov@nginx.com                    'Host': 'localhost',
6701283Szelenkov@nginx.com                    'X-Skip': '1',
6711283Szelenkov@nginx.com                    'Connection': 'close',
6721283Szelenkov@nginx.com                }
6731283Szelenkov@nginx.com            )['status'],
6741283Szelenkov@nginx.com            503,
6751283Szelenkov@nginx.com            'error 2',
6761283Szelenkov@nginx.com        )
6771283Szelenkov@nginx.com
6781283Szelenkov@nginx.com        self.assertIsNotNone(
6791283Szelenkov@nginx.com            self.wait_for_record(r'raise Exception\(\'second exception\'\)'),
6801283Szelenkov@nginx.com            'exception raise second',
6811283Szelenkov@nginx.com        )
6821283Szelenkov@nginx.com        self.assertEqual(
6831283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 2, 'traceback count 2'
6841283Szelenkov@nginx.com        )
6851283Szelenkov@nginx.com
6861283Szelenkov@nginx.com        # Exception after first write(), before first __next__().
6871283Szelenkov@nginx.com
6881283Szelenkov@nginx.com        _, sock = self.get(
6891283Szelenkov@nginx.com            headers={
6901283Szelenkov@nginx.com                'Host': 'localhost',
6911283Szelenkov@nginx.com                'X-Skip': '2',
6921283Szelenkov@nginx.com                'Connection': 'keep-alive',
6931283Szelenkov@nginx.com            },
6941283Szelenkov@nginx.com            start=True,
6951283Szelenkov@nginx.com        )
6961283Szelenkov@nginx.com
6971283Szelenkov@nginx.com        self.assertIsNotNone(
6981283Szelenkov@nginx.com            self.wait_for_record(r'raise Exception\(\'third exception\'\)'),
6991283Szelenkov@nginx.com            'exception raise third',
7001283Szelenkov@nginx.com        )
7011283Szelenkov@nginx.com        self.assertEqual(
7021283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 3, 'traceback count 3'
7031283Szelenkov@nginx.com        )
7041283Szelenkov@nginx.com
7051283Szelenkov@nginx.com        self.assertDictEqual(self.get(sock=sock), {}, 'closed connection')
7061283Szelenkov@nginx.com
7071283Szelenkov@nginx.com        # Exception after first write(), before first __next__(),
7081283Szelenkov@nginx.com        # chunked (incomplete body).
7091283Szelenkov@nginx.com
7101283Szelenkov@nginx.com        resp = self.get(
7111283Szelenkov@nginx.com            headers={
7121283Szelenkov@nginx.com                'Host': 'localhost',
7131283Szelenkov@nginx.com                'X-Skip': '2',
7141283Szelenkov@nginx.com                'X-Chunked': '1',
7151283Szelenkov@nginx.com                'Connection': 'close',
7161295St.nateldemoura@f5.com            },
7171295St.nateldemoura@f5.com            raw_resp=True
7181283Szelenkov@nginx.com        )
7191295St.nateldemoura@f5.com        if resp:
7201295St.nateldemoura@f5.com            self.assertNotEqual(resp[-5:], '0\r\n\r\n', 'incomplete body')
7211283Szelenkov@nginx.com        self.assertEqual(
7221283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 4, 'traceback count 4'
7231283Szelenkov@nginx.com        )
7241283Szelenkov@nginx.com
7251283Szelenkov@nginx.com        # Exception in __next__().
7261283Szelenkov@nginx.com
7271283Szelenkov@nginx.com        _, sock = self.get(
7281283Szelenkov@nginx.com            headers={
7291283Szelenkov@nginx.com                'Host': 'localhost',
7301283Szelenkov@nginx.com                'X-Skip': '3',
7311283Szelenkov@nginx.com                'Connection': 'keep-alive',
7321283Szelenkov@nginx.com            },
7331283Szelenkov@nginx.com            start=True,
7341283Szelenkov@nginx.com        )
7351283Szelenkov@nginx.com
7361283Szelenkov@nginx.com        self.assertIsNotNone(
7371283Szelenkov@nginx.com            self.wait_for_record(r'raise Exception\(\'next exception\'\)'),
7381283Szelenkov@nginx.com            'exception raise next',
7391283Szelenkov@nginx.com        )
7401283Szelenkov@nginx.com        self.assertEqual(
7411283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 5, 'traceback count 5'
7421283Szelenkov@nginx.com        )
7431283Szelenkov@nginx.com
7441283Szelenkov@nginx.com        self.assertDictEqual(self.get(sock=sock), {}, 'closed connection 2')
7451283Szelenkov@nginx.com
7461283Szelenkov@nginx.com        # Exception in __next__(), chunked (incomplete body).
7471283Szelenkov@nginx.com
7481283Szelenkov@nginx.com        resp = self.get(
7491283Szelenkov@nginx.com            headers={
7501283Szelenkov@nginx.com                'Host': 'localhost',
7511283Szelenkov@nginx.com                'X-Skip': '3',
7521283Szelenkov@nginx.com                'X-Chunked': '1',
7531283Szelenkov@nginx.com                'Connection': 'close',
7541295St.nateldemoura@f5.com            },
7551295St.nateldemoura@f5.com            raw_resp=True
7561283Szelenkov@nginx.com        )
7571295St.nateldemoura@f5.com        if resp:
7581295St.nateldemoura@f5.com            self.assertNotEqual(resp[-5:], '0\r\n\r\n', 'incomplete body 2')
7591283Szelenkov@nginx.com        self.assertEqual(
7601283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 6, 'traceback count 6'
7611283Szelenkov@nginx.com        )
7621283Szelenkov@nginx.com
7631283Szelenkov@nginx.com        # Exception before start_response() and in close().
7641283Szelenkov@nginx.com
7651283Szelenkov@nginx.com        self.assertEqual(
7661283Szelenkov@nginx.com            self.get(
7671283Szelenkov@nginx.com                headers={
7681283Szelenkov@nginx.com                    'Host': 'localhost',
7691283Szelenkov@nginx.com                    'X-Not-Skip-Close': '1',
7701283Szelenkov@nginx.com                    'Connection': 'close',
7711283Szelenkov@nginx.com                }
7721283Szelenkov@nginx.com            )['status'],
7731283Szelenkov@nginx.com            503,
7741283Szelenkov@nginx.com            'error',
7751283Szelenkov@nginx.com        )
7761283Szelenkov@nginx.com
7771283Szelenkov@nginx.com        self.assertIsNotNone(
7781283Szelenkov@nginx.com            self.wait_for_record(r'raise Exception\(\'close exception\'\)'),
7791283Szelenkov@nginx.com            'exception raise close',
7801283Szelenkov@nginx.com        )
7811283Szelenkov@nginx.com        self.assertEqual(
7821283Szelenkov@nginx.com            len(self.findall(r'Traceback')), 8, 'traceback count 8'
7831283Szelenkov@nginx.com        )
7841283Szelenkov@nginx.com
7851304St.nateldemoura@f5.com    def test_python_user_group(self):
7861304St.nateldemoura@f5.com        if not self.is_su:
7871304St.nateldemoura@f5.com            print("requires root")
7881304St.nateldemoura@f5.com            raise unittest.SkipTest()
7891304St.nateldemoura@f5.com
7901304St.nateldemoura@f5.com        nobody_uid = pwd.getpwnam('nobody').pw_uid
7911304St.nateldemoura@f5.com
7921304St.nateldemoura@f5.com        group = 'nobody'
7931304St.nateldemoura@f5.com
7941304St.nateldemoura@f5.com        try:
7951304St.nateldemoura@f5.com            group_id = grp.getgrnam(group).gr_gid
7961304St.nateldemoura@f5.com        except:
7971304St.nateldemoura@f5.com            group = 'nogroup'
7981304St.nateldemoura@f5.com            group_id = grp.getgrnam(group).gr_gid
7991304St.nateldemoura@f5.com
8001304St.nateldemoura@f5.com        self.load('user_group')
8011304St.nateldemoura@f5.com
8021304St.nateldemoura@f5.com        obj = self.getjson()['body']
8031304St.nateldemoura@f5.com        self.assertEqual(obj['UID'], nobody_uid, 'nobody uid')
8041304St.nateldemoura@f5.com        self.assertEqual(obj['GID'], group_id, 'nobody gid')
8051304St.nateldemoura@f5.com
8061304St.nateldemoura@f5.com        self.load('user_group', user='nobody')
8071304St.nateldemoura@f5.com
8081304St.nateldemoura@f5.com        obj = self.getjson()['body']
8091304St.nateldemoura@f5.com        self.assertEqual(obj['UID'], nobody_uid, 'nobody uid user=nobody')
8101304St.nateldemoura@f5.com        self.assertEqual(obj['GID'], group_id, 'nobody gid user=nobody')
8111304St.nateldemoura@f5.com
8121304St.nateldemoura@f5.com        self.load('user_group', user='nobody', group=group)
8131304St.nateldemoura@f5.com
8141304St.nateldemoura@f5.com        obj = self.getjson()['body']
8151304St.nateldemoura@f5.com        self.assertEqual(
8161304St.nateldemoura@f5.com            obj['UID'], nobody_uid, 'nobody uid user=nobody group=%s' % group
8171304St.nateldemoura@f5.com        )
8181304St.nateldemoura@f5.com
8191304St.nateldemoura@f5.com        self.assertEqual(
8201304St.nateldemoura@f5.com            obj['GID'], group_id, 'nobody gid user=nobody group=%s' % group
8211304St.nateldemoura@f5.com        )
8221304St.nateldemoura@f5.com
8231304St.nateldemoura@f5.com        self.load('user_group', group=group)
8241304St.nateldemoura@f5.com
8251304St.nateldemoura@f5.com        obj = self.getjson()['body']
8261304St.nateldemoura@f5.com        self.assertEqual(
8271304St.nateldemoura@f5.com            obj['UID'], nobody_uid, 'nobody uid group=%s' % group
8281304St.nateldemoura@f5.com        )
8291304St.nateldemoura@f5.com
8301304St.nateldemoura@f5.com        self.assertEqual(obj['GID'], group_id, 'nobody gid group=%s' % group)
8311304St.nateldemoura@f5.com
8321304St.nateldemoura@f5.com        self.load('user_group', user='root')
8331304St.nateldemoura@f5.com
8341304St.nateldemoura@f5.com        obj = self.getjson()['body']
8351304St.nateldemoura@f5.com        self.assertEqual(obj['UID'], 0, 'root uid user=root')
8361304St.nateldemoura@f5.com        self.assertEqual(obj['GID'], 0, 'root gid user=root')
8371304St.nateldemoura@f5.com
8381304St.nateldemoura@f5.com        group = 'root'
8391304St.nateldemoura@f5.com
8401304St.nateldemoura@f5.com        try:
8411304St.nateldemoura@f5.com            grp.getgrnam(group)
8421304St.nateldemoura@f5.com            group = True
8431304St.nateldemoura@f5.com        except:
8441304St.nateldemoura@f5.com            group = False
8451304St.nateldemoura@f5.com
8461304St.nateldemoura@f5.com        if group:
8471304St.nateldemoura@f5.com            self.load('user_group', user='root', group='root')
8481304St.nateldemoura@f5.com
8491304St.nateldemoura@f5.com            obj = self.getjson()['body']
8501304St.nateldemoura@f5.com            self.assertEqual(obj['UID'], 0, 'root uid user=root group=root')
8511304St.nateldemoura@f5.com            self.assertEqual(obj['GID'], 0, 'root gid user=root group=root')
8521304St.nateldemoura@f5.com
8531304St.nateldemoura@f5.com            self.load('user_group', group='root')
8541304St.nateldemoura@f5.com
8551304St.nateldemoura@f5.com            obj = self.getjson()['body']
8561304St.nateldemoura@f5.com            self.assertEqual(obj['UID'], nobody_uid, 'root uid group=root')
8571304St.nateldemoura@f5.com            self.assertEqual(obj['GID'], 0, 'root gid group=root')
8581304St.nateldemoura@f5.com
859484Szelenkov@nginx.comif __name__ == '__main__':
8601019Szelenkov@nginx.com    TestPythonApplication.main()
861