Benjamin Schubert pushed to branch bschubert/tests-no-chroot-linux at BuildStream / buildstream
Commits:
- 
e28f668a
by Valentin David at 2018-11-08T09:34:11Z
- 
83d15350
by Valentin David at 2018-11-08T10:01:39Z
- 
9f0e12f1
by Benjamin Schubert at 2018-11-08T10:21:12Z
- 
cf2e0059
by Benjamin Schubert at 2018-11-08T10:21:12Z
- 
c51ba01b
by Benjamin Schubert at 2018-11-08T10:21:12Z
12 changed files:
- buildstream/_platform/linux.py
- buildstream/_site.py
- buildstream/data/projectconfig.yaml
- buildstream/sandbox/_sandboxdummy.py
- conftest.py
- tests/cachekey/project/elements/build1.expected
- tests/cachekey/project/elements/build2.expected
- tests/cachekey/project/target.expected
- + tests/sandboxes/missing-dependencies/elements/base.bst
- + tests/sandboxes/missing-dependencies/files/base/bin/sh
- + tests/sandboxes/missing-dependencies/project.conf
- + tests/sandboxes/missing_dependencies.py
Changes:
| ... | ... | @@ -18,9 +18,9 @@ | 
| 18 | 18 |  #        Tristan Maat <tristan maat codethink co uk>
 | 
| 19 | 19 |  | 
| 20 | 20 |  import os
 | 
| 21 | +import shutil
 | |
| 21 | 22 |  import subprocess
 | 
| 22 | 23 |  | 
| 23 | -from .. import _site
 | |
| 24 | 24 |  from .. import utils
 | 
| 25 | 25 |  from ..sandbox import SandboxDummy
 | 
| 26 | 26 |  | 
| ... | ... | @@ -37,12 +37,19 @@ class Linux(Platform): | 
| 37 | 37 |          self._gid = os.getegid()
 | 
| 38 | 38 |  | 
| 39 | 39 |          self._have_fuse = os.path.exists("/dev/fuse")
 | 
| 40 | -        self._bwrap_exists = _site.check_bwrap_version(0, 0, 0)
 | |
| 41 | -        self._have_good_bwrap = _site.check_bwrap_version(0, 1, 2)
 | |
| 42 | 40 |  | 
| 43 | -        self._local_sandbox_available = self._have_fuse and self._have_good_bwrap
 | |
| 41 | +        bwrap_version = self._get_bwrap_version()
 | |
| 44 | 42 |  | 
| 45 | -        self._die_with_parent_available = _site.check_bwrap_version(0, 1, 8)
 | |
| 43 | +        if bwrap_version is None:
 | |
| 44 | +            self._bwrap_exists = False
 | |
| 45 | +            self._have_good_bwrap = False
 | |
| 46 | +            self._die_with_parent_available = False
 | |
| 47 | +        else:
 | |
| 48 | +            self._bwrap_exists = True
 | |
| 49 | +            self._have_good_bwrap = (0, 1, 2) <= bwrap_version
 | |
| 50 | +            self._die_with_parent_available = (0, 1, 8) <= bwrap_version
 | |
| 51 | + | |
| 52 | +        self._local_sandbox_available = self._have_fuse and self._have_good_bwrap
 | |
| 46 | 53 |  | 
| 47 | 54 |          if self._local_sandbox_available:
 | 
| 48 | 55 |              self._user_ns_available = self._check_user_ns_available()
 | 
| ... | ... | @@ -112,3 +119,21 @@ class Linux(Platform): | 
| 112 | 119 |              output = ''
 | 
| 113 | 120 |  | 
| 114 | 121 |          return output == 'root'
 | 
| 122 | + | |
| 123 | +    def _get_bwrap_version(self):
 | |
| 124 | +        # Get the current bwrap version
 | |
| 125 | +        #
 | |
| 126 | +        # returns None if no bwrap was found
 | |
| 127 | +        # otherwise returns a tuple of 3 int: major, minor, patch
 | |
| 128 | +        bwrap_path = shutil.which('bwrap')
 | |
| 129 | + | |
| 130 | +        if not bwrap_path:
 | |
| 131 | +            return None
 | |
| 132 | + | |
| 133 | +        cmd = [bwrap_path, "--version"]
 | |
| 134 | +        try:
 | |
| 135 | +            version = str(subprocess.check_output(cmd).split()[1], "utf-8")
 | |
| 136 | +        except subprocess.CalledProcessError:
 | |
| 137 | +            return None
 | |
| 138 | + | |
| 139 | +        return tuple(int(x) for x in version.split(".")) | 
| ... | ... | @@ -18,8 +18,6 @@ | 
| 18 | 18 |  #        Tristan Van Berkom <tristan vanberkom codethink co uk>
 | 
| 19 | 19 |  | 
| 20 | 20 |  import os
 | 
| 21 | -import shutil
 | |
| 22 | -import subprocess
 | |
| 23 | 21 |  | 
| 24 | 22 |  #
 | 
| 25 | 23 |  # Private module declaring some info about where the buildstream
 | 
