diff options
Diffstat (limited to 'tests/frontend/artifact_show.py')
-rw-r--r-- | tests/frontend/artifact_show.py | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/frontend/artifact_show.py b/tests/frontend/artifact_show.py new file mode 100644 index 000000000..913dde9c8 --- /dev/null +++ b/tests/frontend/artifact_show.py @@ -0,0 +1,136 @@ +# +# Copyright (C) 2019 Codethink Limited +# +# 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 pytest + +from buildstream._exceptions import ErrorDomain +from buildstream.testing import cli # pylint: disable=unused-import +from tests.testutils import create_artifact_share + + +# Project directory +DATA_DIR = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "project", +) + + +# Test artifact show +@pytest.mark.datafiles(DATA_DIR) +def test_artifact_show_element_name(cli, tmpdir, datafiles): + project = str(datafiles) + element = 'target.bst' + + result = cli.run(project=project, args=['artifact', 'show', element]) + result.assert_success() + assert 'not cached {}'.format(element) in result.output + + result = cli.run(project=project, args=['build', element]) + result.assert_success() + + result = cli.run(project=project, args=['artifact', 'show', element]) + result.assert_success() + assert 'cached {}'.format(element) in result.output + + +# Test artifact show on a failed element +@pytest.mark.datafiles(DATA_DIR) +def test_artifact_show_failed_element(cli, tmpdir, datafiles): + project = str(datafiles) + element = 'manual.bst' + + result = cli.run(project=project, args=['artifact', 'show', element]) + result.assert_success() + assert 'not cached {}'.format(element) in result.output + + result = cli.run(project=project, args=['build', element]) + result.assert_task_error(ErrorDomain.SANDBOX, 'missing-command') + + result = cli.run(project=project, args=['artifact', 'show', element]) + result.assert_success() + assert 'failed {}'.format(element) in result.output + + +# Test artifact show with a deleted dependency +@pytest.mark.datafiles(DATA_DIR) +def test_artifact_show_element_missing_deps(cli, tmpdir, datafiles): + project = str(datafiles) + element = 'target.bst' + dependency = 'import-bin.bst' + + result = cli.run(project=project, args=['build', element]) + result.assert_success() + + result = cli.run(project=project, args=['artifact', 'delete', dependency]) + result.assert_success() + + result = cli.run(project=project, args=['artifact', 'show', '--deps', 'all', element]) + result.assert_success() + assert 'not cached {}'.format(dependency) in result.output + assert 'cached {}'.format(element) in result.output + + +# Test artifact show with artifact ref +@pytest.mark.datafiles(DATA_DIR) +def test_artifact_show_artifact_ref(cli, tmpdir, datafiles): + project = str(datafiles) + element = 'target.bst' + + result = cli.run(project=project, args=['build', element]) + result.assert_success() + + cache_key = cli.get_element_key(project, element) + artifact_ref = 'test/target/' + cache_key + + result = cli.run(project=project, args=['artifact', 'show', artifact_ref]) + result.assert_success() + assert 'cached {}'.format(artifact_ref) in result.output + + +# Test artifact show artifact in remote +@pytest.mark.datafiles(DATA_DIR) +def test_artifact_show_element_available_remotely(cli, tmpdir, datafiles): + project = str(datafiles) + element = 'target.bst' + + # Set up remote and local shares + local_cache = os.path.join(str(tmpdir), 'artifacts') + with create_artifact_share(os.path.join(str(tmpdir), 'remote')) as remote: + cli.configure({ + 'artifacts': {'url': remote.repo, 'push': True}, + 'cachedir': local_cache, + }) + + # Build the element + result = cli.run(project=project, args=['build', element]) + result.assert_success() + + # Make sure it's in the share + assert remote.has_artifact(cli.get_artifact_name(project, 'test', element)) + + # Delete the artifact from the local cache + result = cli.run(project=project, args=['artifact', 'delete', element]) + result.assert_success() + assert cli.get_element_state(project, element) != 'cached' + + result = cli.run(project=project, args=['artifact', 'show', element]) + result.assert_success() + assert 'available {}'.format(element) in result.output |