diff options
author | Tristan van Berkom <tristan@codethink.co.uk> | 2020-10-26 17:18:24 +0900 |
---|---|---|
committer | Tristan van Berkom <tristan@codethink.co.uk> | 2020-11-04 14:39:06 +0900 |
commit | 4521792d03b899eca8dd376da781e55c5b16ab65 (patch) | |
tree | 66a409a0521f84e059b9dd339922408ca9619f6d | |
parent | 681501303d10f07528f295e61a3b17a88bffbf06 (diff) | |
download | buildstream-4521792d03b899eca8dd376da781e55c5b16ab65.tar.gz |
tests/format/junctions.py: Testing element override scenarios
* Test that we can override an element in a subproject with a local element,
the local element has a dependency on another element in the subproject
through the same junction.
* Test that we can override the dependency in the subproject, proving
that reverse dependencies in that subproject are built against the
overridden element.
* Test that we can override a subproject element using a local link
to another element in the same subproject.
* Test that we can declare an override of a subproject element using
a link in that subproject, and it will be effective even if that
link is not traversed by the actual dependency chain.
* Check that the same element being overridden multiple times in
a subproject is overridden by the highest level project which should
have the highest priority in the overrides.
34 files changed, 221 insertions, 5 deletions
diff --git a/tests/format/junctions.py b/tests/format/junctions.py index c4eea2d1c..5c65a5534 100644 --- a/tests/format/junctions.py +++ b/tests/format/junctions.py @@ -388,11 +388,48 @@ def test_full_path_not_found(cli, tmpdir, datafiles, target, provenance): # -# Test the overrides feature. +# Test overridding elements # -# Here we reuse the `nested` project since it already has deep -# nesting, and add to it a couple of additional junctions to -# test overriding of junctions at various depts +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize( + "target,expected", + [ + # Override an element in a subproject, this dependency will depend on + # the same element in the subproject as the overridden element did. + ("override-subproject-element.bst", ["element.txt", "subelement-override.txt", "subdep.txt"]), + # Override an element in a subproject while depending on an element which depends + # on the overridden element, in this case we ensure that the reverse dependencies + # of the replaced element are built against the replacement. + ("override-subproject-dep.bst", ["element.txt", "sub.txt", "subdep-override.txt"]), + # Override an element in a subproject with a local link element which points to another + # element in the same subproject. + ("override-subproject-element-with-link.bst", ["element.txt", "sub-alternative.txt", "subdep.txt"]), + # Override a link to an element in a subproject with an alternative element + # in the same subproject. + ("override-subproject-element-using-link.bst", ["element.txt", "sub-alternative.txt", "subdep.txt"]), + # Override an element in a nested subsubproject, where the intermediate project also overrides + # the same element + ("override-subsubproject.bst", ["element.txt", "subsub.txt", "subdep-override.txt"]), + ], + ids=["element-with-deps", "dependency-of-element", "with-link", "using-link", "priority",], +) +def test_override_element(cli, tmpdir, datafiles, target, expected): + project = os.path.join(str(datafiles), "override-element") + checkoutdir = os.path.join(str(tmpdir), "checkout") + + # Build, checkout + result = cli.run(project=project, args=["build", target]) + result.assert_success() + result = cli.run(project=project, args=["artifact", "checkout", target, "--directory", checkoutdir]) + result.assert_success() + + # Check that the checkout contains the expected file(s) + for expect in expected: + assert os.path.exists(os.path.join(checkoutdir, expect)) + + +# +# Test overridding junctions # @pytest.mark.datafiles(DATA_DIR) @pytest.mark.parametrize( @@ -420,7 +457,7 @@ def test_full_path_not_found(cli, tmpdir, datafiles, target, provenance): "override-subproject-with-subsubproject", ], ) -def test_overrides(cli, tmpdir, datafiles, target, expected): +def test_override_junction(cli, tmpdir, datafiles, target, expected): project = os.path.join(str(datafiles), "overrides") checkoutdir = os.path.join(str(tmpdir), "checkout") diff --git a/tests/format/junctions/override-element/element.txt b/tests/format/junctions/override-element/element.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/element.txt diff --git a/tests/format/junctions/override-element/override-subproject-dep.bst b/tests/format/junctions/override-element/override-subproject-dep.bst new file mode 100644 index 000000000..814afc1d4 --- /dev/null +++ b/tests/format/junctions/override-element/override-subproject-dep.bst @@ -0,0 +1,11 @@ +kind: import +sources: +- kind: local + path: element.txt + +# +# Depend on the subproject using a junction which overrides the dependency +# of the element we're depending on. +# +depends: +- subproject-override-dep.bst:subelement.bst diff --git a/tests/format/junctions/override-element/override-subproject-element-using-link.bst b/tests/format/junctions/override-element/override-subproject-element-using-link.bst new file mode 100644 index 000000000..ed196f568 --- /dev/null +++ b/tests/format/junctions/override-element/override-subproject-element-using-link.bst @@ -0,0 +1,12 @@ +kind: import +sources: +- kind: local + path: element.txt + +# +# Depend on the subproject using a junction which overrides the +# element we're depending on, using a link to address the element +# we are overridding. +# +depends: +- subproject-override-element-using-link.bst:subelement.bst diff --git a/tests/format/junctions/override-element/override-subproject-element-with-link.bst b/tests/format/junctions/override-element/override-subproject-element-with-link.bst new file mode 100644 index 000000000..d58a59bf1 --- /dev/null +++ b/tests/format/junctions/override-element/override-subproject-element-with-link.bst @@ -0,0 +1,12 @@ +kind: import +sources: +- kind: local + path: element.txt + +# +# Depend on the subproject using a junction which overrides the +# element we're depending on, with a local link to an alternative +# element in that same subproject. +# +depends: +- subproject-override-element-with-link.bst:subelement.bst diff --git a/tests/format/junctions/override-element/override-subproject-element.bst b/tests/format/junctions/override-element/override-subproject-element.bst new file mode 100644 index 000000000..74782110a --- /dev/null +++ b/tests/format/junctions/override-element/override-subproject-element.bst @@ -0,0 +1,11 @@ +kind: import +sources: +- kind: local + path: element.txt + +# +# Depend on the subproject using a junction which overrides the +# element we're depending on. +# +depends: +- subproject-override-element.bst:subelement.bst diff --git a/tests/format/junctions/override-element/override-subsubproject.bst b/tests/format/junctions/override-element/override-subsubproject.bst new file mode 100644 index 000000000..8d26dc19d --- /dev/null +++ b/tests/format/junctions/override-element/override-subsubproject.bst @@ -0,0 +1,12 @@ +kind: import +sources: +- kind: local + path: element.txt + +# +# Depend on the subsubproject element, and override it's dependency, the intermediate +# project also overrides the same subsubproject element, and this test ensures +# that the toplevel override takes precedence. +# +depends: +- subproject-override-subsubproject-element.bst:subsubproject-override-dep.bst:subsubelement.bst diff --git a/tests/format/junctions/override-element/project.conf b/tests/format/junctions/override-element/project.conf new file mode 100644 index 000000000..20636c446 --- /dev/null +++ b/tests/format/junctions/override-element/project.conf @@ -0,0 +1,2 @@ +name: test +min-version: 2.0 diff --git a/tests/format/junctions/override-element/subdep-override.bst b/tests/format/junctions/override-element/subdep-override.bst new file mode 100644 index 000000000..93d4a5402 --- /dev/null +++ b/tests/format/junctions/override-element/subdep-override.bst @@ -0,0 +1,4 @@ +kind: import +sources: +- kind: local + path: subdep-override.txt diff --git a/tests/format/junctions/override-element/subdep-override.txt b/tests/format/junctions/override-element/subdep-override.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subdep-override.txt diff --git a/tests/format/junctions/override-element/subelement-alternative-link.bst b/tests/format/junctions/override-element/subelement-alternative-link.bst new file mode 100644 index 000000000..bd43d0750 --- /dev/null +++ b/tests/format/junctions/override-element/subelement-alternative-link.bst @@ -0,0 +1,8 @@ +kind: link + +# +# This link replaces subelement.bst in the same project, use the +# same junction to access the alternative in the subproject. +# +config: + target: subproject-override-element-with-link.bst:subelement-alternative.bst diff --git a/tests/format/junctions/override-element/subelement-override.bst b/tests/format/junctions/override-element/subelement-override.bst new file mode 100644 index 000000000..99715e098 --- /dev/null +++ b/tests/format/junctions/override-element/subelement-override.bst @@ -0,0 +1,14 @@ +kind: import +sources: +- kind: local + path: subelement-override.txt + +# We override the subproject direct dependency with this element, +# and this element explicitly depends on it's dependency in that +# subproject. +# +# The dependency we depend on happens to be the same dependency +# as the element we are overridding. +# +depends: +- subproject-override-element.bst:subdependency.bst diff --git a/tests/format/junctions/override-element/subelement-override.txt b/tests/format/junctions/override-element/subelement-override.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subelement-override.txt diff --git a/tests/format/junctions/override-element/subproject-override-dep.bst b/tests/format/junctions/override-element/subproject-override-dep.bst new file mode 100644 index 000000000..f39b7393b --- /dev/null +++ b/tests/format/junctions/override-element/subproject-override-dep.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + overrides: + subdependency.bst: subdep-override.bst diff --git a/tests/format/junctions/override-element/subproject-override-element-using-link.bst b/tests/format/junctions/override-element/subproject-override-element-using-link.bst new file mode 100644 index 000000000..f4d36d7ea --- /dev/null +++ b/tests/format/junctions/override-element/subproject-override-element-using-link.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + overrides: + subelement-link.bst: subproject-override-element-using-link.bst:subelement-alternative.bst diff --git a/tests/format/junctions/override-element/subproject-override-element-with-link.bst b/tests/format/junctions/override-element/subproject-override-element-with-link.bst new file mode 100644 index 000000000..1a8a5fc53 --- /dev/null +++ b/tests/format/junctions/override-element/subproject-override-element-with-link.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + overrides: + subelement.bst: subelement-alternative-link.bst diff --git a/tests/format/junctions/override-element/subproject-override-element.bst b/tests/format/junctions/override-element/subproject-override-element.bst new file mode 100644 index 000000000..cc9fa80a4 --- /dev/null +++ b/tests/format/junctions/override-element/subproject-override-element.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + overrides: + subelement.bst: subelement-override.bst diff --git a/tests/format/junctions/override-element/subproject-override-subsubproject-element.bst b/tests/format/junctions/override-element/subproject-override-subsubproject-element.bst new file mode 100644 index 000000000..be8b900ad --- /dev/null +++ b/tests/format/junctions/override-element/subproject-override-subsubproject-element.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subproject + +config: + overrides: + subsubproject-override-dep.bst:subsubdependency.bst: subdep-override.bst diff --git a/tests/format/junctions/override-element/subproject/project.conf b/tests/format/junctions/override-element/subproject/project.conf new file mode 100644 index 000000000..39a53e2ab --- /dev/null +++ b/tests/format/junctions/override-element/subproject/project.conf @@ -0,0 +1,2 @@ +name: subtest +min-version: 2.0 diff --git a/tests/format/junctions/override-element/subproject/sub-alternative.txt b/tests/format/junctions/override-element/subproject/sub-alternative.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/sub-alternative.txt diff --git a/tests/format/junctions/override-element/subproject/sub.txt b/tests/format/junctions/override-element/subproject/sub.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/sub.txt diff --git a/tests/format/junctions/override-element/subproject/subdep.txt b/tests/format/junctions/override-element/subproject/subdep.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subdep.txt diff --git a/tests/format/junctions/override-element/subproject/subdependency.bst b/tests/format/junctions/override-element/subproject/subdependency.bst new file mode 100644 index 000000000..59e549210 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subdependency.bst @@ -0,0 +1,4 @@ +kind: import +sources: +- kind: local + path: subdep.txt diff --git a/tests/format/junctions/override-element/subproject/subelement-alternative.bst b/tests/format/junctions/override-element/subproject/subelement-alternative.bst new file mode 100644 index 000000000..51a063799 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subelement-alternative.bst @@ -0,0 +1,7 @@ +kind: import +sources: +- kind: local + path: sub-alternative.txt + +depends: +- subdependency.bst diff --git a/tests/format/junctions/override-element/subproject/subelement-link.bst b/tests/format/junctions/override-element/subproject/subelement-link.bst new file mode 100644 index 000000000..874969cee --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subelement-link.bst @@ -0,0 +1,8 @@ +kind: link + +# +# A link to the subelement, used by the override in +# the subproject-override-element-using-link.bst junction +# +config: + target: subelement.bst diff --git a/tests/format/junctions/override-element/subproject/subelement.bst b/tests/format/junctions/override-element/subproject/subelement.bst new file mode 100644 index 000000000..aff3b3f6e --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subelement.bst @@ -0,0 +1,7 @@ +kind: import +sources: +- kind: local + path: sub.txt + +depends: +- subdependency.bst diff --git a/tests/format/junctions/override-element/subproject/subsubdep-override.bst b/tests/format/junctions/override-element/subproject/subsubdep-override.bst new file mode 100644 index 000000000..9ab11a2f8 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubdep-override.bst @@ -0,0 +1,4 @@ +kind: import +sources: +- kind: local + path: subsubdep-override.txt diff --git a/tests/format/junctions/override-element/subproject/subsubdep-override.txt b/tests/format/junctions/override-element/subproject/subsubdep-override.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubdep-override.txt diff --git a/tests/format/junctions/override-element/subproject/subsubproject-override-dep.bst b/tests/format/junctions/override-element/subproject/subsubproject-override-dep.bst new file mode 100644 index 000000000..6b2379d7c --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject-override-dep.bst @@ -0,0 +1,8 @@ +kind: junction +sources: +- kind: local + path: subsubproject + +config: + overrides: + subsubdependency.bst: subsubdep-override.bst diff --git a/tests/format/junctions/override-element/subproject/subsubproject/project.conf b/tests/format/junctions/override-element/subproject/subsubproject/project.conf new file mode 100644 index 000000000..d11bcbb30 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject/project.conf @@ -0,0 +1,2 @@ +name: subsubtest +min-version: 2.0 diff --git a/tests/format/junctions/override-element/subproject/subsubproject/subsub.txt b/tests/format/junctions/override-element/subproject/subsubproject/subsub.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject/subsub.txt diff --git a/tests/format/junctions/override-element/subproject/subsubproject/subsubdep.txt b/tests/format/junctions/override-element/subproject/subsubproject/subsubdep.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject/subsubdep.txt diff --git a/tests/format/junctions/override-element/subproject/subsubproject/subsubdependency.bst b/tests/format/junctions/override-element/subproject/subsubproject/subsubdependency.bst new file mode 100644 index 000000000..d235791b5 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject/subsubdependency.bst @@ -0,0 +1,4 @@ +kind: import +sources: +- kind: local + path: subsubdep.txt diff --git a/tests/format/junctions/override-element/subproject/subsubproject/subsubelement.bst b/tests/format/junctions/override-element/subproject/subsubproject/subsubelement.bst new file mode 100644 index 000000000..087a562b6 --- /dev/null +++ b/tests/format/junctions/override-element/subproject/subsubproject/subsubelement.bst @@ -0,0 +1,7 @@ +kind: import +sources: +- kind: local + path: subsub.txt + +depends: +- subsubdependency.bst |