| ... | ... | @@ -46,44 +44,3 @@ build_all_template = os.path.join(root, 'data', 'build-all.sh.in') | 
| 46 | 44 |  | 
| 47 | 45 |  # Module building script template
 | 
| 48 | 46 |  build_module_template = os.path.join(root, 'data', 'build-module.sh.in') | 
| 49 | - | |
| 50 | -# Cached bwrap version
 | |
| 51 | -_bwrap_major = None
 | |
| 52 | -_bwrap_minor = None
 | |
| 53 | -_bwrap_patch = None
 | |
| 54 | - | |
| 55 | - | |
| 56 | -# check_bwrap_version()
 | |
| 57 | -#
 | |
| 58 | -# Checks the version of installed bwrap against the requested version
 | |
| 59 | -#
 | |
| 60 | -# Args:
 | |
| 61 | -#    major (int): The required major version
 | |
| 62 | -#    minor (int): The required minor version
 | |
| 63 | -#    patch (int): The required patch level
 | |
| 64 | -#
 | |
| 65 | -# Returns:
 | |
| 66 | -#    (bool): Whether installed bwrap meets the requirements
 | |
| 67 | -#
 | |
| 68 | -def check_bwrap_version(major, minor, patch):
 | |
| 69 | -    # pylint: disable=global-statement
 | |
| 70 | - | |
| 71 | -    global _bwrap_major
 | |
| 72 | -    global _bwrap_minor
 | |
| 73 | -    global _bwrap_patch
 | |
| 74 | - | |
| 75 | -    # Parse bwrap version and save into cache, if not already cached
 | |
| 76 | -    if _bwrap_major is None:
 | |
| 77 | -        bwrap_path = shutil.which('bwrap')
 | |
| 78 | -        if not bwrap_path:
 | |
| 79 | -            return False
 | |
| 80 | -        cmd = [bwrap_path, "--version"]
 | |
| 81 | -        try:
 | |
| 82 | -            version = str(subprocess.check_output(cmd).split()[1], "utf-8")
 | |
| 83 | -        except subprocess.CalledProcessError:
 | |
| 84 | -            # Failure trying to run bubblewrap
 | |
| 85 | -            return False
 | |
| 86 | -        _bwrap_major, _bwrap_minor, _bwrap_patch = map(int, version.split("."))
 | |
| 87 | - | |
| 88 | -    # Check whether the installed version meets the requirements
 | |
| 89 | -    return (_bwrap_major, _bwrap_minor, _bwrap_patch) >= (major, minor, patch) | 
| ... | ... | @@ -62,6 +62,11 @@ variables: | 
| 62 | 62 |            -o -name '*.cmxs' -o -name '*.node' ')' \
 | 
| 63 | 63 |        -exec sh -ec \
 | 
| 64 | 64 |        'read -n4 hdr <"$1" # check for elf header
 | 
| 65 | +       case "$1" in
 | |
