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