11367Szelenkov@nginx.comimport os
2*1529Szelenkov@nginx.comimport re
31367Szelenkov@nginx.comimport shutil
4*1529Szelenkov@nginx.comimport time
5675Szelenkov@nginx.comimport unittest
61477Szelenkov@nginx.com
71019Szelenkov@nginx.comfrom unit.applications.lang.php import TestApplicationPHP
8675Szelenkov@nginx.com
91019Szelenkov@nginx.comclass TestPHPApplication(TestApplicationPHP):
101467Szelenkov@nginx.com    prerequisites = {'modules': {'php': 'all'}}
11675Szelenkov@nginx.com
12982Szelenkov@nginx.com    def before_disable_functions(self):
13982Szelenkov@nginx.com        body = self.get()['body']
14982Szelenkov@nginx.com
15982Szelenkov@nginx.com        self.assertRegex(body, r'time: \d+', 'disable_functions before time')
16982Szelenkov@nginx.com        self.assertRegex(body, r'exec: \/\w+', 'disable_functions before exec')
17865Szelenkov@nginx.com
181381St.nateldemoura@f5.com    def set_opcache(self, app, val):
191381St.nateldemoura@f5.com        self.assertIn(
201381St.nateldemoura@f5.com            'success',
211381St.nateldemoura@f5.com            self.conf(
221381St.nateldemoura@f5.com                {
231381St.nateldemoura@f5.com                    "admin": {
241381St.nateldemoura@f5.com                        "opcache.enable": val,
251381St.nateldemoura@f5.com                        "opcache.enable_cli": val,
261381St.nateldemoura@f5.com                    },
271381St.nateldemoura@f5.com                },
281381St.nateldemoura@f5.com                'applications/' + app + '/options',
291381St.nateldemoura@f5.com            ),
301381St.nateldemoura@f5.com        )
311381St.nateldemoura@f5.com
321381St.nateldemoura@f5.com        opcache = self.get()['headers']['X-OPcache']
331381St.nateldemoura@f5.com
341381St.nateldemoura@f5.com        if not opcache or opcache == '-1':
351381St.nateldemoura@f5.com            print('opcache is not supported')
361381St.nateldemoura@f5.com            raise unittest.SkipTest()
371381St.nateldemoura@f5.com
381381St.nateldemoura@f5.com        self.assertEqual(opcache, val, 'opcache value')
391381St.nateldemoura@f5.com
40675Szelenkov@nginx.com    def test_php_application_variables(self):
41675Szelenkov@nginx.com        self.load('variables')
42675Szelenkov@nginx.com
43675Szelenkov@nginx.com        body = 'Test body string.'
44675Szelenkov@nginx.com
451017Szelenkov@nginx.com        resp = self.post(
461017Szelenkov@nginx.com            headers={
471017Szelenkov@nginx.com                'Host': 'localhost',
481017Szelenkov@nginx.com                'Content-Type': 'text/html',
491017Szelenkov@nginx.com                'Custom-Header': 'blah',
501017Szelenkov@nginx.com                'Connection': 'close',
511017Szelenkov@nginx.com            },
521017Szelenkov@nginx.com            body=body,
531092Szelenkov@nginx.com            url='/index.php/blah?var=val'
541017Szelenkov@nginx.com        )
55675Szelenkov@nginx.com
56675Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
57675Szelenkov@nginx.com        headers = resp['headers']
58675Szelenkov@nginx.com        header_server = headers.pop('Server')
59675Szelenkov@nginx.com        self.assertRegex(header_server, r'Unit/[\d\.]+', 'server header')
601017Szelenkov@nginx.com        self.assertEqual(
611017Szelenkov@nginx.com            headers.pop('Server-Software'),
621017Szelenkov@nginx.com            header_server,
631017Szelenkov@nginx.com            'server software header',
641017Szelenkov@nginx.com        )
65675Szelenkov@nginx.com
66675Szelenkov@nginx.com        date = headers.pop('Date')
67675Szelenkov@nginx.com        self.assertEqual(date[-4:], ' GMT', 'date header timezone')
681017Szelenkov@nginx.com        self.assertLess(
691017Szelenkov@nginx.com            abs(self.date_to_sec_epoch(date) - self.sec_epoch()),
701017Szelenkov@nginx.com            5,
711017Szelenkov@nginx.com            'date header',
721017Szelenkov@nginx.com        )
73675Szelenkov@nginx.com
74675Szelenkov@nginx.com        if 'X-Powered-By' in headers:
75675Szelenkov@nginx.com            headers.pop('X-Powered-By')
76675Szelenkov@nginx.com
77675Szelenkov@nginx.com        headers.pop('Content-type')
781017Szelenkov@nginx.com        self.assertDictEqual(
791017Szelenkov@nginx.com            headers,
801017Szelenkov@nginx.com            {
811017Szelenkov@nginx.com                'Connection': 'close',
821017Szelenkov@nginx.com                'Content-Length': str(len(body)),
831017Szelenkov@nginx.com                'Request-Method': 'POST',
841092Szelenkov@nginx.com                'Path-Info': '/blah',
851092Szelenkov@nginx.com                'Request-Uri': '/index.php/blah?var=val',
861017Szelenkov@nginx.com                'Http-Host': 'localhost',
871017Szelenkov@nginx.com                'Server-Protocol': 'HTTP/1.1',
881017Szelenkov@nginx.com                'Custom-Header': 'blah',
891017Szelenkov@nginx.com            },
901017Szelenkov@nginx.com            'headers',
911017Szelenkov@nginx.com        )
92675Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
93675Szelenkov@nginx.com
94894Szelenkov@nginx.com    def test_php_application_query_string(self):
95894Szelenkov@nginx.com        self.load('query_string')
96894Szelenkov@nginx.com
97894Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
98894Szelenkov@nginx.com
991017Szelenkov@nginx.com        self.assertEqual(
1001017Szelenkov@nginx.com            resp['headers']['Query-String'],
1011017Szelenkov@nginx.com            'var1=val1&var2=val2',
1021017Szelenkov@nginx.com            'query string',
1031017Szelenkov@nginx.com        )
104894Szelenkov@nginx.com
105894Szelenkov@nginx.com    def test_php_application_query_string_empty(self):
106894Szelenkov@nginx.com        self.load('query_string')
107894Szelenkov@nginx.com
108894Szelenkov@nginx.com        resp = self.get(url='/?')
109894Szelenkov@nginx.com
110894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string empty status')
1111017Szelenkov@nginx.com        self.assertEqual(
1121017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string empty'
1131017Szelenkov@nginx.com        )
114894Szelenkov@nginx.com
115894Szelenkov@nginx.com    def test_php_application_query_string_absent(self):
116894Szelenkov@nginx.com        self.load('query_string')
117894Szelenkov@nginx.com
118894Szelenkov@nginx.com        resp = self.get()
119894Szelenkov@nginx.com
120894Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'query string absent status')
1211017Szelenkov@nginx.com        self.assertEqual(
1221017Szelenkov@nginx.com            resp['headers']['Query-String'], '', 'query string absent'
1231017Szelenkov@nginx.com        )
124894Szelenkov@nginx.com
125675Szelenkov@nginx.com    def test_php_application_phpinfo(self):
126675Szelenkov@nginx.com        self.load('phpinfo')
127675Szelenkov@nginx.com
128675Szelenkov@nginx.com        resp = self.get()
129675Szelenkov@nginx.com
130675Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
131675Szelenkov@nginx.com        self.assertNotEqual(resp['body'], '', 'body not empty')
132675Szelenkov@nginx.com
1331090Svbart@nginx.com    def test_php_application_header_status(self):
1341090Svbart@nginx.com        self.load('header')
1351090Svbart@nginx.com
1361090Svbart@nginx.com        self.assertEqual(
1371090Svbart@nginx.com            self.get(
1381090Svbart@nginx.com                headers={
1391090Svbart@nginx.com                    'Host': 'localhost',
1401090Svbart@nginx.com                    'Connection': 'close',
1411090Svbart@nginx.com                    'X-Header': 'HTTP/1.1 404 Not Found',
1421090Svbart@nginx.com                }
1431090Svbart@nginx.com            )['status'],
1441090Svbart@nginx.com            404,
1451090Svbart@nginx.com            'status',
1461090Svbart@nginx.com        )
1471090Svbart@nginx.com
1481090Svbart@nginx.com        self.assertEqual(
1491090Svbart@nginx.com            self.get(
1501090Svbart@nginx.com                headers={
1511090Svbart@nginx.com                    'Host': 'localhost',
1521090Svbart@nginx.com                    'Connection': 'close',
1531090Svbart@nginx.com                    'X-Header': 'http/1.1 404 Not Found',
1541090Svbart@nginx.com                }
1551090Svbart@nginx.com            )['status'],
1561090Svbart@nginx.com            404,
1571090Svbart@nginx.com            'status case insensitive',
1581090Svbart@nginx.com        )
1591090Svbart@nginx.com
1601090Svbart@nginx.com        self.assertEqual(
1611090Svbart@nginx.com            self.get(
1621090Svbart@nginx.com                headers={
1631090Svbart@nginx.com                    'Host': 'localhost',
1641090Svbart@nginx.com                    'Connection': 'close',
1651090Svbart@nginx.com                    'X-Header': 'HTTP/ 404 Not Found',
1661090Svbart@nginx.com                }
1671090Svbart@nginx.com            )['status'],
1681090Svbart@nginx.com            404,
1691090Svbart@nginx.com            'status version empty',
1701090Svbart@nginx.com        )
1711090Svbart@nginx.com
1721090Svbart@nginx.com
173675Szelenkov@nginx.com    def test_php_application_404(self):
174675Szelenkov@nginx.com        self.load('404')
175675Szelenkov@nginx.com
176675Szelenkov@nginx.com        resp = self.get()
177675Szelenkov@nginx.com
178675Szelenkov@nginx.com        self.assertEqual(resp['status'], 404, '404 status')
1791017Szelenkov@nginx.com        self.assertRegex(
1801017Szelenkov@nginx.com            resp['body'], r'<title>404 Not Found</title>', '404 body'
1811017Szelenkov@nginx.com        )
182675Szelenkov@nginx.com
183675Szelenkov@nginx.com    def test_php_application_keepalive_body(self):
184675Szelenkov@nginx.com        self.load('mirror')
185675Szelenkov@nginx.com
1861029Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'init')
1871029Szelenkov@nginx.com
1881453Szelenkov@nginx.com        body = '0123456789' * 500
1891017Szelenkov@nginx.com        (resp, sock) = self.post(
1901017Szelenkov@nginx.com            headers={
1911017Szelenkov@nginx.com                'Host': 'localhost',
1921017Szelenkov@nginx.com                'Connection': 'keep-alive',
1931017Szelenkov@nginx.com                'Content-Type': 'text/html',
1941017Szelenkov@nginx.com            },
1951017Szelenkov@nginx.com            start=True,
1961453Szelenkov@nginx.com            body=body,
1971029Szelenkov@nginx.com            read_timeout=1,
1981017Szelenkov@nginx.com        )
199675Szelenkov@nginx.com
2001453Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'keep-alive 1')
201675Szelenkov@nginx.com
2021453Szelenkov@nginx.com        body = '0123456789'
2031017Szelenkov@nginx.com        resp = self.post(
2041017Szelenkov@nginx.com            headers={
2051017Szelenkov@nginx.com                'Host': 'localhost',
2061017Szelenkov@nginx.com                'Connection': 'close',
2071017Szelenkov@nginx.com                'Content-Type': 'text/html',
2081017Szelenkov@nginx.com            },
2091017Szelenkov@nginx.com            sock=sock,
2101453Szelenkov@nginx.com            body=body,
2111017Szelenkov@nginx.com        )
212675Szelenkov@nginx.com
2131453Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'keep-alive 2')
214675Szelenkov@nginx.com
215675Szelenkov@nginx.com    def test_php_application_conditional(self):
216675Szelenkov@nginx.com        self.load('conditional')
217675Szelenkov@nginx.com
218675Szelenkov@nginx.com        self.assertRegex(self.get()['body'], r'True', 'conditional true')
219675Szelenkov@nginx.com        self.assertRegex(self.post()['body'], r'False', 'conditional false')
220675Szelenkov@nginx.com
221675Szelenkov@nginx.com    def test_php_application_get_variables(self):
222675Szelenkov@nginx.com        self.load('get_variables')
223675Szelenkov@nginx.com
224675Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=&var3')
225675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-1'], 'val1', 'GET variables')
226675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-2'], '1', 'GET variables 2')
227675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-3'], '1', 'GET variables 3')
228675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-4'], '', 'GET variables 4')
229675Szelenkov@nginx.com
230675Szelenkov@nginx.com    def test_php_application_post_variables(self):
231675Szelenkov@nginx.com        self.load('post_variables')
232675Szelenkov@nginx.com
2331017Szelenkov@nginx.com        resp = self.post(
2341017Szelenkov@nginx.com            headers={
2351017Szelenkov@nginx.com                'Content-Type': 'application/x-www-form-urlencoded',
2361017Szelenkov@nginx.com                'Host': 'localhost',
2371017Szelenkov@nginx.com                'Connection': 'close',
2381017Szelenkov@nginx.com            },
2391017Szelenkov@nginx.com            body='var1=val1&var2=',
2401017Szelenkov@nginx.com        )
241675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-1'], 'val1', 'POST variables')
242675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-2'], '1', 'POST variables 2')
243675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Var-3'], '', 'POST variables 3')
244675Szelenkov@nginx.com
245675Szelenkov@nginx.com    def test_php_application_cookies(self):
246675Szelenkov@nginx.com        self.load('cookies')
247675Szelenkov@nginx.com
2481017Szelenkov@nginx.com        resp = self.get(
2491017Szelenkov@nginx.com            headers={
2501017Szelenkov@nginx.com                'Cookie': 'var=val; var2=val2',
2511017Szelenkov@nginx.com                'Host': 'localhost',
2521017Szelenkov@nginx.com                'Connection': 'close',
2531017Szelenkov@nginx.com            }
2541017Szelenkov@nginx.com        )
255675Szelenkov@nginx.com
256675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Cookie-1'], 'val', 'cookie')
257675Szelenkov@nginx.com        self.assertEqual(resp['headers']['X-Cookie-2'], 'val2', 'cookie')
258675Szelenkov@nginx.com
259692Szelenkov@nginx.com    def test_php_application_ini_precision(self):
260692Szelenkov@nginx.com        self.load('ini_precision')
261692Szelenkov@nginx.com
2621017Szelenkov@nginx.com        self.assertNotEqual(
2631017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '4', 'ini value default'
2641017Szelenkov@nginx.com        )
2651017Szelenkov@nginx.com
2661017Szelenkov@nginx.com        self.conf(
2671017Szelenkov@nginx.com            {"file": "ini/php.ini"}, 'applications/ini_precision/options'
2681017Szelenkov@nginx.com        )
269692Szelenkov@nginx.com
2701017Szelenkov@nginx.com        self.assertEqual(
2711017Szelenkov@nginx.com            self.get()['headers']['X-File'],
2721017Szelenkov@nginx.com            self.current_dir + '/php/ini_precision/ini/php.ini',
2731017Szelenkov@nginx.com            'ini file',
2741017Szelenkov@nginx.com        )
2751017Szelenkov@nginx.com        self.assertEqual(
2761017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '4', 'ini value'
2771017Szelenkov@nginx.com        )
278692Szelenkov@nginx.com
2791064Szelenkov@nginx.com    @unittest.skip('not yet')
280721Szelenkov@nginx.com    def test_php_application_ini_admin_user(self):
281721Szelenkov@nginx.com        self.load('ini_precision')
282721Szelenkov@nginx.com
2831017Szelenkov@nginx.com        self.assertIn(
2841017Szelenkov@nginx.com            'error',
2851017Szelenkov@nginx.com            self.conf(
2861017Szelenkov@nginx.com                {"user": {"precision": "4"}, "admin": {"precision": "5"}},
2871017Szelenkov@nginx.com                'applications/ini_precision/options',
2881017Szelenkov@nginx.com            ),
2891017Szelenkov@nginx.com            'ini admin user',
2901017Szelenkov@nginx.com        )
291721Szelenkov@nginx.com
292721Szelenkov@nginx.com    def test_php_application_ini_admin(self):
293721Szelenkov@nginx.com        self.load('ini_precision')
294721Szelenkov@nginx.com
2951017Szelenkov@nginx.com        self.conf(
2961017Szelenkov@nginx.com            {"file": "php.ini", "admin": {"precision": "5"}},
2971017Szelenkov@nginx.com            'applications/ini_precision/options',
2981017Szelenkov@nginx.com        )
299721Szelenkov@nginx.com
3001017Szelenkov@nginx.com        self.assertEqual(
3011017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '5', 'ini value admin'
3021017Szelenkov@nginx.com        )
303721Szelenkov@nginx.com
304721Szelenkov@nginx.com    def test_php_application_ini_user(self):
305721Szelenkov@nginx.com        self.load('ini_precision')
306721Szelenkov@nginx.com
3071017Szelenkov@nginx.com        self.conf(
3081017Szelenkov@nginx.com            {"file": "php.ini", "user": {"precision": "5"}},
3091017Szelenkov@nginx.com            'applications/ini_precision/options',
3101017Szelenkov@nginx.com        )
311721Szelenkov@nginx.com
3121017Szelenkov@nginx.com        self.assertEqual(
3131017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '5', 'ini value user'
3141017Szelenkov@nginx.com        )
315721Szelenkov@nginx.com
316721Szelenkov@nginx.com    def test_php_application_ini_user_2(self):
317721Szelenkov@nginx.com        self.load('ini_precision')
318721Szelenkov@nginx.com
3191017Szelenkov@nginx.com        self.conf(
3201017Szelenkov@nginx.com            {"file": "ini/php.ini"}, 'applications/ini_precision/options'
3211017Szelenkov@nginx.com        )
322721Szelenkov@nginx.com
3231017Szelenkov@nginx.com        self.assertEqual(
3241017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '4', 'ini user file'
3251017Szelenkov@nginx.com        )
326721Szelenkov@nginx.com
3271017Szelenkov@nginx.com        self.conf(
3281017Szelenkov@nginx.com            {"precision": "5"}, 'applications/ini_precision/options/user'
3291017Szelenkov@nginx.com        )
330721Szelenkov@nginx.com
3311017Szelenkov@nginx.com        self.assertEqual(
3321017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '5', 'ini value user'
3331017Szelenkov@nginx.com        )
334721Szelenkov@nginx.com
335721Szelenkov@nginx.com    def test_php_application_ini_set_admin(self):
336721Szelenkov@nginx.com        self.load('ini_precision')
337721Szelenkov@nginx.com
3381017Szelenkov@nginx.com        self.conf(
3391017Szelenkov@nginx.com            {"admin": {"precision": "5"}}, 'applications/ini_precision/options'
3401017Szelenkov@nginx.com        )
341721Szelenkov@nginx.com
3421017Szelenkov@nginx.com        self.assertEqual(
3431017Szelenkov@nginx.com            self.get(url='/?precision=6')['headers']['X-Precision'],
3441017Szelenkov@nginx.com            '5',
3451017Szelenkov@nginx.com            'ini set admin',
3461017Szelenkov@nginx.com        )
347721Szelenkov@nginx.com
348721Szelenkov@nginx.com    def test_php_application_ini_set_user(self):
349721Szelenkov@nginx.com        self.load('ini_precision')
350721Szelenkov@nginx.com
3511017Szelenkov@nginx.com        self.conf(
3521017Szelenkov@nginx.com            {"user": {"precision": "5"}}, 'applications/ini_precision/options'
3531017Szelenkov@nginx.com        )
354721Szelenkov@nginx.com
3551017Szelenkov@nginx.com        self.assertEqual(
3561017Szelenkov@nginx.com            self.get(url='/?precision=6')['headers']['X-Precision'],
3571017Szelenkov@nginx.com            '6',
3581017Szelenkov@nginx.com            'ini set user',
3591017Szelenkov@nginx.com        )
360721Szelenkov@nginx.com
361721Szelenkov@nginx.com    def test_php_application_ini_repeat(self):
362721Szelenkov@nginx.com        self.load('ini_precision')
363721Szelenkov@nginx.com
3641017Szelenkov@nginx.com        self.conf(
3651017Szelenkov@nginx.com            {"user": {"precision": "5"}}, 'applications/ini_precision/options'
3661017Szelenkov@nginx.com        )
367721Szelenkov@nginx.com
3681017Szelenkov@nginx.com        self.assertEqual(
3691017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '5', 'ini value'
3701017Szelenkov@nginx.com        )
371721Szelenkov@nginx.com
3721017Szelenkov@nginx.com        self.assertEqual(
3731017Szelenkov@nginx.com            self.get()['headers']['X-Precision'], '5', 'ini value repeat'
3741017Szelenkov@nginx.com        )
375721Szelenkov@nginx.com
376865Szelenkov@nginx.com    def test_php_application_disable_functions_exec(self):
377982Szelenkov@nginx.com        self.load('time_exec')
378982Szelenkov@nginx.com
379982Szelenkov@nginx.com        self.before_disable_functions()
380865Szelenkov@nginx.com
3811017Szelenkov@nginx.com        self.conf(
3821017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec"}},
3831017Szelenkov@nginx.com            'applications/time_exec/options',
3841017Szelenkov@nginx.com        )
385865Szelenkov@nginx.com
386982Szelenkov@nginx.com        body = self.get()['body']
387865Szelenkov@nginx.com
388982Szelenkov@nginx.com        self.assertRegex(body, r'time: \d+', 'disable_functions time')
389982Szelenkov@nginx.com        self.assertNotRegex(body, r'exec: \/\w+', 'disable_functions exec')
390865Szelenkov@nginx.com
391865Szelenkov@nginx.com    def test_php_application_disable_functions_comma(self):
392982Szelenkov@nginx.com        self.load('time_exec')
393865Szelenkov@nginx.com
394982Szelenkov@nginx.com        self.before_disable_functions()
395865Szelenkov@nginx.com
3961017Szelenkov@nginx.com        self.conf(
3971017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec,time"}},
3981017Szelenkov@nginx.com            'applications/time_exec/options',
3991017Szelenkov@nginx.com        )
400865Szelenkov@nginx.com
401982Szelenkov@nginx.com        body = self.get()['body']
402982Szelenkov@nginx.com
403982Szelenkov@nginx.com        self.assertNotRegex(body, r'time: \d+', 'disable_functions comma time')
4041017Szelenkov@nginx.com        self.assertNotRegex(
4051017Szelenkov@nginx.com            body, r'exec: \/\w+', 'disable_functions comma exec'
4061017Szelenkov@nginx.com        )
407865Szelenkov@nginx.com
408865Szelenkov@nginx.com    def test_php_application_disable_functions_space(self):
409982Szelenkov@nginx.com        self.load('time_exec')
410865Szelenkov@nginx.com
411982Szelenkov@nginx.com        self.before_disable_functions()
412865Szelenkov@nginx.com
4131017Szelenkov@nginx.com        self.conf(
4141017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec time"}},
4151017Szelenkov@nginx.com            'applications/time_exec/options',
4161017Szelenkov@nginx.com        )
417865Szelenkov@nginx.com
418982Szelenkov@nginx.com        body = self.get()['body']
419982Szelenkov@nginx.com
420982Szelenkov@nginx.com        self.assertNotRegex(body, r'time: \d+', 'disable_functions space time')
4211017Szelenkov@nginx.com        self.assertNotRegex(
4221017Szelenkov@nginx.com            body, r'exec: \/\w+', 'disable_functions space exec'
4231017Szelenkov@nginx.com        )
424865Szelenkov@nginx.com
425865Szelenkov@nginx.com    def test_php_application_disable_functions_user(self):
426982Szelenkov@nginx.com        self.load('time_exec')
427982Szelenkov@nginx.com
428982Szelenkov@nginx.com        self.before_disable_functions()
429865Szelenkov@nginx.com
4301017Szelenkov@nginx.com        self.conf(
4311017Szelenkov@nginx.com            {"user": {"disable_functions": "exec"}},
4321017Szelenkov@nginx.com            'applications/time_exec/options',
4331017Szelenkov@nginx.com        )
434865Szelenkov@nginx.com
435982Szelenkov@nginx.com        body = self.get()['body']
436982Szelenkov@nginx.com
437982Szelenkov@nginx.com        self.assertRegex(body, r'time: \d+', 'disable_functions user time')
4381017Szelenkov@nginx.com        self.assertNotRegex(
4391017Szelenkov@nginx.com            body, r'exec: \/\w+', 'disable_functions user exec'
4401017Szelenkov@nginx.com        )
441865Szelenkov@nginx.com
442865Szelenkov@nginx.com    def test_php_application_disable_functions_nonexistent(self):
443982Szelenkov@nginx.com        self.load('time_exec')
444982Szelenkov@nginx.com
445982Szelenkov@nginx.com        self.before_disable_functions()
446865Szelenkov@nginx.com
4471017Szelenkov@nginx.com        self.conf(
4481017Szelenkov@nginx.com            {"admin": {"disable_functions": "blah"}},
4491017Szelenkov@nginx.com            'applications/time_exec/options',
4501017Szelenkov@nginx.com        )
451865Szelenkov@nginx.com
452982Szelenkov@nginx.com        body = self.get()['body']
453865Szelenkov@nginx.com
4541017Szelenkov@nginx.com        self.assertRegex(
4551017Szelenkov@nginx.com            body, r'time: \d+', 'disable_functions nonexistent time'
4561017Szelenkov@nginx.com        )
4571017Szelenkov@nginx.com        self.assertRegex(
4581017Szelenkov@nginx.com            body, r'exec: \/\w+', 'disable_functions nonexistent exec'
4591017Szelenkov@nginx.com        )
460865Szelenkov@nginx.com
461865Szelenkov@nginx.com    def test_php_application_disable_classes(self):
462865Szelenkov@nginx.com        self.load('date_time')
463865Szelenkov@nginx.com
4641017Szelenkov@nginx.com        self.assertRegex(
4651017Szelenkov@nginx.com            self.get()['body'], r'012345', 'disable_classes before'
4661017Szelenkov@nginx.com        )
467865Szelenkov@nginx.com
4681017Szelenkov@nginx.com        self.conf(
4691017Szelenkov@nginx.com            {"admin": {"disable_classes": "DateTime"}},
4701017Szelenkov@nginx.com            'applications/date_time/options',
4711017Szelenkov@nginx.com        )
472865Szelenkov@nginx.com
4731017Szelenkov@nginx.com        self.assertNotRegex(
4741017Szelenkov@nginx.com            self.get()['body'], r'012345', 'disable_classes before'
4751017Szelenkov@nginx.com        )
476865Szelenkov@nginx.com
477865Szelenkov@nginx.com    def test_php_application_disable_classes_user(self):
478865Szelenkov@nginx.com        self.load('date_time')
479865Szelenkov@nginx.com
4801017Szelenkov@nginx.com        self.assertRegex(
4811017Szelenkov@nginx.com            self.get()['body'], r'012345', 'disable_classes before'
4821017Szelenkov@nginx.com        )
483982Szelenkov@nginx.com
4841017Szelenkov@nginx.com        self.conf(
4851017Szelenkov@nginx.com            {"user": {"disable_classes": "DateTime"}},
4861017Szelenkov@nginx.com            'applications/date_time/options',
4871017Szelenkov@nginx.com        )
488865Szelenkov@nginx.com
4891017Szelenkov@nginx.com        self.assertNotRegex(
4901017Szelenkov@nginx.com            self.get()['body'], r'012345', 'disable_classes before'
4911017Szelenkov@nginx.com        )
4921017Szelenkov@nginx.com
493*1529Szelenkov@nginx.com    def test_php_application_error_log(self):
494*1529Szelenkov@nginx.com        self.load('error_log')
495*1529Szelenkov@nginx.com
496*1529Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'status')
497*1529Szelenkov@nginx.com
498*1529Szelenkov@nginx.com        time.sleep(1)
499*1529Szelenkov@nginx.com
500*1529Szelenkov@nginx.com        self.assertEqual(self.get()['status'], 200, 'status 2')
501*1529Szelenkov@nginx.com
502*1529Szelenkov@nginx.com        self.stop()
503*1529Szelenkov@nginx.com
504*1529Szelenkov@nginx.com        pattern = r'\d{4}\/\d\d\/\d\d\s\d\d:.+\[notice\].+Error in application'
505*1529Szelenkov@nginx.com
506*1529Szelenkov@nginx.com        self.assertIsNotNone(self.wait_for_record(pattern), 'errors print')
507*1529Szelenkov@nginx.com
508*1529Szelenkov@nginx.com        with open(self.testdir + '/unit.log', 'r', errors='ignore') as f:
509*1529Szelenkov@nginx.com            errs = re.findall(pattern, f.read())
510*1529Szelenkov@nginx.com
511*1529Szelenkov@nginx.com            self.assertEqual(len(errs), 2, 'error_log count')
512*1529Szelenkov@nginx.com
513*1529Szelenkov@nginx.com            date = errs[0].split('[')[0]
514*1529Szelenkov@nginx.com            date2 = errs[1].split('[')[0]
515*1529Szelenkov@nginx.com            self.assertNotEqual(date, date2, 'date diff')
516*1529Szelenkov@nginx.com
5171105Szelenkov@nginx.com    def test_php_application_script(self):
5181105Szelenkov@nginx.com        self.assertIn(
5191381St.nateldemoura@f5.com            'success',
5201381St.nateldemoura@f5.com            self.conf(
5211105Szelenkov@nginx.com                {
5221105Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "applications/script"}},
5231105Szelenkov@nginx.com                    "applications": {
5241105Szelenkov@nginx.com                        "script": {
5251105Szelenkov@nginx.com                            "type": "php",
5261105Szelenkov@nginx.com                            "processes": {"spare": 0},
5271105Szelenkov@nginx.com                            "root": self.current_dir + "/php/script",
5281105Szelenkov@nginx.com                            "script": "phpinfo.php",
5291105Szelenkov@nginx.com                        }
5301105Szelenkov@nginx.com                    },
5311105Szelenkov@nginx.com                }
5321381St.nateldemoura@f5.com            ),
5331381St.nateldemoura@f5.com            'configure script',
5341105Szelenkov@nginx.com        )
5351105Szelenkov@nginx.com
5361105Szelenkov@nginx.com        resp = self.get()
5371105Szelenkov@nginx.com
5381105Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
5391105Szelenkov@nginx.com        self.assertNotEqual(resp['body'], '', 'body not empty')
5401105Szelenkov@nginx.com
5411105Szelenkov@nginx.com    def test_php_application_index_default(self):
5421105Szelenkov@nginx.com        self.assertIn(
5431381St.nateldemoura@f5.com            'success',
5441381St.nateldemoura@f5.com            self.conf(
5451105Szelenkov@nginx.com                {
5461105Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "applications/phpinfo"}},
5471105Szelenkov@nginx.com                    "applications": {
5481105Szelenkov@nginx.com                        "phpinfo": {
5491105Szelenkov@nginx.com                            "type": "php",
5501105Szelenkov@nginx.com                            "processes": {"spare": 0},
5511105Szelenkov@nginx.com                            "root": self.current_dir + "/php/phpinfo",
5521105Szelenkov@nginx.com                        }
5531105Szelenkov@nginx.com                    },
5541105Szelenkov@nginx.com                }
5551381St.nateldemoura@f5.com            ),
5561381St.nateldemoura@f5.com            'configure index default',
5571105Szelenkov@nginx.com        )
5581105Szelenkov@nginx.com
5591346St.nateldemoura@f5.com        resp = self.get()
5601346St.nateldemoura@f5.com
5611346St.nateldemoura@f5.com        self.assertEqual(resp['status'], 200, 'status')
5621346St.nateldemoura@f5.com        self.assertNotEqual(resp['body'], '', 'body not empty')
5631346St.nateldemoura@f5.com
5641346St.nateldemoura@f5.com    def test_php_application_extension_check(self):
5651346St.nateldemoura@f5.com        self.load('phpinfo')
5661346St.nateldemoura@f5.com
5671346St.nateldemoura@f5.com        self.assertNotEqual(
5681346St.nateldemoura@f5.com            self.get(url='/index.wrong')['status'], 200, 'status'
5691346St.nateldemoura@f5.com        )
570865Szelenkov@nginx.com
5711367Szelenkov@nginx.com        new_root = self.testdir + "/php"
5721367Szelenkov@nginx.com        os.mkdir(new_root)
5731367Szelenkov@nginx.com        shutil.copy(self.current_dir + '/php/phpinfo/index.wrong', new_root)
5741367Szelenkov@nginx.com
5751367Szelenkov@nginx.com        self.assertIn(
5761367Szelenkov@nginx.com            'success',
5771367Szelenkov@nginx.com            self.conf(
5781367Szelenkov@nginx.com                {
5791367Szelenkov@nginx.com                    "listeners": {"*:7080": {"pass": "applications/phpinfo"}},
5801367Szelenkov@nginx.com                    "applications": {
5811367Szelenkov@nginx.com                        "phpinfo": {
5821367Szelenkov@nginx.com                            "type": "php",
5831367Szelenkov@nginx.com                            "processes": {"spare": 0},
5841367Szelenkov@nginx.com                            "root": new_root,
5851367Szelenkov@nginx.com                            "working_directory": new_root,
5861367Szelenkov@nginx.com                        }
5871367Szelenkov@nginx.com                    },
5881367Szelenkov@nginx.com                }
5891367Szelenkov@nginx.com            ),
5901367Szelenkov@nginx.com            'configure new root',
5911367Szelenkov@nginx.com        )
5921367Szelenkov@nginx.com
5931367Szelenkov@nginx.com        resp = self.get()
5941367Szelenkov@nginx.com        self.assertNotEqual(
5951367Szelenkov@nginx.com            str(resp['status']) + resp['body'], '200', 'status new root'
5961367Szelenkov@nginx.com        )
5971367Szelenkov@nginx.com
5981381St.nateldemoura@f5.com    def run_php_application_cwd_root_tests(self):
5991381St.nateldemoura@f5.com        self.assertIn(
6001381St.nateldemoura@f5.com            'success', self.conf_delete('applications/cwd/working_directory')
6011381St.nateldemoura@f5.com        )
6021381St.nateldemoura@f5.com
6031381St.nateldemoura@f5.com        script_cwd = self.current_dir + '/php/cwd'
6041381St.nateldemoura@f5.com
6051381St.nateldemoura@f5.com        resp = self.get()
6061381St.nateldemoura@f5.com        self.assertEqual(resp['status'], 200, 'status ok')
6071381St.nateldemoura@f5.com        self.assertEqual(resp['body'], script_cwd, 'default cwd')
6081381St.nateldemoura@f5.com
6091381St.nateldemoura@f5.com        self.assertIn(
6101381St.nateldemoura@f5.com            'success',
6111381St.nateldemoura@f5.com            self.conf(
6121381St.nateldemoura@f5.com                '"' + self.current_dir + '"',
6131381St.nateldemoura@f5.com                'applications/cwd/working_directory',
6141381St.nateldemoura@f5.com            ),
6151381St.nateldemoura@f5.com        )
6161381St.nateldemoura@f5.com
6171381St.nateldemoura@f5.com        resp = self.get()
6181381St.nateldemoura@f5.com        self.assertEqual(resp['status'], 200, 'status ok')
6191381St.nateldemoura@f5.com        self.assertEqual(resp['body'], script_cwd, 'wdir cwd')
6201381St.nateldemoura@f5.com
6211381St.nateldemoura@f5.com        resp = self.get(url='/?chdir=/')
6221381St.nateldemoura@f5.com        self.assertEqual(resp['status'], 200, 'status ok')
6231381St.nateldemoura@f5.com        self.assertEqual(resp['body'], '/', 'cwd after chdir')
6241381St.nateldemoura@f5.com
6251381St.nateldemoura@f5.com        # cwd must be restored
6261381St.nateldemoura@f5.com
6271381St.nateldemoura@f5.com        resp = self.get()
6281381St.nateldemoura@f5.com        self.assertEqual(resp['status'], 200, 'status ok')
6291381St.nateldemoura@f5.com        self.assertEqual(resp['body'], script_cwd, 'cwd restored')
6301381St.nateldemoura@f5.com
6311381St.nateldemoura@f5.com        resp = self.get(url='/subdir/')
6321381St.nateldemoura@f5.com        self.assertEqual(
6331381St.nateldemoura@f5.com            resp['body'], script_cwd + '/subdir', 'cwd subdir',
6341381St.nateldemoura@f5.com        )
6351381St.nateldemoura@f5.com
6361381St.nateldemoura@f5.com    def test_php_application_cwd_root(self):
6371381St.nateldemoura@f5.com        self.load('cwd')
6381381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
6391381St.nateldemoura@f5.com
6401381St.nateldemoura@f5.com    def test_php_application_cwd_opcache_disabled(self):
6411381St.nateldemoura@f5.com        self.load('cwd')
6421381St.nateldemoura@f5.com        self.set_opcache('cwd', '0')
6431381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
6441381St.nateldemoura@f5.com
6451381St.nateldemoura@f5.com    def test_php_application_cwd_opcache_enabled(self):
6461381St.nateldemoura@f5.com        self.load('cwd')
6471381St.nateldemoura@f5.com        self.set_opcache('cwd', '1')
6481381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
6491381St.nateldemoura@f5.com
6501381St.nateldemoura@f5.com    def run_php_application_cwd_script_tests(self):
6511381St.nateldemoura@f5.com        self.load('cwd')
6521381St.nateldemoura@f5.com
6531381St.nateldemoura@f5.com        script_cwd = self.current_dir + '/php/cwd'
6541381St.nateldemoura@f5.com
6551381St.nateldemoura@f5.com        self.assertIn(
6561381St.nateldemoura@f5.com            'success', self.conf_delete('applications/cwd/working_directory')
6571381St.nateldemoura@f5.com        )
6581381St.nateldemoura@f5.com
6591381St.nateldemoura@f5.com        self.assertIn(
6601381St.nateldemoura@f5.com            'success', self.conf('"index.php"', 'applications/cwd/script')
6611381St.nateldemoura@f5.com        )
6621381St.nateldemoura@f5.com
6631381St.nateldemoura@f5.com        self.assertEqual(
6641381St.nateldemoura@f5.com            self.get()['body'], script_cwd, 'default cwd',
6651381St.nateldemoura@f5.com        )
6661381St.nateldemoura@f5.com
6671381St.nateldemoura@f5.com        self.assertEqual(
6681381St.nateldemoura@f5.com            self.get(url='/?chdir=/')['body'], '/', 'cwd after chdir',
6691381St.nateldemoura@f5.com        )
6701381St.nateldemoura@f5.com
6711381St.nateldemoura@f5.com        # cwd must be restored
6721381St.nateldemoura@f5.com        self.assertEqual(self.get()['body'], script_cwd, 'cwd restored')
6731381St.nateldemoura@f5.com
6741381St.nateldemoura@f5.com    def test_php_application_cwd_script(self):
6751381St.nateldemoura@f5.com        self.load('cwd')
6761381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6771381St.nateldemoura@f5.com
6781381St.nateldemoura@f5.com    def test_php_application_cwd_script_opcache_disabled(self):
6791381St.nateldemoura@f5.com        self.load('cwd')
6801381St.nateldemoura@f5.com        self.set_opcache('cwd', '0')
6811381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6821381St.nateldemoura@f5.com
6831381St.nateldemoura@f5.com    def test_php_application_cwd_script_opcache_enabled(self):
6841381St.nateldemoura@f5.com        self.load('cwd')
6851381St.nateldemoura@f5.com        self.set_opcache('cwd', '1')
6861381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6871381St.nateldemoura@f5.com
6881381St.nateldemoura@f5.com    def test_php_application_path_relative(self):
6891381St.nateldemoura@f5.com        self.load('open')
6901381St.nateldemoura@f5.com
6911381St.nateldemoura@f5.com        self.assertEqual(self.get()['body'], 'test', 'relative path')
6921381St.nateldemoura@f5.com
6931381St.nateldemoura@f5.com        self.assertNotEqual(
6941381St.nateldemoura@f5.com            self.get(url='/?chdir=/')['body'], 'test', 'relative path w/ chdir'
6951381St.nateldemoura@f5.com        )
6961381St.nateldemoura@f5.com
6971381St.nateldemoura@f5.com        self.assertEqual(self.get()['body'], 'test', 'relative path 2')
6981381St.nateldemoura@f5.com
6991367Szelenkov@nginx.com
700675Szelenkov@nginx.comif __name__ == '__main__':
7011019Szelenkov@nginx.com    TestPHPApplication.main()
702