summaryrefslogtreecommitdiff
path: root/tests/frontend/default_target.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/frontend/default_target.py')
-rw-r--r--tests/frontend/default_target.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/tests/frontend/default_target.py b/tests/frontend/default_target.py
new file mode 100644
index 000000000..d2a75c961
--- /dev/null
+++ b/tests/frontend/default_target.py
@@ -0,0 +1,184 @@
+# Pylint doesn't play well with fixtures and dependency injection from pytest
+# pylint: disable=redefined-outer-name
+
+import os
+
+import pytest
+
+from buildstream import _yaml
+from buildstream.testing import cli, create_repo # 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__)), "default-target",)
+
+
+###################################
+# build/show operations #
+###################################
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("operation,expected_state", [("show", "buildable"), ("build", "cached")])
+def test_no_default(cli, datafiles, operation, expected_state):
+ project = str(datafiles)
+ all_targets = ["dummy_1.bst", "dummy_2.bst", "dummy_3.bst", "dummy_stack.bst"]
+
+ result = cli.run(project=project, args=[operation])
+ result.assert_success()
+
+ states = cli.get_element_states(project, all_targets)
+ assert all(states[e] == expected_state for e in all_targets)
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("operation,expected_state", [("show", "buildable"), ("build", "cached")])
+def test_default_target(cli, datafiles, operation, expected_state):
+ project = str(datafiles)
+ project_path = os.path.join(project, "project.conf")
+
+ # First, modify project configuration to set a default target
+ project_conf = {
+ "name": "test-default-target",
+ "element-path": "elements",
+ "defaults": {"targets": ["dummy_stack.bst"]},
+ }
+ _yaml.roundtrip_dump(project_conf, project_path)
+
+ # dummy_stack only depends on dummy_1 and dummy_2, but not dummy_3
+ all_targets = ["dummy_1.bst", "dummy_2.bst", "dummy_stack.bst"]
+
+ result = cli.run(project=project, args=[operation])
+ result.assert_success()
+
+ states = cli.get_element_states(project, all_targets)
+ assert all(states[e] == expected_state for e in all_targets)
+
+ # assert that dummy_3 isn't included in the output
+ assert "dummy_3.bst" not in states
+
+
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize("operation,expected_state", [("show", "buildable"), ("build", "cached")])
+def test_no_default_with_junction(cli, datafiles, operation, expected_state):
+ project = str(datafiles)
+ junction_path = os.path.join(project, "elements", "junction.bst")
+ target_path = os.path.join(project, "elements", "junction-target.bst")
+
+ # First, create a junction element to refer to the subproject
+ junction_config = {"kind": "junction", "sources": [{"kind": "local", "path": "files/sub-project",}]}
+ _yaml.roundtrip_dump(junction_config, junction_path)
+
+ # Then, create a stack element with dependency on cross junction element
+ target_config = {"kind": "stack", "runtime-depends": ["junction.bst:dummy_subproject.bst"]}
+ _yaml.roundtrip_dump(target_config, target_path)
+
+ # Now try to perform the specified operation.
+ # This should automatically fetch the junction at load time.
+ result = cli.run(project=project, args=[operation])
+ result.assert_success()
+
+ assert cli.get_element_state(project, "junction.bst:dummy_subproject.bst") == expected_state
+ assert cli.get_element_state(project, "junction-target.bst") == expected_state
+
+
+###################################
+# track/fetch operations #
+###################################
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_default_target_track(cli, tmpdir, datafiles):
+ project = str(datafiles)
+ project_path = os.path.join(project, "project.conf")
+ target = "track-fetch-test.bst"
+
+ # First, create an element with trackable sources
+ repo = create_repo("git", str(tmpdir))
+ repo.create(project)
+ element_conf = {"kind": "import", "sources": [repo.source_config()]}
+ _yaml.roundtrip_dump(element_conf, os.path.join(project, "elements", target))
+
+ # Then, make it the default target
+ project_conf = {
+ "name": "test-default-target",
+ "element-path": "elements",
+ "defaults": {"targets": [target]},
+ }
+ _yaml.roundtrip_dump(project_conf, project_path)
+
+ # Setup finished. Track it now
+ assert cli.get_element_state(project, target) == "no reference"
+ result = cli.run(project=project, args=["source", "track"])
+ result.assert_success()
+ # Tracking will result in fetching it automatically, so we expect the state
+ # to be buildable.
+ assert cli.get_element_state(project, target) == "buildable"
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_default_target_fetch(cli, tmpdir, datafiles):
+ project = str(datafiles)
+ project_path = os.path.join(project, "project.conf")
+ target = "track-fetch-test.bst"
+
+ # First, create an element with trackable sources
+ repo = create_repo("git", str(tmpdir))
+ ref = repo.create(project)
+ element_conf = {"kind": "import", "sources": [repo.source_config(ref=ref)]}
+ _yaml.roundtrip_dump(element_conf, os.path.join(project, "elements", target))
+
+ # Then, make it the default target
+ project_conf = {
+ "name": "test-default-target",
+ "element-path": "elements",
+ "defaults": {"targets": [target]},
+ }
+ _yaml.roundtrip_dump(project_conf, project_path)
+
+ # Setup finished. Track it now
+ assert cli.get_element_state(project, target) == "fetch needed"
+ result = cli.run(project=project, args=["source", "fetch"])
+ result.assert_success()
+ assert cli.get_element_state(project, target) == "buildable"
+
+
+###################################
+# pull/push operations #
+###################################
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_default_target_push_pull(cli, tmpdir, datafiles):
+ project = str(datafiles)
+ project_path = os.path.join(project, "project.conf")
+ target = "dummy_1.bst"
+
+ # Set a default target
+ project_conf = {
+ "name": "test-default-target",
+ "element-path": "elements",
+ "defaults": {"targets": [target]},
+ }
+ _yaml.roundtrip_dump(project_conf, project_path)
+
+ # Build the target
+ result = cli.run(project=project, args=["build"])
+ result.assert_success()
+ assert cli.get_element_state(project, target) == "cached"
+
+ with create_artifact_share(os.path.join(str(tmpdir), "artifactshare")) as share:
+ # Push the artifacts
+ cli.configure({"artifacts": {"url": share.repo, "push": True}})
+ result = cli.run(project=project, args=["artifact", "push"])
+ result.assert_success()
+
+ # Delete local artifacts
+ # Note that `artifact delete` does not support default targets
+ result = cli.run(project=project, args=["artifact", "delete", target])
+ result.assert_success()
+
+ # Target should be buildable now, and we should be able to pull it
+ assert cli.get_element_state(project, target) == "buildable"
+ result = cli.run(project=project, args=["artifact", "pull"])
+ assert cli.get_element_state(project, target) == "cached"