1import pytest 2 3from unit.applications.lang.php import TestApplicationPHP 4from unit.option import option 5 6 7class TestPHPIsolation(TestApplicationPHP): 8 prerequisites = {'modules': {'php': 'any'}, 'features': ['isolation']} 9 10 def test_php_isolation_rootfs(self, is_su, temp_dir): 11 isolation_features = option.available['features']['isolation'].keys() 12 13 if not is_su: 14 if not 'unprivileged_userns_clone' in isolation_features: 15 pytest.skip('requires unprivileged userns or root') 16 17 if 'user' not in isolation_features: 18 pytest.skip('user namespace is not supported') 19 20 if 'mnt' not in isolation_features: 21 pytest.skip('mnt namespace is not supported') 22 23 if 'pid' not in isolation_features: 24 pytest.skip('pid namespace is not supported') 25 26 isolation = {'rootfs': temp_dir} 27 28 if not is_su: 29 isolation['namespaces'] = { 30 'mount': True, 31 'credential': True, 32 'pid': True, 33 } 34 35 self.load('phpinfo', isolation=isolation) 36 37 assert 'success' in self.conf( 38 '"/app/php/phpinfo"', 'applications/phpinfo/root' 39 ) 40 assert 'success' in self.conf( 41 '"/app/php/phpinfo"', 'applications/phpinfo/working_directory' 42 ) 43 44 assert self.get()['status'] == 200, 'empty rootfs' 45 46 def test_php_isolation_rootfs_extensions(self, is_su, temp_dir): 47 isolation_features = option.available['features']['isolation'].keys() 48 49 if not is_su: 50 if not 'unprivileged_userns_clone' in isolation_features: 51 pytest.skip('requires unprivileged userns or root') 52 53 if 'user' not in isolation_features: 54 pytest.skip('user namespace is not supported') 55 56 if 'mnt' not in isolation_features: 57 pytest.skip('mnt namespace is not supported') 58 59 if 'pid' not in isolation_features: 60 pytest.skip('pid namespace is not supported') 61 62 isolation = {'rootfs': temp_dir} 63 64 if not is_su: 65 isolation['namespaces'] = { 66 'mount': True, 67 'credential': True, 68 'pid': True, 69 } 70 71 self.load('list-extensions', isolation=isolation) 72 73 assert 'success' in self.conf( 74 '"/app/php/list-extensions"', 'applications/list-extensions/root' 75 ) 76 77 assert 'success' in self.conf( 78 {'file': '/php/list-extensions/php.ini'}, 79 'applications/list-extensions/options', 80 ) 81 82 assert 'success' in self.conf( 83 '"/app/php/list-extensions"', 84 'applications/list-extensions/working_directory', 85 ) 86 87 extensions = self.getjson()['body'] 88 89 assert 'json' in extensions, 'json in extensions list' 90 assert 'unit' in extensions, 'unit in extensions list' 91