summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRebecca Grayson <becky.grayson1@hotmail.co.uk>2019-08-29 10:47:08 +0100
committerRebecca Grayson <becky.grayson1@hotmail.co.uk>2019-08-30 17:13:49 +0100
commit12bfcdabb111ef56d8a8d7deb771ebce4fe00645 (patch)
treec3ceb0d57ef37d98aac6e5ca8ab4931bd360f959
parentf3baddd706c90d0e9406eee30bf4304ad3e53ea3 (diff)
downloadbuildstream-becky/cleanup_artifact_tests.tar.gz
Splitting up tests/frontend/artifact.pybecky/cleanup_artifact_tests
Artifact.py consists of multiple tests for the different artifact subcommands all grouped together. This MR splits the tests relevant to each subcommand up into separate test files, making it easier to find the relevant test.
-rw-r--r--tests/frontend/artifact_delete.py (renamed from tests/frontend/artifact.py)242
-rw-r--r--tests/frontend/artifact_list_contents.py98
-rw-r--r--tests/frontend/artifact_log.py99
-rw-r--r--tests/frontend/artifact_show.py136
4 files changed, 334 insertions, 241 deletions
diff --git a/tests/frontend/artifact.py b/tests/frontend/artifact_delete.py
index 9ad03909e..80870c81a 100644
--- a/tests/frontend/artifact.py
+++ b/tests/frontend/artifact_delete.py
@@ -1,6 +1,5 @@
#
-# Copyright (C) 2018 Codethink Limited
-# Copyright (C) 2018 Bloomberg Finance LP
+# 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
@@ -15,8 +14,6 @@
# 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/>.
#
-# Authors: Richard Maw <richard.maw@codethink.co.uk>
-#
# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name
@@ -37,140 +34,6 @@ DATA_DIR = os.path.join(
)
-@pytest.mark.datafiles(DATA_DIR)
-def test_artifact_log(cli, datafiles):
- project = str(datafiles)
-
- # Get the cache key of our test element
- result = cli.run(project=project, silent=True, args=[
- '--no-colors',
- 'show', '--deps', 'none', '--format', '%{full-key}',
- 'target.bst'
- ])
- key = result.output.strip()
-
- # Ensure we have an artifact to read
- result = cli.run(project=project, args=['build', 'target.bst'])
- assert result.exit_code == 0
-
- # Read the log via the element name
- result = cli.run(project=project, args=['artifact', 'log', 'target.bst'])
- assert result.exit_code == 0
- log = result.output
-
- # Assert that there actually was a log file
- assert log != ''
-
- # Read the log via the key
- result = cli.run(project=project, args=['artifact', 'log', 'test/target/' + key])
- assert result.exit_code == 0
- assert log == result.output
-
- # Read the log via glob
- result = cli.run(project=project, args=['artifact', 'log', 'test/target/*'])
- assert result.exit_code == 0
- assert log == result.output
-
-
-@pytest.mark.datafiles(DATA_DIR)
-def test_artifact_list_exact_contents_element(cli, datafiles):
- project = str(datafiles)
-
- # Ensure we have an artifact to read
- result = cli.run(project=project, args=['build', 'import-bin.bst'])
- assert result.exit_code == 0
-
- # List the contents via the element name
- result = cli.run(project=project, args=['artifact', 'list-contents', 'import-bin.bst'])
- assert result.exit_code == 0
- expected_output = ("import-bin.bst:\n"
- "\tusr\n"
- "\tusr/bin\n"
- "\tusr/bin/hello\n\n")
- assert expected_output in result.output
-
-
-@pytest.mark.datafiles(DATA_DIR)
-def test_artifact_list_exact_contents_ref(cli, datafiles):
- project = str(datafiles)
-
- # Get the cache key of our test element
- key = cli.get_element_key(project, 'import-bin.bst')
-
- # Ensure we have an artifact to read
- result = cli.run(project=project, args=['build', 'import-bin.bst'])
- assert result.exit_code == 0
-
- # List the contents via the key
- result = cli.run(project=project, args=['artifact', 'list-contents', 'test/import-bin/' + key])
- assert result.exit_code == 0
-
- expected_output = ("test/import-bin/" + key + ":\n"
- "\tusr\n"
- "\tusr/bin\n"
- "\tusr/bin/hello\n\n")
- assert expected_output in result.output
-
-
-@pytest.mark.datafiles(DATA_DIR)
-def test_artifact_list_exact_contents_glob(cli, datafiles):
- project = str(datafiles)
-
- # Ensure we have an artifact to read
- result = cli.run(project=project, args=['build', 'target.bst'])
- assert result.exit_code == 0
-
- # List the contents via glob
- result = cli.run(project=project, args=['artifact', 'list-contents', 'test/*'])
- assert result.exit_code == 0
-
- # get the cahe keys for each element in the glob
- import_bin_key = cli.get_element_key(project, 'import-bin.bst')
- import_dev_key = cli.get_element_key(project, 'import-dev.bst')
- compose_all_key = cli.get_element_key(project, 'compose-all.bst')
- target_key = cli.get_element_key(project, 'target.bst')
-
- expected_artifacts = ["test/import-bin/" + import_bin_key,
- "test/import-dev/" + import_dev_key,
- "test/compose-all/" + compose_all_key,
- "test/target/" + target_key]
-
- for artifact in expected_artifacts:
- assert artifact in result.output
-
-
-@pytest.mark.datafiles(DATA_DIR)
-def test_artifact_log_files(cli, datafiles):
- project = str(datafiles)
-
- # Ensure we have an artifact to read
- result = cli.run(project=project, args=['build', 'target.bst'])
- assert result.exit_code == 0
-
- logfiles = os.path.join(project, "logfiles")
- target = os.path.join(project, logfiles, "target.log")
- import_bin = os.path.join(project, logfiles, "import-bin.log")
- # Ensure the logfile doesn't exist before the command is run
- assert not os.path.exists(logfiles)
- assert not os.path.exists(target)
- assert not os.path.exists(import_bin)
-
- # Run the command and ensure the file now exists
- result = cli.run(project=project, args=['artifact', 'log', '--out', logfiles, 'target.bst', 'import-bin.bst'])
- assert result.exit_code == 0
- assert os.path.exists(logfiles)
- assert os.path.exists(target)
- assert os.path.exists(import_bin)
-
- # Ensure the file contains the logs by checking for the LOG line
- with open(target, 'r') as f:
- data = f.read()
- assert "LOG target.bst" in data
- with open(import_bin, 'r') as f:
- data = f.read()
- assert "LOG import-bin.bst" in data
-
-
# Test that we can delete the artifact of the element which corresponds
# to the current project state
@pytest.mark.datafiles(DATA_DIR)
@@ -400,106 +263,3 @@ def test_artifact_delete_artifact_with_deps_all_fails(cli, tmpdir, datafiles):
result.assert_main_error(ErrorDomain.STREAM, None)
assert "Error: '--deps all' is not supported for artifact refs" in result.stderr
-
-
-# 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
diff --git a/tests/frontend/artifact_list_contents.py b/tests/frontend/artifact_list_contents.py
new file mode 100644
index 000000000..5bb08e3fa
--- /dev/null
+++ b/tests/frontend/artifact_list_contents.py
@@ -0,0 +1,98 @@
+#
+# 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.testing import cli # pylint: disable=unused-import
+
+
+# Project directory
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "project",
+)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_artifact_list_exact_contents_element(cli, datafiles):
+ project = str(datafiles)
+
+ # Ensure we have an artifact to read
+ result = cli.run(project=project, args=['build', 'import-bin.bst'])
+ assert result.exit_code == 0
+
+ # List the contents via the element name
+ result = cli.run(project=project, args=['artifact', 'list-contents', 'import-bin.bst'])
+ assert result.exit_code == 0
+ expected_output = ("import-bin.bst:\n"
+ "\tusr\n"
+ "\tusr/bin\n"
+ "\tusr/bin/hello\n\n")
+ assert expected_output in result.output
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_artifact_list_exact_contents_ref(cli, datafiles):
+ project = str(datafiles)
+
+ # Get the cache key of our test element
+ key = cli.get_element_key(project, 'import-bin.bst')
+
+ # Ensure we have an artifact to read
+ result = cli.run(project=project, args=['build', 'import-bin.bst'])
+ assert result.exit_code == 0
+
+ # List the contents via the key
+ result = cli.run(project=project, args=['artifact', 'list-contents', 'test/import-bin/' + key])
+ assert result.exit_code == 0
+
+ expected_output = ("test/import-bin/" + key + ":\n"
+ "\tusr\n"
+ "\tusr/bin\n"
+ "\tusr/bin/hello\n\n")
+ assert expected_output in result.output
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_artifact_list_exact_contents_glob(cli, datafiles):
+ project = str(datafiles)
+
+ # Ensure we have an artifact to read
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+
+ # List the contents via glob
+ result = cli.run(project=project, args=['artifact', 'list-contents', 'test/*'])
+ assert result.exit_code == 0
+
+ # get the cahe keys for each element in the glob
+ import_bin_key = cli.get_element_key(project, 'import-bin.bst')
+ import_dev_key = cli.get_element_key(project, 'import-dev.bst')
+ compose_all_key = cli.get_element_key(project, 'compose-all.bst')
+ target_key = cli.get_element_key(project, 'target.bst')
+
+ expected_artifacts = ["test/import-bin/" + import_bin_key,
+ "test/import-dev/" + import_dev_key,
+ "test/compose-all/" + compose_all_key,
+ "test/target/" + target_key]
+
+ for artifact in expected_artifacts:
+ assert artifact in result.output
diff --git a/tests/frontend/artifact_log.py b/tests/frontend/artifact_log.py
new file mode 100644
index 000000000..39c9458ad
--- /dev/null
+++ b/tests/frontend/artifact_log.py
@@ -0,0 +1,99 @@
+#
+# 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.testing import cli # pylint: disable=unused-import
+
+
+# Project directory
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ "project",
+)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_artifact_log(cli, datafiles):
+ project = str(datafiles)
+
+ # Get the cache key of our test element
+ result = cli.run(project=project, silent=True, args=[
+ '--no-colors',
+ 'show', '--deps', 'none', '--format', '%{full-key}',
+ 'target.bst'
+ ])
+ key = result.output.strip()
+
+ # Ensure we have an artifact to read
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+
+ # Read the log via the element name
+ result = cli.run(project=project, args=['artifact', 'log', 'target.bst'])
+ assert result.exit_code == 0
+ log = result.output
+
+ # Assert that there actually was a log file
+ assert log != ''
+
+ # Read the log via the key
+ result = cli.run(project=project, args=['artifact', 'log', 'test/target/' + key])
+ assert result.exit_code == 0
+ assert log == result.output
+
+ # Read the log via glob
+ result = cli.run(project=project, args=['artifact', 'log', 'test/target/*'])
+ assert result.exit_code == 0
+ # The artifact is cached under both a strong key and a weak key
+ assert log == result.output
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_artifact_log_files(cli, datafiles):
+ project = str(datafiles)
+
+ # Ensure we have an artifact to read
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+
+ logfiles = os.path.join(project, "logfiles")
+ target = os.path.join(project, logfiles, "target.log")
+ import_bin = os.path.join(project, logfiles, "import-bin.log")
+ # Ensure the logfile doesn't exist before the command is run
+ assert not os.path.exists(logfiles)
+ assert not os.path.exists(target)
+ assert not os.path.exists(import_bin)
+
+ # Run the command and ensure the file now exists
+ result = cli.run(project=project, args=['artifact', 'log', '--out', logfiles, 'target.bst', 'import-bin.bst'])
+ assert result.exit_code == 0
+ assert os.path.exists(logfiles)
+ assert os.path.exists(target)
+ assert os.path.exists(import_bin)
+
+ # Ensure the file contains the logs by checking for the LOG line
+ with open(target, 'r') as f:
+ data = f.read()
+ assert "LOG target.bst" in data
+ with open(import_bin, 'r') as f:
+ data = f.read()
+ assert "LOG import-bin.bst" in data
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