summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-08-12 16:53:35 -0400
committerTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-08-31 15:58:31 +0300
commit5044fd257046073fc6f1c43029c71bef07b8cbe7 (patch)
tree61a4739380dd688ccd877c8ed86596ff377edbd9
parentb082f9aad9b33c1dcbbc457a1ae1c0b7f31f6258 (diff)
downloadbuildstream-5044fd257046073fc6f1c43029c71bef07b8cbe7.tar.gz
tests/frontend/show.py: Test that strict dependencies behave as expected
This tests that the target which depends on a common dependency strictly in non strict mode needs to be rebuilt after this common dependency changes, while it is not the case when depending on the same common target non strictly. This is a regression test for #254
-rw-r--r--tests/frontend/show.py60
-rw-r--r--tests/frontend/strict-depends/elements/base.bst5
-rw-r--r--tests/frontend/strict-depends/elements/non-strict-depends.bst4
-rw-r--r--tests/frontend/strict-depends/elements/strict-depends.bst5
-rw-r--r--tests/frontend/strict-depends/files/hello.txt1
-rw-r--r--tests/frontend/strict-depends/project.conf2
6 files changed, 73 insertions, 4 deletions
diff --git a/tests/frontend/show.py b/tests/frontend/show.py
index 8bb0bab3f..92fa1f5f7 100644
--- a/tests/frontend/show.py
+++ b/tests/frontend/show.py
@@ -11,10 +11,8 @@ from buildstream._exceptions import ErrorDomain, LoadErrorReason
from . import configure_project
# Project directory
-DATA_DIR = os.path.join(
- os.path.dirname(os.path.realpath(__file__)),
- "project",
-)
+TOP_DIR = os.path.dirname(os.path.realpath(__file__))
+DATA_DIR = os.path.join(TOP_DIR, "project")
@pytest.mark.datafiles(DATA_DIR)
@@ -371,3 +369,57 @@ def test_max_jobs(cli, datafiles, cli_value, config_value):
else:
# Check that we got the explicitly set value
assert loaded_value == int(expected_value)
+
+
+# This tests that cache keys behave as expected when
+# dependencies have been specified as `strict` and
+# when building in strict mode.
+#
+# This test will:
+#
+# * Build the target once (and assert that it is cached)
+# * Modify some local files which are imported
+# by an import element which the target depends on
+# * Assert that the cached state of the target element
+# is as expected
+#
+# We run the test twice, once with an element which strict
+# depends on the changing import element, and one which
+# depends on it regularly.
+#
+@pytest.mark.datafiles(os.path.join(TOP_DIR, 'strict-depends'))
+@pytest.mark.parametrize("target, expected_state", [
+ ("non-strict-depends.bst", "cached"),
+ ("strict-depends.bst", "waiting"),
+])
+def test_strict_dependencies(cli, datafiles, target, expected_state):
+ project = str(datafiles)
+
+ # Configure non strict mode, this will have
+ # an effect on the build and the `bst show`
+ # commands run via cli.get_element_states()
+ cli.configure({
+ 'projects': {
+ 'test': {
+ 'strict': False
+ }
+ }
+ })
+
+ result = cli.run(project=project, silent=True, args=['build', target])
+ result.assert_success()
+
+ states = cli.get_element_states(project, target)
+ assert states['base.bst'] == 'cached'
+ assert states[target] == 'cached'
+
+ # Now modify the file, effectively causing the common base.bst
+ # dependency to change it's cache key
+ hello_path = os.path.join(project, 'files', 'hello.txt')
+ with open(hello_path, 'w') as f:
+ f.write("Goodbye")
+
+ # Now assert that we have the states we expect as a result
+ states = cli.get_element_states(project, target)
+ assert states['base.bst'] == 'buildable'
+ assert states[target] == expected_state
diff --git a/tests/frontend/strict-depends/elements/base.bst b/tests/frontend/strict-depends/elements/base.bst
new file mode 100644
index 000000000..ed6197699
--- /dev/null
+++ b/tests/frontend/strict-depends/elements/base.bst
@@ -0,0 +1,5 @@
+kind: import
+
+sources:
+- kind: local
+ path: files
diff --git a/tests/frontend/strict-depends/elements/non-strict-depends.bst b/tests/frontend/strict-depends/elements/non-strict-depends.bst
new file mode 100644
index 000000000..9ab119bde
--- /dev/null
+++ b/tests/frontend/strict-depends/elements/non-strict-depends.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+build-depends:
+- base.bst
diff --git a/tests/frontend/strict-depends/elements/strict-depends.bst b/tests/frontend/strict-depends/elements/strict-depends.bst
new file mode 100644
index 000000000..1e4e29414
--- /dev/null
+++ b/tests/frontend/strict-depends/elements/strict-depends.bst
@@ -0,0 +1,5 @@
+kind: stack
+
+build-depends:
+- filename: base.bst
+ strict: true
diff --git a/tests/frontend/strict-depends/files/hello.txt b/tests/frontend/strict-depends/files/hello.txt
new file mode 100644
index 000000000..f62144808
--- /dev/null
+++ b/tests/frontend/strict-depends/files/hello.txt
@@ -0,0 +1 @@
+pony
diff --git a/tests/frontend/strict-depends/project.conf b/tests/frontend/strict-depends/project.conf
new file mode 100644
index 000000000..627522526
--- /dev/null
+++ b/tests/frontend/strict-depends/project.conf
@@ -0,0 +1,2 @@
+name: test
+element-path: elements