diff options
3 files changed, 105 insertions, 0 deletions
diff --git a/tests/remoteexecution/buildtree.py b/tests/remoteexecution/buildtree.py new file mode 100644 index 000000000..a64b8716c --- /dev/null +++ b/tests/remoteexecution/buildtree.py @@ -0,0 +1,81 @@ +# 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/>. +# + +# Pylint doesn't play well with fixtures and dependency injection from pytest +# pylint: disable=redefined-outer-name + +import os +import shutil +import pytest + +from buildstream.testing import cli_remote_execution as cli # pylint: disable=unused-import + +from tests.testutils import create_artifact_share + +pytestmark = pytest.mark.remoteexecution + +# Project directory +DATA_DIR = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "project", +) + + +@pytest.mark.datafiles(DATA_DIR) +def test_buildtree_remote(cli, tmpdir, datafiles): + project = str(datafiles) + element_name = 'build-shell/buildtree.bst' + share_path = os.path.join(str(tmpdir), 'share') + + services = cli.ensure_services() + assert set(services) == set(['action-cache', 'execution', 'storage']) + + with create_artifact_share(share_path) as share: + cli.configure({ + 'artifacts': {'url': share.repo, 'push': True}, + 'cache': {'pull-buildtrees': False} + }) + + res = cli.run(project=project, args=[ + '--cache-buildtrees', 'always', 'build', element_name]) + res.assert_success() + + # remove local cache + shutil.rmtree(os.path.join(str(tmpdir), 'cache', 'cas')) + shutil.rmtree(os.path.join(str(tmpdir), 'cache', 'artifacts')) + + # pull without buildtree + res = cli.run(project=project, args=[ + 'artifact', 'pull', '--deps', 'all', element_name]) + res.assert_success() + + # check shell doesn't work + res = cli.run(project=project, args=[ + 'shell', '--build', element_name, '--', 'cat', 'test' + ]) + res.assert_shell_error() + + # pull with buildtree + res = cli.run(project=project, args=[ + '--pull-buildtrees', 'artifact', 'pull', '--deps', 'all', element_name]) + res.assert_success() + + # check it works this time + res = cli.run(project=project, args=[ + 'shell', '--build', element_name, '--use-buildtree', 'always', '--', 'cat', 'test' + ]) + res.assert_success() + assert "Hi" in res.output diff --git a/tests/remoteexecution/project/elements/build-shell/buildtree-fail.bst b/tests/remoteexecution/project/elements/build-shell/buildtree-fail.bst new file mode 100644 index 000000000..a3b515a9a --- /dev/null +++ b/tests/remoteexecution/project/elements/build-shell/buildtree-fail.bst @@ -0,0 +1,13 @@ +kind: manual +description: | + Puts a file in the build tree so that build tree caching and staging can be tested, + then deliberately failing to build so we can check the output. + +depends: + - filename: base.bst + type: build + +config: + build-commands: + - "echo 'Hi' > %{build-root}/test" + - "false" diff --git a/tests/remoteexecution/project/elements/build-shell/buildtree.bst b/tests/remoteexecution/project/elements/build-shell/buildtree.bst new file mode 100644 index 000000000..d5cf256be --- /dev/null +++ b/tests/remoteexecution/project/elements/build-shell/buildtree.bst @@ -0,0 +1,11 @@ +kind: manual +description: | + Puts a file in the build tree so that build tree caching and staging can be tested. + +depends: + - filename: base.bst + type: build + +config: + build-commands: + - "echo 'Hi' > %{build-root}/test" |