diff --git a/tests/containers.py b/tests/containers.py index 53324152500333f3bfb091b277af4a24efee256c..e011a1d5896431784be3895c1d0b4390ceb0680a 100755 --- a/tests/containers.py +++ b/tests/containers.py @@ -144,6 +144,35 @@ class TestContainers(BaseTest): cls.pv_dir = os.path.join(cls.tmpdir.name, 'pressure-vessel') os.makedirs(cls.pv_dir, exist_ok=True) + for var, plural in ( + ('STEAM_COMPAT_APP_LIBRARY_PATH', False), + ('STEAM_COMPAT_APP_LIBRARY_PATHS', True), + ('STEAM_COMPAT_CLIENT_INSTALL_PATH', False), + ('STEAM_COMPAT_DATA_PATH', False), + ('STEAM_COMPAT_INSTALL_PATH', False), + ('STEAM_COMPAT_LIBRARY_PATHS', True), + ('STEAM_COMPAT_MOUNT_PATHS', True), + ('STEAM_COMPAT_MOUNTS', True), + ('STEAM_COMPAT_SHADER_PATH', False), + ('STEAM_COMPAT_TOOL_PATH', False), + ('STEAM_COMPAT_TOOL_PATHS', True), + ): + paths = [] + + if plural: + names = [var + '_n1', var + '_n2'] + else: + # Use an inconvenient name with colon and space + # to check that we handle those correctly + names = [var + ': .d'] + + for name in names: + path = os.path.join(cls.tmpdir.name, name) + os.makedirs(path, exist_ok=True) + paths.append(path) + + os.environ[var] = ':'.join(paths) + if 'PRESSURE_VESSEL_UNINSTALLED' in os.environ: os.makedirs(os.path.join(cls.pv_dir, 'bin')) @@ -521,11 +550,35 @@ class TestContainers(BaseTest): ) self.assertEqual(completed.returncode, 0) - bwrap_arguments = bwrap_temp_file.read().decode().split("\0") + bwrap_arguments = bwrap_temp_file.read().decode() if locales: - self.assertIn("--generate-locales", bwrap_arguments) + self.assertIn("\0--generate-locales\0", bwrap_arguments) else: - self.assertNotIn("--generate-locales", bwrap_arguments) + self.assertNotIn("\0--generate-locales\0", bwrap_arguments) + + if only_prepare: + for var, plural in ( + ('STEAM_COMPAT_APP_LIBRARY_PATH', False), + ('STEAM_COMPAT_APP_LIBRARY_PATHS', True), + ('STEAM_COMPAT_CLIENT_INSTALL_PATH', False), + ('STEAM_COMPAT_INSTALL_PATH', False), + ('STEAM_COMPAT_LIBRARY_PATHS', True), + ('STEAM_COMPAT_MOUNT_PATHS', True), + ('STEAM_COMPAT_MOUNTS', True), + ('STEAM_COMPAT_SHADER_PATH', False), + ('STEAM_COMPAT_TOOL_PATH', False), + ('STEAM_COMPAT_TOOL_PATHS', True), + ): + if plural: + paths = os.environ[var].split(':') + else: + paths = [os.environ[var]] + + for path in paths: + self.assertIn( + "\0--bind\0{}\0{}".format(path, path), + bwrap_arguments, + ) bwrap_temp_file.close() diff --git a/tests/inside-runtime.py b/tests/inside-runtime.py index a283ade914e756c26a733aa208edb9c8dd857457..cb83c29d2f6078341fef762a529f584acb0ec09f 100755 --- a/tests/inside-runtime.py +++ b/tests/inside-runtime.py @@ -9,6 +9,7 @@ import errno import json import logging import os +import re import shlex import subprocess import sys @@ -627,6 +628,41 @@ class TestInsideRuntime(BaseTest): self.assertEqual(raised.exception.errno, errno.EROFS) + def test_imported(self) -> None: + mount_points = set() # type: typing.Set[str] + + with open('/proc/self/mountinfo') as mountinfo: + for line in mountinfo: + _, _, _, _, mount_point, *_ = re.split(r'[ \t]', line) + + mount_point = re.sub( + r'\\([0-7][0-7][0-7])', + lambda m: chr(int(m.group(1), 8)), + mount_point, + ) + mount_points.add(mount_point) + + for var, plural in ( + ('STEAM_COMPAT_APP_LIBRARY_PATH', False), + ('STEAM_COMPAT_APP_LIBRARY_PATHS', True), + ('STEAM_COMPAT_CLIENT_INSTALL_PATH', False), + ('STEAM_COMPAT_DATA_PATH', False), + ('STEAM_COMPAT_INSTALL_PATH', False), + ('STEAM_COMPAT_LIBRARY_PATHS', True), + ('STEAM_COMPAT_MOUNT_PATHS', True), + ('STEAM_COMPAT_MOUNTS', True), + ('STEAM_COMPAT_SHADER_PATH', False), + ('STEAM_COMPAT_TOOL_PATH', False), + ('STEAM_COMPAT_TOOL_PATHS', True), + ): + if plural: + paths = os.environ[var].split(':') + else: + paths = [os.environ[var]] + + for path in paths: + self.assertIn(path, mount_points) + if __name__ == '__main__': assert sys.version_info >= (3, 5), 'Python 3.5+ is required'