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