| 66 | +         %{install-root}%{debugdir}/*)
 | |
| 67 | +           exit 0
 | |
| 68 | +           ;;
 | |
| 69 | +       esac
 | |
| 65 | 70 |         if [ "$hdr" != "$(printf \\x7fELF)" ]; then
 | 
| 66 | 71 |             exit 0
 | 
| 67 | 72 |         fi
 | 
| ... | ... | @@ -42,4 +42,5 @@ class SandboxDummy(Sandbox): | 
| 42 | 42 |                                 "'{}'".format(command[0]),
 | 
| 43 | 43 |                                 reason='missing-command')
 | 
| 44 | 44 |  | 
| 45 | -        raise SandboxError("This platform does not support local builds: {}".format(self._reason)) | |
| 45 | +        raise SandboxError("This platform does not support local builds: {}".format(self._reason),
 | |
| 46 | +                           reason="unavailable-local-sandbox") | 
| ... | ... | @@ -23,6 +23,8 @@ import shutil | 
| 23 | 23 |  | 
| 24 | 24 |  import pytest
 | 
| 25 | 25 |  | 
| 26 | +from buildstream._platform.platform import Platform
 | |
| 27 | + | |
| 26 | 28 |  | 
| 27 | 29 |  def pytest_addoption(parser):
 | 
| 28 | 30 |      parser.addoption('--integration', action='store_true', default=False,
 | 
| ... | ... | @@ -52,3 +54,8 @@ def integration_cache(request): | 
| 52 | 54 |          shutil.rmtree(os.path.join(cache_dir, 'artifacts'))
 | 
| 53 | 55 |      except FileNotFoundError:
 | 
| 54 | 56 |          pass
 | 
| 57 | + | |
| 58 | + | |
| 59 | +@pytest.fixture(autouse=True)
 | |
| 60 | +def clean_platform_cache():
 | |
| 61 | +    Platform._instance = None | 
| 1 | -dd5e29baefb84f68eb4abac3a1befc332077ec4c97bb2572e57f3ca98ba46707 | |
| \ No newline at end of file | ||
| 1 | +ce0ddf7126d45d14f5ec1a525337c39ec8ddbbe4b0ec2ef51bae777619ed39bb | |
| \ No newline at end of file | 
| 1 | -99d80454cce44645597c885800edf0bf254d1c3606d869f2ccdd5043ec7685cb | |
| \ No newline at end of file | ||
| 1 | +5e2a48dbeae43f6bab84071dbd02345a3aa32a473c189645ab26f3d5d6cfe547 | |
| \ No newline at end of file | 
| 1 | -29a1252ec30dd6ae73c772381f0eb417e3874c75710d08be819f5715dcaa942b | |
| \ No newline at end of file | ||
| 1 | +125d9e7dcf4f49e5f80d85b7f144b43ed43186064afc2e596e57f26cce679cf5 | |
| \ No newline at end of file | 
| 1 | +kind: import
 | |
| 2 | +sources:
 | |
| 3 | +- kind: local
 | |
| 4 | +  path: files/base/ | 
| 1 | +# This is the original bash | 
| 1 | +# Project config for missing dependencies test
 | |
| 2 | +name: test
 | |
| 3 | + | |
| 4 | +element-path: elements | 
| 1 | +import os
 | |
| 2 | +import pytest
 | |
| 3 | +from tests.testutils import cli
 | |
| 4 | +from tests.testutils.site import IS_LINUX
 | |
| 5 | + | |
| 6 | +from buildstream import _yaml
 | |
| 7 | +from buildstream._exceptions import ErrorDomain
 | |
| 8 | + | |
| 9 | + | |
| 10 | +# Project directory
 | |
| 11 | +DATA_DIR = os.path.join(
 | |
| 12 | +    os.path.dirname(os.path.realpath(__file__)),
 | |
| 13 | +    "missing-dependencies",
 | |
| 14 | +)
 | |
| 15 | + | |
| 16 | + | |
| 17 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on Linux')
 | |
| 18 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 19 | +def test_missing_brwap_has_nice_error_message(cli, datafiles):
 | |
| 20 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 21 | +    element_path = os.path.join(project, 'elements', 'element.bst')
 | |
| 22 | + | |
| 23 | +    # Write out our test target
 | |
| 24 | +    element = {
 | |
| 25 | +        'kind': 'script',
 | |
| 26 | +        'depends': [
 | |
| 27 | +            {
 | |
| 28 | +                'filename': 'base.bst',
 | |
| 29 | +                'type': 'build',
 | |
| 30 | +            },
 | |
| 31 | +        ],
 | |
| 32 | +        'config': {
 | |
| 33 | +            'commands': [
 | |
| 34 | +                'false',
 | |
| 35 | +            ],
 | |
| 36 | +        },
 | |
| 37 | +    }
 | |
| 38 | +    _yaml.dump(element, element_path)
 | |
| 39 | + | |
| 40 | +    # Build without access to host tools, this should fail with a nice error
 | |
| 41 | +    result = cli.run(
 | |
| 42 | +        project=project, args=['build', 'element.bst'], env={'PATH': ''})
 | |
| 43 | +    result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
 | |
| 44 | +    assert "not found" in result.stderr
 | |
| 45 | + | |
| 46 | + | |
| 47 | +@pytest.mark.skipif(not IS_LINUX, reason='Only available on Linux')
 | |
| 48 | +@pytest.mark.datafiles(DATA_DIR)
 | |
| 49 | +def test_old_brwap_has_nice_error_message(cli, datafiles, tmp_path):
 | |
| 50 | +    bwrap = tmp_path.joinpath('bin/bwrap')
 | |
| 51 | +    bwrap.parent.mkdir()
 | |
| 52 | +    with bwrap.open('w') as fp:
 | |
| 53 | +        fp.write('''
 | |
| 54 | +            #!/bin/sh
 | |
| 55 | +            echo bubblewrap 0.0.1
 | |
| 56 | +        '''.strip())
 | |
| 57 | + | |
| 58 | +    bwrap.chmod(0o755)
 | |
| 59 | + | |
| 60 | +    project = os.path.join(datafiles.dirname, datafiles.basename)
 | |
| 61 | +    element_path = os.path.join(project, 'elements', 'element3.bst')
 | |
| 62 | + | |
| 63 | +    # Write out our test target
 | |
| 64 | +    element = {
 | |
| 65 | +        'kind': 'script',
 | |
| 66 | +        'depends': [
 | |
| 67 | +            {
 | |
| 68 | +                'filename': 'base.bst',
 | |
| 69 | +                'type': 'build',
 | |
| 70 | +            },
 | |
| 71 | +        ],
 | |
| 72 | +        'config': {
 | |
| 73 | +            'commands': [
 | |
| 74 | +                'false',
 | |
| 75 | +            ],
 | |
| 76 | +        },
 | |
| 77 | +    }
 | |
| 78 | +    _yaml.dump(element, element_path)
 | |
| 79 | + | |
| 80 | +    # Build without access to host tools, this should fail with a nice error
 | |
| 81 | +    result = cli.run(
 | |
| 82 | +        project=project,
 | |
| 83 | +        args=['--debug', '--verbose', 'build', 'element3.bst'],
 | |
| 84 | +        env={'PATH': str(tmp_path.joinpath('bin'))})
 | |
| 85 | +    result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
 | |
| 86 | +    assert "too old" in result.stderr | 
