11367Szelenkov@nginx.comimport os
21529Szelenkov@nginx.comimport re
31367Szelenkov@nginx.comimport shutil
41529Szelenkov@nginx.comimport time
51477Szelenkov@nginx.com
61635Szelenkov@nginx.comimport pytest
71635Szelenkov@nginx.com
81635Szelenkov@nginx.comfrom conftest import option
91019Szelenkov@nginx.comfrom unit.applications.lang.php import TestApplicationPHP
10675Szelenkov@nginx.com
111019Szelenkov@nginx.comclass TestPHPApplication(TestApplicationPHP):
121467Szelenkov@nginx.com    prerequisites = {'modules': {'php': 'all'}}
13675Szelenkov@nginx.com
14982Szelenkov@nginx.com    def before_disable_functions(self):
15982Szelenkov@nginx.com        body = self.get()['body']
16982Szelenkov@nginx.com
171596Szelenkov@nginx.com        assert re.search(r'time: \d+', body), 'disable_functions before time'
181596Szelenkov@nginx.com        assert re.search(r'exec: \/\w+', body), 'disable_functions before exec'
19865Szelenkov@nginx.com
201381St.nateldemoura@f5.com    def set_opcache(self, app, val):
211596Szelenkov@nginx.com        assert 'success' in self.conf(
221596Szelenkov@nginx.com            {"admin": {"opcache.enable": val, "opcache.enable_cli": val,},},
231596Szelenkov@nginx.com            'applications/' + app + '/options',
241381St.nateldemoura@f5.com        )
251381St.nateldemoura@f5.com
261381St.nateldemoura@f5.com        opcache = self.get()['headers']['X-OPcache']
271381St.nateldemoura@f5.com
281381St.nateldemoura@f5.com        if not opcache or opcache == '-1':
291596Szelenkov@nginx.com            pytest.skip('opcache is not supported')
301381St.nateldemoura@f5.com
311596Szelenkov@nginx.com        assert opcache == val, 'opcache value'
321381St.nateldemoura@f5.com
33675Szelenkov@nginx.com    def test_php_application_variables(self):
34675Szelenkov@nginx.com        self.load('variables')
35675Szelenkov@nginx.com
36675Szelenkov@nginx.com        body = 'Test body string.'
37675Szelenkov@nginx.com
381017Szelenkov@nginx.com        resp = self.post(
391017Szelenkov@nginx.com            headers={
401017Szelenkov@nginx.com                'Host': 'localhost',
411017Szelenkov@nginx.com                'Content-Type': 'text/html',
421017Szelenkov@nginx.com                'Custom-Header': 'blah',
431017Szelenkov@nginx.com                'Connection': 'close',
441017Szelenkov@nginx.com            },
451017Szelenkov@nginx.com            body=body,
461596Szelenkov@nginx.com            url='/index.php/blah?var=val',
471017Szelenkov@nginx.com        )
48675Szelenkov@nginx.com
491596Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
50675Szelenkov@nginx.com        headers = resp['headers']
51675Szelenkov@nginx.com        header_server = headers.pop('Server')
521596Szelenkov@nginx.com        assert re.search(r'Unit/[\d\.]+', header_server), 'server header'
531596Szelenkov@nginx.com        assert (
541596Szelenkov@nginx.com            headers.pop('Server-Software') == header_server
551596Szelenkov@nginx.com        ), 'server software header'
56675Szelenkov@nginx.com
57675Szelenkov@nginx.com        date = headers.pop('Date')
581596Szelenkov@nginx.com        assert date[-4:] == ' GMT', 'date header timezone'
591596Szelenkov@nginx.com        assert (
601596Szelenkov@nginx.com            abs(self.date_to_sec_epoch(date) - self.sec_epoch()) < 5
611596Szelenkov@nginx.com        ), 'date header'
62675Szelenkov@nginx.com
63675Szelenkov@nginx.com        if 'X-Powered-By' in headers:
64675Szelenkov@nginx.com            headers.pop('X-Powered-By')
65675Szelenkov@nginx.com
66675Szelenkov@nginx.com        headers.pop('Content-type')
671596Szelenkov@nginx.com        assert headers == {
681596Szelenkov@nginx.com            'Connection': 'close',
691596Szelenkov@nginx.com            'Content-Length': str(len(body)),
701596Szelenkov@nginx.com            'Request-Method': 'POST',
711596Szelenkov@nginx.com            'Path-Info': '/blah',
721596Szelenkov@nginx.com            'Request-Uri': '/index.php/blah?var=val',
731596Szelenkov@nginx.com            'Http-Host': 'localhost',
741596Szelenkov@nginx.com            'Server-Protocol': 'HTTP/1.1',
751596Szelenkov@nginx.com            'Custom-Header': 'blah',
761596Szelenkov@nginx.com        }, 'headers'
771596Szelenkov@nginx.com        assert resp['body'] == body, 'body'
78675Szelenkov@nginx.com
79894Szelenkov@nginx.com    def test_php_application_query_string(self):
80894Szelenkov@nginx.com        self.load('query_string')
81894Szelenkov@nginx.com
82894Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
83894Szelenkov@nginx.com
841596Szelenkov@nginx.com        assert (
851596Szelenkov@nginx.com            resp['headers']['Query-String'] == 'var1=val1&var2=val2'
861596Szelenkov@nginx.com        ), 'query string'
87894Szelenkov@nginx.com
88894Szelenkov@nginx.com    def test_php_application_query_string_empty(self):
89894Szelenkov@nginx.com        self.load('query_string')
90894Szelenkov@nginx.com
91894Szelenkov@nginx.com        resp = self.get(url='/?')
92894Szelenkov@nginx.com
931596Szelenkov@nginx.com        assert resp['status'] == 200, 'query string empty status'
941596Szelenkov@nginx.com        assert resp['headers']['Query-String'] == '', 'query string empty'
95894Szelenkov@nginx.com
96894Szelenkov@nginx.com    def test_php_application_query_string_absent(self):
97894Szelenkov@nginx.com        self.load('query_string')
98894Szelenkov@nginx.com
99894Szelenkov@nginx.com        resp = self.get()
100894Szelenkov@nginx.com
1011596Szelenkov@nginx.com        assert resp['status'] == 200, 'query string absent status'
1021596Szelenkov@nginx.com        assert resp['headers']['Query-String'] == '', 'query string absent'
103894Szelenkov@nginx.com
104675Szelenkov@nginx.com    def test_php_application_phpinfo(self):
105675Szelenkov@nginx.com        self.load('phpinfo')
106675Szelenkov@nginx.com
107675Szelenkov@nginx.com        resp = self.get()
108675Szelenkov@nginx.com
1091596Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
1101596Szelenkov@nginx.com        assert resp['body'] != '', 'body not empty'
111675Szelenkov@nginx.com
1121090Svbart@nginx.com    def test_php_application_header_status(self):
1131090Svbart@nginx.com        self.load('header')
1141090Svbart@nginx.com
1151596Szelenkov@nginx.com        assert (
1161090Svbart@nginx.com            self.get(
1171090Svbart@nginx.com                headers={
1181090Svbart@nginx.com                    'Host': 'localhost',
1191090Svbart@nginx.com                    'Connection': 'close',
1201090Svbart@nginx.com                    'X-Header': 'HTTP/1.1 404 Not Found',
1211090Svbart@nginx.com                }
1221596Szelenkov@nginx.com            )['status']
1231596Szelenkov@nginx.com            == 404
1241596Szelenkov@nginx.com        ), 'status'
1251090Svbart@nginx.com
1261596Szelenkov@nginx.com        assert (
1271090Svbart@nginx.com            self.get(
1281090Svbart@nginx.com                headers={
1291090Svbart@nginx.com                    'Host': 'localhost',
1301090Svbart@nginx.com                    'Connection': 'close',
1311090Svbart@nginx.com                    'X-Header': 'http/1.1 404 Not Found',
1321090Svbart@nginx.com                }
1331596Szelenkov@nginx.com            )['status']
1341596Szelenkov@nginx.com            == 404
1351596Szelenkov@nginx.com        ), 'status case insensitive'
1361090Svbart@nginx.com
1371596Szelenkov@nginx.com        assert (
1381090Svbart@nginx.com            self.get(
1391090Svbart@nginx.com                headers={
1401090Svbart@nginx.com                    'Host': 'localhost',
1411090Svbart@nginx.com                    'Connection': 'close',
1421090Svbart@nginx.com                    'X-Header': 'HTTP/ 404 Not Found',
1431090Svbart@nginx.com                }
1441596Szelenkov@nginx.com            )['status']
1451596Szelenkov@nginx.com            == 404
1461596Szelenkov@nginx.com        ), 'status version empty'
1471090Svbart@nginx.com
148675Szelenkov@nginx.com    def test_php_application_404(self):
149675Szelenkov@nginx.com        self.load('404')
150675Szelenkov@nginx.com
151675Szelenkov@nginx.com        resp = self.get()
152675Szelenkov@nginx.com
1531596Szelenkov@nginx.com        assert resp['status'] == 404, '404 status'
1541596Szelenkov@nginx.com        assert re.search(
1551596Szelenkov@nginx.com            r'<title>404 Not Found</title>', resp['body']
1561596Szelenkov@nginx.com        ), '404 body'
157675Szelenkov@nginx.com
158675Szelenkov@nginx.com    def test_php_application_keepalive_body(self):
159675Szelenkov@nginx.com        self.load('mirror')
160675Szelenkov@nginx.com
1611596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'init'
1621029Szelenkov@nginx.com
1631453Szelenkov@nginx.com        body = '0123456789' * 500
1641017Szelenkov@nginx.com        (resp, sock) = self.post(
1651017Szelenkov@nginx.com            headers={
1661017Szelenkov@nginx.com                'Host': 'localhost',
1671017Szelenkov@nginx.com                'Connection': 'keep-alive',
1681017Szelenkov@nginx.com                'Content-Type': 'text/html',
1691017Szelenkov@nginx.com            },
1701017Szelenkov@nginx.com            start=True,
1711453Szelenkov@nginx.com            body=body,
1721029Szelenkov@nginx.com            read_timeout=1,
1731017Szelenkov@nginx.com        )
174675Szelenkov@nginx.com
1751596Szelenkov@nginx.com        assert resp['body'] == body, 'keep-alive 1'
176675Szelenkov@nginx.com
1771453Szelenkov@nginx.com        body = '0123456789'
1781017Szelenkov@nginx.com        resp = self.post(
1791017Szelenkov@nginx.com            headers={
1801017Szelenkov@nginx.com                'Host': 'localhost',
1811017Szelenkov@nginx.com                'Connection': 'close',
1821017Szelenkov@nginx.com                'Content-Type': 'text/html',
1831017Szelenkov@nginx.com            },
1841017Szelenkov@nginx.com            sock=sock,
1851453Szelenkov@nginx.com            body=body,
1861017Szelenkov@nginx.com        )
187675Szelenkov@nginx.com
1881596Szelenkov@nginx.com        assert resp['body'] == body, 'keep-alive 2'
189675Szelenkov@nginx.com
190675Szelenkov@nginx.com    def test_php_application_conditional(self):
191675Szelenkov@nginx.com        self.load('conditional')
192675Szelenkov@nginx.com
1931596Szelenkov@nginx.com        assert re.search(r'True', self.get()['body']), 'conditional true'
1941596Szelenkov@nginx.com        assert re.search(r'False', self.post()['body']), 'conditional false'
195675Szelenkov@nginx.com
196675Szelenkov@nginx.com    def test_php_application_get_variables(self):
197675Szelenkov@nginx.com        self.load('get_variables')
198675Szelenkov@nginx.com
199675Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=&var3')
2001596Szelenkov@nginx.com        assert resp['headers']['X-Var-1'] == 'val1', 'GET variables'
201*1636Svbart@nginx.com        assert resp['headers']['X-Var-2'] == '', 'GET variables 2'
202*1636Svbart@nginx.com        assert resp['headers']['X-Var-3'] == '', 'GET variables 3'
203*1636Svbart@nginx.com        assert resp['headers']['X-Var-4'] == 'not set', 'GET variables 4'
204675Szelenkov@nginx.com
205675Szelenkov@nginx.com    def test_php_application_post_variables(self):
206675Szelenkov@nginx.com        self.load('post_variables')
207675Szelenkov@nginx.com
2081017Szelenkov@nginx.com        resp = self.post(
2091017Szelenkov@nginx.com            headers={
2101017Szelenkov@nginx.com                'Content-Type': 'application/x-www-form-urlencoded',
2111017Szelenkov@nginx.com                'Host': 'localhost',
2121017Szelenkov@nginx.com                'Connection': 'close',
2131017Szelenkov@nginx.com            },
2141017Szelenkov@nginx.com            body='var1=val1&var2=',
2151017Szelenkov@nginx.com        )
2161596Szelenkov@nginx.com        assert resp['headers']['X-Var-1'] == 'val1', 'POST variables'
217*1636Svbart@nginx.com        assert resp['headers']['X-Var-2'] == '', 'POST variables 2'
218*1636Svbart@nginx.com        assert resp['headers']['X-Var-3'] == 'not set', 'POST variables 3'
219675Szelenkov@nginx.com
220675Szelenkov@nginx.com    def test_php_application_cookies(self):
221675Szelenkov@nginx.com        self.load('cookies')
222675Szelenkov@nginx.com
2231017Szelenkov@nginx.com        resp = self.get(
2241017Szelenkov@nginx.com            headers={
2251017Szelenkov@nginx.com                'Cookie': 'var=val; var2=val2',
2261017Szelenkov@nginx.com                'Host': 'localhost',
2271017Szelenkov@nginx.com                'Connection': 'close',
2281017Szelenkov@nginx.com            }
2291017Szelenkov@nginx.com        )
230675Szelenkov@nginx.com
2311596Szelenkov@nginx.com        assert resp['headers']['X-Cookie-1'] == 'val', 'cookie'
2321596Szelenkov@nginx.com        assert resp['headers']['X-Cookie-2'] == 'val2', 'cookie'
233675Szelenkov@nginx.com
234692Szelenkov@nginx.com    def test_php_application_ini_precision(self):
235692Szelenkov@nginx.com        self.load('ini_precision')
236692Szelenkov@nginx.com
2371596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] != '4', 'ini value default'
2381017Szelenkov@nginx.com
2391017Szelenkov@nginx.com        self.conf(
2401017Szelenkov@nginx.com            {"file": "ini/php.ini"}, 'applications/ini_precision/options'
2411017Szelenkov@nginx.com        )
242692Szelenkov@nginx.com
2431596Szelenkov@nginx.com        assert (
2441596Szelenkov@nginx.com            self.get()['headers']['X-File']
2451596Szelenkov@nginx.com            == option.test_dir + '/php/ini_precision/ini/php.ini'
2461596Szelenkov@nginx.com        ), 'ini file'
2471596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '4', 'ini value'
248692Szelenkov@nginx.com
2491596Szelenkov@nginx.com    @pytest.mark.skip('not yet')
250721Szelenkov@nginx.com    def test_php_application_ini_admin_user(self):
251721Szelenkov@nginx.com        self.load('ini_precision')
252721Szelenkov@nginx.com
2531596Szelenkov@nginx.com        assert 'error' in self.conf(
2541596Szelenkov@nginx.com            {"user": {"precision": "4"}, "admin": {"precision": "5"}},
2551596Szelenkov@nginx.com            'applications/ini_precision/options',
2561596Szelenkov@nginx.com        ), 'ini admin user'
257721Szelenkov@nginx.com
258721Szelenkov@nginx.com    def test_php_application_ini_admin(self):
259721Szelenkov@nginx.com        self.load('ini_precision')
260721Szelenkov@nginx.com
2611017Szelenkov@nginx.com        self.conf(
2621017Szelenkov@nginx.com            {"file": "php.ini", "admin": {"precision": "5"}},
2631017Szelenkov@nginx.com            'applications/ini_precision/options',
2641017Szelenkov@nginx.com        )
265721Szelenkov@nginx.com
2661596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '5', 'ini value admin'
267721Szelenkov@nginx.com
268721Szelenkov@nginx.com    def test_php_application_ini_user(self):
269721Szelenkov@nginx.com        self.load('ini_precision')
270721Szelenkov@nginx.com
2711017Szelenkov@nginx.com        self.conf(
2721017Szelenkov@nginx.com            {"file": "php.ini", "user": {"precision": "5"}},
2731017Szelenkov@nginx.com            'applications/ini_precision/options',
2741017Szelenkov@nginx.com        )
275721Szelenkov@nginx.com
2761596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '5', 'ini value user'
277721Szelenkov@nginx.com
278721Szelenkov@nginx.com    def test_php_application_ini_user_2(self):
279721Szelenkov@nginx.com        self.load('ini_precision')
280721Szelenkov@nginx.com
2811017Szelenkov@nginx.com        self.conf(
2821017Szelenkov@nginx.com            {"file": "ini/php.ini"}, 'applications/ini_precision/options'
2831017Szelenkov@nginx.com        )
284721Szelenkov@nginx.com
2851596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '4', 'ini user file'
286721Szelenkov@nginx.com
2871017Szelenkov@nginx.com        self.conf(
2881017Szelenkov@nginx.com            {"precision": "5"}, 'applications/ini_precision/options/user'
2891017Szelenkov@nginx.com        )
290721Szelenkov@nginx.com
2911596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '5', 'ini value user'
292721Szelenkov@nginx.com
293721Szelenkov@nginx.com    def test_php_application_ini_set_admin(self):
294721Szelenkov@nginx.com        self.load('ini_precision')
295721Szelenkov@nginx.com
2961017Szelenkov@nginx.com        self.conf(
2971017Szelenkov@nginx.com            {"admin": {"precision": "5"}}, 'applications/ini_precision/options'
2981017Szelenkov@nginx.com        )
299721Szelenkov@nginx.com
3001596Szelenkov@nginx.com        assert (
3011596Szelenkov@nginx.com            self.get(url='/?precision=6')['headers']['X-Precision'] == '5'
3021596Szelenkov@nginx.com        ), 'ini set admin'
303721Szelenkov@nginx.com
304721Szelenkov@nginx.com    def test_php_application_ini_set_user(self):
305721Szelenkov@nginx.com        self.load('ini_precision')
306721Szelenkov@nginx.com
3071017Szelenkov@nginx.com        self.conf(
3081017Szelenkov@nginx.com            {"user": {"precision": "5"}}, 'applications/ini_precision/options'
3091017Szelenkov@nginx.com        )
310721Szelenkov@nginx.com
3111596Szelenkov@nginx.com        assert (
3121596Szelenkov@nginx.com            self.get(url='/?precision=6')['headers']['X-Precision'] == '6'
3131596Szelenkov@nginx.com        ), 'ini set user'
314721Szelenkov@nginx.com
315721Szelenkov@nginx.com    def test_php_application_ini_repeat(self):
316721Szelenkov@nginx.com        self.load('ini_precision')
317721Szelenkov@nginx.com
3181017Szelenkov@nginx.com        self.conf(
3191017Szelenkov@nginx.com            {"user": {"precision": "5"}}, 'applications/ini_precision/options'
3201017Szelenkov@nginx.com        )
321721Szelenkov@nginx.com
3221596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '5', 'ini value'
323721Szelenkov@nginx.com
3241596Szelenkov@nginx.com        assert self.get()['headers']['X-Precision'] == '5', 'ini value repeat'
325721Szelenkov@nginx.com
326865Szelenkov@nginx.com    def test_php_application_disable_functions_exec(self):
327982Szelenkov@nginx.com        self.load('time_exec')
328982Szelenkov@nginx.com
329982Szelenkov@nginx.com        self.before_disable_functions()
330865Szelenkov@nginx.com
3311017Szelenkov@nginx.com        self.conf(
3321017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec"}},
3331017Szelenkov@nginx.com            'applications/time_exec/options',
3341017Szelenkov@nginx.com        )
335865Szelenkov@nginx.com
336982Szelenkov@nginx.com        body = self.get()['body']
337865Szelenkov@nginx.com
3381596Szelenkov@nginx.com        assert re.search(r'time: \d+', body), 'disable_functions time'
3391596Szelenkov@nginx.com        assert not re.search(r'exec: \/\w+', body), 'disable_functions exec'
340865Szelenkov@nginx.com
341865Szelenkov@nginx.com    def test_php_application_disable_functions_comma(self):
342982Szelenkov@nginx.com        self.load('time_exec')
343865Szelenkov@nginx.com
344982Szelenkov@nginx.com        self.before_disable_functions()
345865Szelenkov@nginx.com
3461017Szelenkov@nginx.com        self.conf(
3471017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec,time"}},
3481017Szelenkov@nginx.com            'applications/time_exec/options',
3491017Szelenkov@nginx.com        )
350865Szelenkov@nginx.com
351982Szelenkov@nginx.com        body = self.get()['body']
352982Szelenkov@nginx.com
3531596Szelenkov@nginx.com        assert not re.search(
3541596Szelenkov@nginx.com            r'time: \d+', body
3551596Szelenkov@nginx.com        ), 'disable_functions comma time'
3561596Szelenkov@nginx.com        assert not re.search(
3571596Szelenkov@nginx.com            r'exec: \/\w+', body
3581596Szelenkov@nginx.com        ), 'disable_functions comma exec'
359865Szelenkov@nginx.com
360865Szelenkov@nginx.com    def test_php_application_disable_functions_space(self):
361982Szelenkov@nginx.com        self.load('time_exec')
362865Szelenkov@nginx.com
363982Szelenkov@nginx.com        self.before_disable_functions()
364865Szelenkov@nginx.com
3651017Szelenkov@nginx.com        self.conf(
3661017Szelenkov@nginx.com            {"admin": {"disable_functions": "exec time"}},
3671017Szelenkov@nginx.com            'applications/time_exec/options',
3681017Szelenkov@nginx.com        )
369865Szelenkov@nginx.com
370982Szelenkov@nginx.com        body = self.get()['body']
371982Szelenkov@nginx.com
3721596Szelenkov@nginx.com        assert not re.search(
3731596Szelenkov@nginx.com            r'time: \d+', body
3741596Szelenkov@nginx.com        ), 'disable_functions space time'
3751596Szelenkov@nginx.com        assert not re.search(
3761596Szelenkov@nginx.com            r'exec: \/\w+', body
3771596Szelenkov@nginx.com        ), 'disable_functions space exec'
378865Szelenkov@nginx.com
379865Szelenkov@nginx.com    def test_php_application_disable_functions_user(self):
380982Szelenkov@nginx.com        self.load('time_exec')
381982Szelenkov@nginx.com
382982Szelenkov@nginx.com        self.before_disable_functions()
383865Szelenkov@nginx.com
3841017Szelenkov@nginx.com        self.conf(
3851017Szelenkov@nginx.com            {"user": {"disable_functions": "exec"}},
3861017Szelenkov@nginx.com            'applications/time_exec/options',
3871017Szelenkov@nginx.com        )
388865Szelenkov@nginx.com
389982Szelenkov@nginx.com        body = self.get()['body']
390982Szelenkov@nginx.com
3911596Szelenkov@nginx.com        assert re.search(r'time: \d+', body), 'disable_functions user time'
3921596Szelenkov@nginx.com        assert not re.search(
3931596Szelenkov@nginx.com            r'exec: \/\w+', body
3941596Szelenkov@nginx.com        ), 'disable_functions user exec'
395865Szelenkov@nginx.com
396865Szelenkov@nginx.com    def test_php_application_disable_functions_nonexistent(self):
397982Szelenkov@nginx.com        self.load('time_exec')
398982Szelenkov@nginx.com
399982Szelenkov@nginx.com        self.before_disable_functions()
400865Szelenkov@nginx.com
4011017Szelenkov@nginx.com        self.conf(
4021017Szelenkov@nginx.com            {"admin": {"disable_functions": "blah"}},
4031017Szelenkov@nginx.com            'applications/time_exec/options',
4041017Szelenkov@nginx.com        )
405865Szelenkov@nginx.com
406982Szelenkov@nginx.com        body = self.get()['body']
407865Szelenkov@nginx.com
4081596Szelenkov@nginx.com        assert re.search(
4091596Szelenkov@nginx.com            r'time: \d+', body
4101596Szelenkov@nginx.com        ), 'disable_functions nonexistent time'
4111596Szelenkov@nginx.com        assert re.search(
4121596Szelenkov@nginx.com            r'exec: \/\w+', body
4131596Szelenkov@nginx.com        ), 'disable_functions nonexistent exec'
414865Szelenkov@nginx.com
415865Szelenkov@nginx.com    def test_php_application_disable_classes(self):
416865Szelenkov@nginx.com        self.load('date_time')
417865Szelenkov@nginx.com
4181596Szelenkov@nginx.com        assert re.search(
4191596Szelenkov@nginx.com            r'012345', self.get()['body']
4201596Szelenkov@nginx.com        ), 'disable_classes before'
421865Szelenkov@nginx.com
4221017Szelenkov@nginx.com        self.conf(
4231017Szelenkov@nginx.com            {"admin": {"disable_classes": "DateTime"}},
4241017Szelenkov@nginx.com            'applications/date_time/options',
4251017Szelenkov@nginx.com        )
426865Szelenkov@nginx.com
4271596Szelenkov@nginx.com        assert not re.search(
4281596Szelenkov@nginx.com            r'012345', self.get()['body']
4291596Szelenkov@nginx.com        ), 'disable_classes before'
430865Szelenkov@nginx.com
431865Szelenkov@nginx.com    def test_php_application_disable_classes_user(self):
432865Szelenkov@nginx.com        self.load('date_time')
433865Szelenkov@nginx.com
4341596Szelenkov@nginx.com        assert re.search(
4351596Szelenkov@nginx.com            r'012345', self.get()['body']
4361596Szelenkov@nginx.com        ), 'disable_classes before'
437982Szelenkov@nginx.com
4381017Szelenkov@nginx.com        self.conf(
4391017Szelenkov@nginx.com            {"user": {"disable_classes": "DateTime"}},
4401017Szelenkov@nginx.com            'applications/date_time/options',
4411017Szelenkov@nginx.com        )
442865Szelenkov@nginx.com
4431596Szelenkov@nginx.com        assert not re.search(
4441596Szelenkov@nginx.com            r'012345', self.get()['body']
4451596Szelenkov@nginx.com        ), 'disable_classes before'
4461017Szelenkov@nginx.com
4471529Szelenkov@nginx.com    def test_php_application_error_log(self):
4481529Szelenkov@nginx.com        self.load('error_log')
4491529Szelenkov@nginx.com
4501596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'status'
4511529Szelenkov@nginx.com
4521529Szelenkov@nginx.com        time.sleep(1)
4531529Szelenkov@nginx.com
4541596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'status 2'
4551529Szelenkov@nginx.com
4561529Szelenkov@nginx.com        self.stop()
4571529Szelenkov@nginx.com
4581529Szelenkov@nginx.com        pattern = r'\d{4}\/\d\d\/\d\d\s\d\d:.+\[notice\].+Error in application'
4591529Szelenkov@nginx.com
4601596Szelenkov@nginx.com        assert self.wait_for_record(pattern) is not None, 'errors print'
4611529Szelenkov@nginx.com
4621596Szelenkov@nginx.com        with open(self.temp_dir + '/unit.log', 'r', errors='ignore') as f:
4631529Szelenkov@nginx.com            errs = re.findall(pattern, f.read())
4641529Szelenkov@nginx.com
4651596Szelenkov@nginx.com            assert len(errs) == 2, 'error_log count'
4661529Szelenkov@nginx.com
4671529Szelenkov@nginx.com            date = errs[0].split('[')[0]
4681529Szelenkov@nginx.com            date2 = errs[1].split('[')[0]
4691596Szelenkov@nginx.com            assert date != date2, 'date diff'
4701529Szelenkov@nginx.com
4711105Szelenkov@nginx.com    def test_php_application_script(self):
4721596Szelenkov@nginx.com        assert 'success' in self.conf(
4731596Szelenkov@nginx.com            {
4741596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "applications/script"}},
4751596Szelenkov@nginx.com                "applications": {
4761596Szelenkov@nginx.com                    "script": {
4771596Szelenkov@nginx.com                        "type": "php",
4781596Szelenkov@nginx.com                        "processes": {"spare": 0},
4791596Szelenkov@nginx.com                        "root": option.test_dir + "/php/script",
4801596Szelenkov@nginx.com                        "script": "phpinfo.php",
4811596Szelenkov@nginx.com                    }
4821596Szelenkov@nginx.com                },
4831596Szelenkov@nginx.com            }
4841596Szelenkov@nginx.com        ), 'configure script'
4851105Szelenkov@nginx.com
4861105Szelenkov@nginx.com        resp = self.get()
4871105Szelenkov@nginx.com
4881596Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
4891596Szelenkov@nginx.com        assert resp['body'] != '', 'body not empty'
4901105Szelenkov@nginx.com
4911105Szelenkov@nginx.com    def test_php_application_index_default(self):
4921596Szelenkov@nginx.com        assert 'success' in self.conf(
4931596Szelenkov@nginx.com            {
4941596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "applications/phpinfo"}},
4951596Szelenkov@nginx.com                "applications": {
4961596Szelenkov@nginx.com                    "phpinfo": {
4971596Szelenkov@nginx.com                        "type": "php",
4981596Szelenkov@nginx.com                        "processes": {"spare": 0},
4991596Szelenkov@nginx.com                        "root": option.test_dir + "/php/phpinfo",
5001596Szelenkov@nginx.com                    }
5011596Szelenkov@nginx.com                },
5021596Szelenkov@nginx.com            }
5031596Szelenkov@nginx.com        ), 'configure index default'
5041105Szelenkov@nginx.com
5051346St.nateldemoura@f5.com        resp = self.get()
5061346St.nateldemoura@f5.com
5071596Szelenkov@nginx.com        assert resp['status'] == 200, 'status'
5081596Szelenkov@nginx.com        assert resp['body'] != '', 'body not empty'
5091346St.nateldemoura@f5.com
5101346St.nateldemoura@f5.com    def test_php_application_extension_check(self):
5111346St.nateldemoura@f5.com        self.load('phpinfo')
5121346St.nateldemoura@f5.com
5131596Szelenkov@nginx.com        assert self.get(url='/index.wrong')['status'] != 200, 'status'
5141596Szelenkov@nginx.com
5151596Szelenkov@nginx.com        new_root = self.temp_dir + "/php"
5161596Szelenkov@nginx.com        os.mkdir(new_root)
5171596Szelenkov@nginx.com        shutil.copy(option.test_dir + '/php/phpinfo/index.wrong', new_root)
5181596Szelenkov@nginx.com
5191596Szelenkov@nginx.com        assert 'success' in self.conf(
5201596Szelenkov@nginx.com            {
5211596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "applications/phpinfo"}},
5221596Szelenkov@nginx.com                "applications": {
5231596Szelenkov@nginx.com                    "phpinfo": {
5241596Szelenkov@nginx.com                        "type": "php",
5251596Szelenkov@nginx.com                        "processes": {"spare": 0},
5261596Szelenkov@nginx.com                        "root": new_root,
5271596Szelenkov@nginx.com                        "working_directory": new_root,
5281596Szelenkov@nginx.com                    }
5291596Szelenkov@nginx.com                },
5301596Szelenkov@nginx.com            }
5311596Szelenkov@nginx.com        ), 'configure new root'
5321596Szelenkov@nginx.com
5331596Szelenkov@nginx.com        resp = self.get()
5341596Szelenkov@nginx.com        assert str(resp['status']) + resp['body'] != '200', 'status new root'
5351596Szelenkov@nginx.com
5361596Szelenkov@nginx.com    def run_php_application_cwd_root_tests(self):
5371596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
5381596Szelenkov@nginx.com            'applications/cwd/working_directory'
5391346St.nateldemoura@f5.com        )
540865Szelenkov@nginx.com
5411596Szelenkov@nginx.com        script_cwd = option.test_dir + '/php/cwd'
5421367Szelenkov@nginx.com
5431596Szelenkov@nginx.com        resp = self.get()
5441596Szelenkov@nginx.com        assert resp['status'] == 200, 'status ok'
5451596Szelenkov@nginx.com        assert resp['body'] == script_cwd, 'default cwd'
5461596Szelenkov@nginx.com
5471596Szelenkov@nginx.com        assert 'success' in self.conf(
5481596Szelenkov@nginx.com            '"' + option.test_dir + '"', 'applications/cwd/working_directory',
5491367Szelenkov@nginx.com        )
5501367Szelenkov@nginx.com
5511367Szelenkov@nginx.com        resp = self.get()
5521596Szelenkov@nginx.com        assert resp['status'] == 200, 'status ok'
5531596Szelenkov@nginx.com        assert resp['body'] == script_cwd, 'wdir cwd'
5541381St.nateldemoura@f5.com
5551381St.nateldemoura@f5.com        resp = self.get(url='/?chdir=/')
5561596Szelenkov@nginx.com        assert resp['status'] == 200, 'status ok'
5571596Szelenkov@nginx.com        assert resp['body'] == '/', 'cwd after chdir'
5581381St.nateldemoura@f5.com
5591381St.nateldemoura@f5.com        # cwd must be restored
5601381St.nateldemoura@f5.com
5611381St.nateldemoura@f5.com        resp = self.get()
5621596Szelenkov@nginx.com        assert resp['status'] == 200, 'status ok'
5631596Szelenkov@nginx.com        assert resp['body'] == script_cwd, 'cwd restored'
5641381St.nateldemoura@f5.com
5651381St.nateldemoura@f5.com        resp = self.get(url='/subdir/')
5661596Szelenkov@nginx.com        assert resp['body'] == script_cwd + '/subdir', 'cwd subdir'
5671381St.nateldemoura@f5.com
5681381St.nateldemoura@f5.com    def test_php_application_cwd_root(self):
5691381St.nateldemoura@f5.com        self.load('cwd')
5701381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
5711381St.nateldemoura@f5.com
5721381St.nateldemoura@f5.com    def test_php_application_cwd_opcache_disabled(self):
5731381St.nateldemoura@f5.com        self.load('cwd')
5741381St.nateldemoura@f5.com        self.set_opcache('cwd', '0')
5751381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
5761381St.nateldemoura@f5.com
5771381St.nateldemoura@f5.com    def test_php_application_cwd_opcache_enabled(self):
5781381St.nateldemoura@f5.com        self.load('cwd')
5791381St.nateldemoura@f5.com        self.set_opcache('cwd', '1')
5801381St.nateldemoura@f5.com        self.run_php_application_cwd_root_tests()
5811381St.nateldemoura@f5.com
5821381St.nateldemoura@f5.com    def run_php_application_cwd_script_tests(self):
5831381St.nateldemoura@f5.com        self.load('cwd')
5841381St.nateldemoura@f5.com
5851596Szelenkov@nginx.com        script_cwd = option.test_dir + '/php/cwd'
5861381St.nateldemoura@f5.com
5871596Szelenkov@nginx.com        assert 'success' in self.conf_delete(
5881596Szelenkov@nginx.com            'applications/cwd/working_directory'
5891381St.nateldemoura@f5.com        )
5901381St.nateldemoura@f5.com
5911596Szelenkov@nginx.com        assert 'success' in self.conf('"index.php"', 'applications/cwd/script')
5921381St.nateldemoura@f5.com
5931596Szelenkov@nginx.com        assert self.get()['body'] == script_cwd, 'default cwd'
5941596Szelenkov@nginx.com
5951596Szelenkov@nginx.com        assert self.get(url='/?chdir=/')['body'] == '/', 'cwd after chdir'
5961381St.nateldemoura@f5.com
5971381St.nateldemoura@f5.com        # cwd must be restored
5981596Szelenkov@nginx.com        assert self.get()['body'] == script_cwd, 'cwd restored'
5991381St.nateldemoura@f5.com
6001381St.nateldemoura@f5.com    def test_php_application_cwd_script(self):
6011381St.nateldemoura@f5.com        self.load('cwd')
6021381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6031381St.nateldemoura@f5.com
6041381St.nateldemoura@f5.com    def test_php_application_cwd_script_opcache_disabled(self):
6051381St.nateldemoura@f5.com        self.load('cwd')
6061381St.nateldemoura@f5.com        self.set_opcache('cwd', '0')
6071381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6081381St.nateldemoura@f5.com
6091381St.nateldemoura@f5.com    def test_php_application_cwd_script_opcache_enabled(self):
6101381St.nateldemoura@f5.com        self.load('cwd')
6111381St.nateldemoura@f5.com        self.set_opcache('cwd', '1')
6121381St.nateldemoura@f5.com        self.run_php_application_cwd_script_tests()
6131381St.nateldemoura@f5.com
6141381St.nateldemoura@f5.com    def test_php_application_path_relative(self):
6151381St.nateldemoura@f5.com        self.load('open')
6161381St.nateldemoura@f5.com
6171596Szelenkov@nginx.com        assert self.get()['body'] == 'test', 'relative path'
6181381St.nateldemoura@f5.com
6191596Szelenkov@nginx.com        assert (
6201596Szelenkov@nginx.com            self.get(url='/?chdir=/')['body'] != 'test'
6211596Szelenkov@nginx.com        ), 'relative path w/ chdir'
6221367Szelenkov@nginx.com
6231596Szelenkov@nginx.com        assert self.get()['body'] == 'test', 'relative path 2'
624