You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by no...@apache.org on 2020/12/29 12:39:25 UTC
[buildstream] 11/15: tests: refactor,
extract symlink_host_tools_to_dir
This is an automated email from the ASF dual-hosted git repository.
not-in-ldap pushed a commit to branch aevri/enable_spawn_ci_7
in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 8becbcf111a0a97f78645ad94ac0ffc9edd9e582
Author: Angelos Evripiotis <je...@bloomberg.net>
AuthorDate: Tue Oct 29 17:14:39 2019 +0000
tests: refactor, extract symlink_host_tools_to_dir
Extract a helper function to simplify the repeated pattern of creating a
temporary dir of symlinks for isolating PATH to. Use it in more places.
---
tests/integration/cachedfail.py | 11 +++++-----
tests/sandboxes/missing_dependencies.py | 22 +++++++------------
tests/sandboxes/selection.py | 11 +++++-----
tests/testutils/__init__.py | 1 +
tests/testutils/host_tools.py | 39 +++++++++++++++++++++++++++++++++
5 files changed, 59 insertions(+), 25 deletions(-)
diff --git a/tests/integration/cachedfail.py b/tests/integration/cachedfail.py
index 63ad2d4..f624c48 100644
--- a/tests/integration/cachedfail.py
+++ b/tests/integration/cachedfail.py
@@ -20,12 +20,12 @@
import os
import pytest
-from buildstream import utils, _yaml
+from buildstream import _yaml
from buildstream._exceptions import ErrorDomain
from buildstream.testing import cli_integration as cli # pylint: disable=unused-import
from buildstream.testing._utils.site import HAVE_SANDBOX
-from tests.testutils import create_artifact_share
+from tests.testutils import create_artifact_share, symlink_host_tools_to_dir
pytestmark = pytest.mark.integration
@@ -229,9 +229,8 @@ def test_push_failed_missing_shell(cli, tmpdir, datafiles, on_error):
@pytest.mark.datafiles(DATA_DIR)
def test_host_tools_errors_are_not_cached(cli, datafiles, tmp_path):
# Create symlink to buildbox-casd to work with custom PATH
- buildbox_casd = tmp_path.joinpath('bin/buildbox-casd')
- buildbox_casd.parent.mkdir()
- os.symlink(utils.get_host_tool('buildbox-casd'), str(buildbox_casd))
+ bin_dir = str(tmp_path / 'bin')
+ symlink_host_tools_to_dir(['buildbox-casd'], bin_dir)
project = str(datafiles)
element_path = os.path.join(project, 'elements', 'element.bst')
@@ -257,7 +256,7 @@ def test_host_tools_errors_are_not_cached(cli, datafiles, tmp_path):
result1 = cli.run(
project=project,
args=['build', 'element.bst'],
- env={'PATH': str(tmp_path.joinpath('bin')),
+ env={'PATH': bin_dir,
'BST_FORCE_SANDBOX': None})
result1.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
assert cli.get_element_state(project, 'element.bst') == 'buildable'
diff --git a/tests/sandboxes/missing_dependencies.py b/tests/sandboxes/missing_dependencies.py
index a5bf31e..8935dd8 100644
--- a/tests/sandboxes/missing_dependencies.py
+++ b/tests/sandboxes/missing_dependencies.py
@@ -5,11 +5,12 @@ import os
import pytest
-from buildstream import utils, _yaml
+from buildstream import _yaml
from buildstream._exceptions import ErrorDomain
from buildstream.testing._utils.site import IS_LINUX
from buildstream.testing import cli # pylint: disable=unused-import
+from tests.testutils import symlink_host_tools_to_dir
# Project directory
DATA_DIR = os.path.join(
@@ -18,19 +19,12 @@ DATA_DIR = os.path.join(
)
-def _symlink_host_tools_to_dir(host_tools, dir_):
- dir_.mkdir(exist_ok=True)
- for tool in host_tools:
- target_path = dir_ / tool
- os.symlink(utils.get_host_tool(tool), str(target_path))
-
-
@pytest.mark.skipif(not IS_LINUX, reason='Only available on Linux')
@pytest.mark.datafiles(DATA_DIR)
def test_missing_bwrap_has_nice_error_message(cli, datafiles, tmp_path):
# Create symlink to buildbox-casd and git to work with custom PATH
- bin_dir = tmp_path / "bin"
- _symlink_host_tools_to_dir(['buildbox-casd', 'git'], bin_dir)
+ bin_dir = str(tmp_path / "bin")
+ symlink_host_tools_to_dir(['buildbox-casd', 'git'], bin_dir)
project = str(datafiles)
element_path = os.path.join(project, 'elements', 'element.bst')
@@ -56,7 +50,7 @@ def test_missing_bwrap_has_nice_error_message(cli, datafiles, tmp_path):
result = cli.run(
project=project,
args=['build', 'element.bst'],
- env={'PATH': str(bin_dir),
+ env={'PATH': bin_dir,
'BST_FORCE_SANDBOX': None})
result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
assert "not found" in result.stderr
@@ -76,8 +70,8 @@ def test_old_brwap_has_nice_error_message(cli, datafiles, tmp_path):
bwrap.chmod(0o755)
# Create symlink to buildbox-casd and git to work with custom PATH
- bin_dir = tmp_path / "bin"
- _symlink_host_tools_to_dir(['buildbox-casd', 'git'], bin_dir)
+ bin_dir = str(tmp_path / "bin")
+ symlink_host_tools_to_dir(['buildbox-casd', 'git'], bin_dir)
project = str(datafiles)
element_path = os.path.join(project, 'elements', 'element3.bst')
@@ -103,7 +97,7 @@ def test_old_brwap_has_nice_error_message(cli, datafiles, tmp_path):
result = cli.run(
project=project,
args=['--debug', '--verbose', 'build', 'element3.bst'],
- env={'PATH': str(bin_dir),
+ env={'PATH': bin_dir,
'BST_FORCE_SANDBOX': None})
result.assert_task_error(ErrorDomain.SANDBOX, 'unavailable-local-sandbox')
assert "too old" in result.stderr
diff --git a/tests/sandboxes/selection.py b/tests/sandboxes/selection.py
index b4bbb1b..db937d1 100644
--- a/tests/sandboxes/selection.py
+++ b/tests/sandboxes/selection.py
@@ -19,10 +19,12 @@
import os
import pytest
-from buildstream import utils, _yaml
+from buildstream import _yaml
from buildstream._exceptions import ErrorDomain
from buildstream.testing import cli # pylint: disable=unused-import
+from tests.testutils import symlink_host_tools_to_dir
+
pytestmark = pytest.mark.integration
@@ -66,9 +68,8 @@ def test_force_sandbox(cli, datafiles):
@pytest.mark.datafiles(DATA_DIR)
def test_dummy_sandbox_fallback(cli, datafiles, tmp_path):
# Create symlink to buildbox-casd to work with custom PATH
- buildbox_casd = tmp_path.joinpath('bin/buildbox-casd')
- buildbox_casd.parent.mkdir()
- os.symlink(utils.get_host_tool('buildbox-casd'), str(buildbox_casd))
+ bin_dir = str(tmp_path / 'bin')
+ symlink_host_tools_to_dir(['buildbox-casd'], bin_dir)
project = str(datafiles)
element_path = os.path.join(project, 'elements', 'element.bst')
@@ -94,7 +95,7 @@ def test_dummy_sandbox_fallback(cli, datafiles, tmp_path):
result = cli.run(
project=project,
args=['build', 'element.bst'],
- env={'PATH': str(tmp_path.joinpath('bin')),
+ env={'PATH': bin_dir,
'BST_FORCE_SANDBOX': None})
# But if we dont spesify a sandbox then we fall back to dummy, we still
# fail early but only once we know we need a facny sandbox and that
diff --git a/tests/testutils/__init__.py b/tests/testutils/__init__.py
index 9642ddf..1105803 100644
--- a/tests/testutils/__init__.py
+++ b/tests/testutils/__init__.py
@@ -27,6 +27,7 @@ from .artifactshare import create_artifact_share, create_split_share, assert_sha
from .context import dummy_context
from .element_generators import create_element_size, update_element_size
from .junction import generate_junction
+from .host_tools import symlink_host_tools_to_dir
from .runner_integration import wait_for_cache_granularity
from .python_repo import setup_pypi_repo
from .platform import override_platform_uname
diff --git a/tests/testutils/host_tools.py b/tests/testutils/host_tools.py
new file mode 100644
index 0000000..d6c1794
--- /dev/null
+++ b/tests/testutils/host_tools.py
@@ -0,0 +1,39 @@
+#
+# Copyright (C) 2019 Bloomberg Finance LP
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+import os
+
+from buildstream import utils
+
+
+# symlink_host_tools_to_dir()
+#
+# Ensure the specified tools are symlinked into the supplied directory.
+#
+# Create # the directory if it doesn't exist.
+#
+# This is useful for isolating tests, such that only the specified tools are
+# available.
+#
+# Args:
+# host_tools (List[str]): The string names of the tools, e.g. ['git', 'bzr'].
+# dir_ (path-like): The path to put the symlinks into.
+#
+def symlink_host_tools_to_dir(host_tools, dir_):
+ os.makedirs(dir_, exist_ok=True)
+ for tool in host_tools:
+ target_path = os.path.join(dir_, tool)
+ os.symlink(utils.get_host_tool(tool), str(target_path))