xref: /unit/test/test_ruby_isolation.py (revision 1848:4bd548074e2c)
1import os
2import shutil
3
4import pytest
5
6from unit.applications.lang.ruby import TestApplicationRuby
7from unit.option import option
8
9
10class TestRubyIsolation(TestApplicationRuby):
11    prerequisites = {'modules': {'ruby': 'any'}, 'features': ['isolation']}
12
13    def test_ruby_isolation_rootfs(self, is_su):
14        isolation_features = option.available['features']['isolation'].keys()
15
16        if not is_su:
17            if not 'unprivileged_userns_clone' in isolation_features:
18                pytest.skip('requires unprivileged userns or root')
19
20            if 'user' not in isolation_features:
21                pytest.skip('user namespace is not supported')
22
23            if 'mnt' not in isolation_features:
24                pytest.skip('mnt namespace is not supported')
25
26            if 'pid' not in isolation_features:
27                pytest.skip('pid namespace is not supported')
28
29        isolation = {'rootfs': option.temp_dir}
30
31        if not is_su:
32            isolation['namespaces'] = {
33                'mount': True,
34                'credential': True,
35                'pid': True,
36            }
37
38        os.mkdir(option.temp_dir + '/ruby')
39
40        shutil.copytree(
41            option.test_dir + '/ruby/status_int',
42            option.temp_dir + '/ruby/status_int',
43        )
44
45        self.load('status_int', isolation=isolation)
46
47        assert 'success' in self.conf(
48            '"/ruby/status_int/config.ru"', 'applications/status_int/script',
49        )
50
51        assert 'success' in self.conf(
52            '"/ruby/status_int"', 'applications/status_int/working_directory',
53        )
54
55        assert self.get()['status'] == 200, 'status int'
56