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