summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan van Berkom <tristan.vanberkom@codethink.co.uk>2020-06-08 19:08:04 +0900
committerTristan van Berkom <tristan.vanberkom@codethink.co.uk>2020-06-23 19:27:10 +0900
commit364ea9dd96f953e96f954669958e60741380e0ff (patch)
treecebda392fa4c6ae7657de9e8d022b29288399a5c
parent5f75fefe5f66175664bd7ab317552fd1a2c6b650 (diff)
downloadbuildstream-364ea9dd96f953e96f954669958e60741380e0ff.tar.gz
tests/format/junctions.py: Adding tests for the overrides feature
* Test various scenarios of overriding junctions, including deep paths as junctions to override, and as junctions to use to override. * Test conflicting junction configurations, ensuring that we report both provenances of where the junctions were declared. * Test circular references in element paths while declaring overrides, for instance when trying to override a subproject using a deeper definition of the same subproject.
-rw-r--r--tests/format/junctions.py171
-rw-r--r--tests/format/junctions/circular-references/link-subsubsubproject.bst4
-rw-r--r--tests/format/junctions/circular-references/project.conf2
-rw-r--r--tests/format/junctions/circular-references/subproject-overriden-with-circular-reference-link.bst8
-rw-r--r--tests/format/junctions/circular-references/subproject-overriden-with-circular-reference.bst8
-rw-r--r--tests/format/junctions/circular-references/subproject.bst4
-rw-r--r--tests/format/junctions/circular-references/subproject/project.conf2
-rw-r--r--tests/format/junctions/circular-references/subproject/sub.txt1
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject.bst4
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/project.conf2
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/subsub.txt1
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject.bst4
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/project.conf2
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/subsubsub.txt1
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/target.bst4
-rw-r--r--tests/format/junctions/circular-references/subproject/subsubproject/target.bst4
-rw-r--r--tests/format/junctions/circular-references/subproject/target.bst4
-rw-r--r--tests/format/junctions/circular-references/target-overridden-subsubproject-circular-link.bst4
-rw-r--r--tests/format/junctions/circular-references/target-overridden-subsubproject-circular.bst4
-rw-r--r--tests/format/junctions/conflicts/include-conflict-target.bst5
-rw-r--r--tests/format/junctions/conflicts/include-conflict.bst7
-rw-r--r--tests/format/junctions/conflicts/nested-conflict-toplevel.bst4
-rw-r--r--tests/format/junctions/conflicts/override-conflict.bst8
-rw-r--r--tests/format/junctions/conflicts/plugin-conflict.bst4
-rw-r--r--tests/format/junctions/conflicts/project.conf2
-rw-r--r--tests/format/junctions/conflicts/simple-conflict.bst5
-rw-r--r--tests/format/junctions/conflicts/subproject-override-conflicting-path.bst13
-rw-r--r--tests/format/junctions/conflicts/subproject.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/project.conf2
-rw-r--r--tests/format/junctions/conflicts/subproject/sub.txt1
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject-conflict-target.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject-conflict.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject-conflict/deepsurprise.txt1
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject-conflict/project.conf2
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject-conflict/target.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/project.conf2
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/subsub.txt1
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/project.conf2
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/subsubsub.txt1
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/target.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/subsubproject/target.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject/target.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject2.bst4
-rw-r--r--tests/format/junctions/conflicts/subproject2/inc.yaml1
-rw-r--r--tests/format/junctions/conflicts/subproject2/plugins/found.py19
-rw-r--r--tests/format/junctions/conflicts/subproject2/project.conf8
-rw-r--r--tests/format/junctions/conflicts/subproject2/sub2.txt1
-rw-r--r--tests/format/junctions/conflicts/subproject2/target.bst4
-rw-r--r--tests/format/junctions/invalid/subproject-self-override.bst16
-rw-r--r--tests/format/junctions/invalid/target-self-override.bst4
-rw-r--r--tests/format/junctions/override-twice/override.bst4
-rw-r--r--tests/format/junctions/override-twice/override/overridden-again.txt1
-rw-r--r--tests/format/junctions/override-twice/override/project.conf2
-rw-r--r--tests/format/junctions/override-twice/override/target.bst4
-rw-r--r--tests/format/junctions/override-twice/project.conf2
-rw-r--r--tests/format/junctions/override-twice/subproject.bst8
-rw-r--r--tests/format/junctions/override-twice/subproject/override.bst4
-rw-r--r--tests/format/junctions/override-twice/subproject/override/overridden.txt1
-rw-r--r--tests/format/junctions/override-twice/subproject/override/project.conf2
-rw-r--r--tests/format/junctions/override-twice/subproject/override/target.bst4
-rw-r--r--tests/format/junctions/override-twice/subproject/project.conf2
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject.bst8
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject/project.conf2
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject.bst4
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/original.txt1
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/project.conf2
-rw-r--r--tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/target.bst4
-rw-r--r--tests/format/junctions/override-twice/target.bst4
-rw-r--r--tests/format/junctions/overrides/overridden-subsubproject.bst10
-rw-r--r--tests/format/junctions/overrides/overridden-subsubsubproject.bst10
-rw-r--r--tests/format/junctions/overrides/project.conf2
-rw-r--r--tests/format/junctions/overrides/subproject-overriden-with-deep-subproject.bst8
-rw-r--r--tests/format/junctions/overrides/subproject-with-deep-override.bst8
-rw-r--r--tests/format/junctions/overrides/subproject-with-override.bst8
-rw-r--r--tests/format/junctions/overrides/subproject.bst4
-rw-r--r--tests/format/junctions/overrides/subproject/project.conf2
-rw-r--r--tests/format/junctions/overrides/subproject/sub.txt1
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject.bst4
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/project.conf2
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/subsub.txt1
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject.bst4
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/project.conf2
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/subsubsub.txt1
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/target.bst4
-rw-r--r--tests/format/junctions/overrides/subproject/subsubproject/target.bst4
-rw-r--r--tests/format/junctions/overrides/subproject/target.bst4
-rw-r--r--tests/format/junctions/overrides/surpriseproject.bst4
-rw-r--r--tests/format/junctions/overrides/surpriseproject/deepsurpriseproject.bst4
-rw-r--r--tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/deepsurprise.txt1
-rw-r--r--tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/project.conf2
-rw-r--r--tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/target.bst4
-rw-r--r--tests/format/junctions/overrides/surpriseproject/project.conf2
-rw-r--r--tests/format/junctions/overrides/surpriseproject/surprise.txt1
-rw-r--r--tests/format/junctions/overrides/surpriseproject/target.bst4
-rw-r--r--tests/format/junctions/overrides/target-overridden-subsubproject.bst12
-rw-r--r--tests/format/junctions/overrides/target-overridden-subsubsubproject.bst8
-rw-r--r--tests/format/junctions/overrides/target-overridden-with-deepsubproject.bst4
99 files changed, 565 insertions, 6 deletions
diff --git a/tests/format/junctions.py b/tests/format/junctions.py
index 0cdbc6183..cf1ae4c26 100644
--- a/tests/format/junctions.py
+++ b/tests/format/junctions.py
@@ -141,25 +141,39 @@ def test_missing_files(cli, datafiles, target, provenance):
#
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize(
- "target,reason,provenance",
+ "target,domain,reason,provenance",
[
# Test a junction which itself has dependencies
- ("junction-with-deps.bst", LoadErrorReason.INVALID_JUNCTION, "base-with-deps.bst [line 6 column 2]"),
+ (
+ "junction-with-deps.bst",
+ ErrorDomain.LOAD,
+ LoadErrorReason.INVALID_JUNCTION,
+ "base-with-deps.bst [line 6 column 2]",
+ ),
# Test having a dependency directly on a junction
- ("junction-dep.bst", LoadErrorReason.INVALID_DATA, "junction-dep.bst [line 3 column 2]"),
+ ("junction-dep.bst", ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA, "junction-dep.bst [line 3 column 2]"),
# Test that we error correctly when we junction-depend on a non-junction
(
"junctiondep-not-a-junction.bst",
+ ErrorDomain.LOAD,
LoadErrorReason.INVALID_DATA,
"junctiondep-not-a-junction.bst [line 3 column 2]",
),
+ # Test that overriding a subproject junction with the junction
+ # declaring the override itself will result in an error
+ (
+ "target-self-override.bst",
+ ErrorDomain.ELEMENT,
+ "override-junction-with-self",
+ "subproject-self-override.bst [line 16 column 20]",
+ ),
],
- ids=["junction-with-deps", "deps-on-junction", "use-element-as-junction"],
+ ids=["junction-with-deps", "deps-on-junction", "use-element-as-junction", "override-with-self"],
)
-def test_invalid(cli, datafiles, target, reason, provenance):
+def test_invalid(cli, datafiles, target, domain, reason, provenance):
project = os.path.join(str(datafiles), "invalid")
result = cli.run(project=project, args=["build", target])
- result.assert_main_error(ErrorDomain.LOAD, reason)
+ result.assert_main_error(domain, reason)
assert provenance in result.stderr
@@ -371,3 +385,148 @@ def test_full_path_not_found(cli, tmpdir, datafiles, target, provenance):
# Check that provenance was provided if expected
if provenance:
assert provenance in result.stderr
+
+
+#
+# Test the overrides feature.
+#
+# 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",
+ [
+ # Test that we can override a subproject junction of a subproject
+ ("target-overridden-subsubproject.bst", "subsubsub.txt"),
+ # Test that we can override a subproject junction of a subproject's subproject
+ ("target-overridden-subsubsubproject.bst", "surprise.txt"),
+ # Test that we can override a subproject junction with a deep subproject path
+ ("target-overridden-with-deepsubproject.bst", "deepsurprise.txt"),
+ ],
+ ids=["override-subproject", "override-subsubproject", "override-subproject-with-subsubproject"],
+)
+def test_overrides(cli, tmpdir, datafiles, target, expected):
+ project = os.path.join(str(datafiles), "overrides")
+ 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
+ assert os.path.exists(os.path.join(checkoutdir, expected))
+
+
+# Tests a situation where the same deep subproject is overridden
+# more than once.
+#
+@pytest.mark.datafiles(DATA_DIR)
+def test_override_twice(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), "override-twice")
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=["build", "target.bst"])
+ result.assert_success()
+ result = cli.run(project=project, args=["artifact", "checkout", "target.bst", "--directory", checkoutdir])
+ result.assert_success()
+
+ # Check that the checkout contains the expected file
+ assert os.path.exists(os.path.join(checkoutdir, "overridden-again.txt"))
+
+
+#
+# Test conflicting junction scenarios
+#
+# Note here we assert 2 provenances, we want to ensure that both
+# provenances leading up to the use of a project are accounted for
+# in a conflicting junction error.
+#
+# The second provenance can be None, because there will be no
+# provenance for the originally loaded project if it was the toplevel
+# project, or in some cases when a full path to a deep element was
+# specified directly on the command line.
+#
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize(
+ "target,provenances",
+ [
+ # Test a stack element which depends directly on the same project twice
+ ("simple-conflict.bst", ["simple-conflict.bst [line 5 column 2]", "simple-conflict.bst [line 4 column 2]"]),
+ # Test a dependency chain leading deep into a project which conflicts with the toplevel
+ ("nested-conflict-toplevel.bst", ["subproject.bst:subsubproject-conflict-target.bst [line 4 column 2]"]),
+ # Test an attempt to override a subproject with a subproject of that same subproject through a different junction
+ (
+ "override-conflict.bst",
+ [
+ "subproject-override-conflicting-path.bst [line 13 column 23]",
+ "override-conflict.bst [line 8 column 2]",
+ ],
+ ),
+ # Same test as above, but specifying the target as a full path instead of a stack element
+ (
+ "subproject-override-conflicting-path.bst:subsubproject.bst:target.bst",
+ ["subproject-override-conflicting-path.bst [line 13 column 23]"],
+ ),
+ # Test a dependency on a subproject conflicting with an include of a file from a different
+ # version of the same project
+ (
+ "include-conflict-target.bst",
+ ["include-conflict-target.bst [line 5 column 2]", "include-conflict.bst [line 4 column 7]"],
+ ),
+ # Test an element kind which needs to load it's plugin from a subproject, but
+ # the element has a dependency on an element from a different version of the same project
+ ("plugin-conflict.bst", ["project.conf [line 4 column 2]", "plugin-conflict.bst [line 4 column 2]"]),
+ ],
+ ids=["simple", "nested", "override", "override-full-path", "include", "plugin"],
+)
+def test_conflict(cli, tmpdir, datafiles, target, provenances):
+ project = os.path.join(str(datafiles), "conflicts")
+
+ # Special case setup the conflicting project.conf
+ if target == "plugin-conflict.bst":
+ update_project(
+ project, {"plugins": [{"origin": "junction", "junction": "subproject2.bst", "elements": ["found"],}]},
+ )
+
+ result = cli.run(project=project, args=["build", target])
+ result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.CONFLICTING_JUNCTION)
+
+ # Assert expected provenances
+ for provenance in provenances:
+ assert provenance in result.stderr
+
+
+#
+# Test circular references in junction override cycles
+#
+@pytest.mark.datafiles(DATA_DIR)
+@pytest.mark.parametrize(
+ "target,provenance1,provenance2",
+ [
+ # Override a subprojects subsubproject, with a subproject of the
+ # subsubproject being overridden.
+ (
+ "target-overridden-subsubproject-circular.bst",
+ "subproject-overriden-with-circular-reference.bst [line 8 column 23]",
+ None,
+ ),
+ (
+ "target-overridden-subsubproject-circular-link.bst",
+ "link-subsubsubproject.bst [line 4 column 10]",
+ "target-overridden-subsubproject-circular-link.bst [line 4 column 2]",
+ ),
+ ],
+ ids=["override-self", "override-self-using-link"],
+)
+def test_circular_reference(cli, tmpdir, datafiles, target, provenance1, provenance2):
+ project = os.path.join(str(datafiles), "circular-references")
+ result = cli.run(project=project, args=["build", target])
+ result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.CIRCULAR_REFERENCE)
+ assert provenance1 in result.stderr
+ if provenance2:
+ assert provenance2 in result.stderr
diff --git a/tests/format/junctions/circular-references/link-subsubsubproject.bst b/tests/format/junctions/circular-references/link-subsubsubproject.bst
new file mode 100644
index 000000000..b10db7740
--- /dev/null
+++ b/tests/format/junctions/circular-references/link-subsubsubproject.bst
@@ -0,0 +1,4 @@
+kind: link
+
+config:
+ target: subproject-overriden-with-circular-reference-link.bst:subsubproject.bst:subsubsubproject.bst
diff --git a/tests/format/junctions/circular-references/project.conf b/tests/format/junctions/circular-references/project.conf
new file mode 100644
index 000000000..20636c446
--- /dev/null
+++ b/tests/format/junctions/circular-references/project.conf
@@ -0,0 +1,2 @@
+name: test
+min-version: 2.0
diff --git a/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference-link.bst b/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference-link.bst
new file mode 100644
index 000000000..9d8b34111
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference-link.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst: link-subsubsubproject.bst
diff --git a/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference.bst b/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference.bst
new file mode 100644
index 000000000..1cdbc44a6
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject-overriden-with-circular-reference.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst: subproject-overriden-with-circular-reference.bst:subsubproject.bst:subsubsubproject.bst
diff --git a/tests/format/junctions/circular-references/subproject.bst b/tests/format/junctions/circular-references/subproject.bst
new file mode 100644
index 000000000..c88189cb0
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
diff --git a/tests/format/junctions/circular-references/subproject/project.conf b/tests/format/junctions/circular-references/subproject/project.conf
new file mode 100644
index 000000000..39a53e2ab
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/project.conf
@@ -0,0 +1,2 @@
+name: subtest
+min-version: 2.0
diff --git a/tests/format/junctions/circular-references/subproject/sub.txt b/tests/format/junctions/circular-references/subproject/sub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/sub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject.bst b/tests/format/junctions/circular-references/subproject/subsubproject.bst
new file mode 100644
index 000000000..f535ab0e0
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubproject
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/project.conf b/tests/format/junctions/circular-references/subproject/subsubproject/project.conf
new file mode 100644
index 000000000..d11bcbb30
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/subsub.txt b/tests/format/junctions/circular-references/subproject/subsubproject/subsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/subsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject.bst b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject.bst
new file mode 100644
index 000000000..bce64597b
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubsubproject
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/project.conf b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/subsubsub.txt b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/subsubsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/subsubsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/target.bst b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/target.bst
new file mode 100644
index 000000000..351c9a22d
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/subsubsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsubsub.txt
diff --git a/tests/format/junctions/circular-references/subproject/subsubproject/target.bst b/tests/format/junctions/circular-references/subproject/subsubproject/target.bst
new file mode 100644
index 000000000..afafac601
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/subsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsub.txt
diff --git a/tests/format/junctions/circular-references/subproject/target.bst b/tests/format/junctions/circular-references/subproject/target.bst
new file mode 100644
index 000000000..e24d9bbb4
--- /dev/null
+++ b/tests/format/junctions/circular-references/subproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: sub.txt
diff --git a/tests/format/junctions/circular-references/target-overridden-subsubproject-circular-link.bst b/tests/format/junctions/circular-references/target-overridden-subsubproject-circular-link.bst
new file mode 100644
index 000000000..32617f620
--- /dev/null
+++ b/tests/format/junctions/circular-references/target-overridden-subsubproject-circular-link.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject-overriden-with-circular-reference-link.bst:subsubproject.bst:target.bst
diff --git a/tests/format/junctions/circular-references/target-overridden-subsubproject-circular.bst b/tests/format/junctions/circular-references/target-overridden-subsubproject-circular.bst
new file mode 100644
index 000000000..fd4b5a5f7
--- /dev/null
+++ b/tests/format/junctions/circular-references/target-overridden-subsubproject-circular.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject-overriden-with-circular-reference.bst:subsubproject.bst:target.bst
diff --git a/tests/format/junctions/conflicts/include-conflict-target.bst b/tests/format/junctions/conflicts/include-conflict-target.bst
new file mode 100644
index 000000000..237989cd7
--- /dev/null
+++ b/tests/format/junctions/conflicts/include-conflict-target.bst
@@ -0,0 +1,5 @@
+kind: stack
+
+depends:
+- include-conflict.bst
+- subproject.bst:target.bst
diff --git a/tests/format/junctions/conflicts/include-conflict.bst b/tests/format/junctions/conflicts/include-conflict.bst
new file mode 100644
index 000000000..9c1ecab25
--- /dev/null
+++ b/tests/format/junctions/conflicts/include-conflict.bst
@@ -0,0 +1,7 @@
+kind: manual
+
+variables:
+ (@): subproject2.bst:inc.yaml
+
+depends:
+- subproject2.bst:target.bst
diff --git a/tests/format/junctions/conflicts/nested-conflict-toplevel.bst b/tests/format/junctions/conflicts/nested-conflict-toplevel.bst
new file mode 100644
index 000000000..445ac0799
--- /dev/null
+++ b/tests/format/junctions/conflicts/nested-conflict-toplevel.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject.bst:subsubproject-conflict-target.bst
diff --git a/tests/format/junctions/conflicts/override-conflict.bst b/tests/format/junctions/conflicts/override-conflict.bst
new file mode 100644
index 000000000..3f0728d29
--- /dev/null
+++ b/tests/format/junctions/conflicts/override-conflict.bst
@@ -0,0 +1,8 @@
+kind: stack
+
+#
+# To trigger the conflict, we need to traverse the path of
+# the overridden `subsubproject.bst` junction.
+#
+depends:
+- subproject-override-conflicting-path.bst:subsubproject.bst:target.bst
diff --git a/tests/format/junctions/conflicts/plugin-conflict.bst b/tests/format/junctions/conflicts/plugin-conflict.bst
new file mode 100644
index 000000000..b9061d14b
--- /dev/null
+++ b/tests/format/junctions/conflicts/plugin-conflict.bst
@@ -0,0 +1,4 @@
+kind: found
+
+depends:
+- subproject.bst:target.bst
diff --git a/tests/format/junctions/conflicts/project.conf b/tests/format/junctions/conflicts/project.conf
new file mode 100644
index 000000000..20636c446
--- /dev/null
+++ b/tests/format/junctions/conflicts/project.conf
@@ -0,0 +1,2 @@
+name: test
+min-version: 2.0
diff --git a/tests/format/junctions/conflicts/simple-conflict.bst b/tests/format/junctions/conflicts/simple-conflict.bst
new file mode 100644
index 000000000..5aaf3a8ab
--- /dev/null
+++ b/tests/format/junctions/conflicts/simple-conflict.bst
@@ -0,0 +1,5 @@
+kind: stack
+
+depends:
+- subproject.bst:target.bst
+- subproject2.bst:target.bst
diff --git a/tests/format/junctions/conflicts/subproject-override-conflicting-path.bst b/tests/format/junctions/conflicts/subproject-override-conflicting-path.bst
new file mode 100644
index 000000000..3861d97df
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject-override-conflicting-path.bst
@@ -0,0 +1,13 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+#
+# Here we are declaring a junction to subproject, and trying to override
+# it's subproject with a deep subproject, using a different junction to
+# the same subproject `subproject.bst`
+#
+config:
+ overrides:
+ subsubproject.bst: subproject.bst:subsubproject.bst:subsubsubproject.bst
diff --git a/tests/format/junctions/conflicts/subproject.bst b/tests/format/junctions/conflicts/subproject.bst
new file mode 100644
index 000000000..c88189cb0
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
diff --git a/tests/format/junctions/conflicts/subproject/project.conf b/tests/format/junctions/conflicts/subproject/project.conf
new file mode 100644
index 000000000..39a53e2ab
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/project.conf
@@ -0,0 +1,2 @@
+name: subtest
+min-version: 2.0
diff --git a/tests/format/junctions/conflicts/subproject/sub.txt b/tests/format/junctions/conflicts/subproject/sub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/sub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject-conflict-target.bst b/tests/format/junctions/conflicts/subproject/subsubproject-conflict-target.bst
new file mode 100644
index 000000000..e9bf1c57e
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject-conflict-target.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subsubproject-conflict.bst:target.bst
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject-conflict.bst b/tests/format/junctions/conflicts/subproject/subsubproject-conflict.bst
new file mode 100644
index 000000000..e4715ea1d
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject-conflict.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubproject-conflict
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject-conflict/deepsurprise.txt b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/deepsurprise.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/deepsurprise.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject-conflict/project.conf b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/project.conf
new file mode 100644
index 000000000..20636c446
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/project.conf
@@ -0,0 +1,2 @@
+name: test
+min-version: 2.0
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject-conflict/target.bst b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/target.bst
new file mode 100644
index 000000000..981f29da3
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject-conflict/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: deepsurprise.txt
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject.bst b/tests/format/junctions/conflicts/subproject/subsubproject.bst
new file mode 100644
index 000000000..f535ab0e0
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubproject
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/project.conf b/tests/format/junctions/conflicts/subproject/subsubproject/project.conf
new file mode 100644
index 000000000..d11bcbb30
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/subsub.txt b/tests/format/junctions/conflicts/subproject/subsubproject/subsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/subsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject.bst b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject.bst
new file mode 100644
index 000000000..bce64597b
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubsubproject
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/project.conf b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/subsubsub.txt b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/subsubsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/subsubsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/target.bst b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/target.bst
new file mode 100644
index 000000000..351c9a22d
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/subsubsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsubsub.txt
diff --git a/tests/format/junctions/conflicts/subproject/subsubproject/target.bst b/tests/format/junctions/conflicts/subproject/subsubproject/target.bst
new file mode 100644
index 000000000..afafac601
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/subsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsub.txt
diff --git a/tests/format/junctions/conflicts/subproject/target.bst b/tests/format/junctions/conflicts/subproject/target.bst
new file mode 100644
index 000000000..e24d9bbb4
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: sub.txt
diff --git a/tests/format/junctions/conflicts/subproject2.bst b/tests/format/junctions/conflicts/subproject2.bst
new file mode 100644
index 000000000..2343652e1
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject2
diff --git a/tests/format/junctions/conflicts/subproject2/inc.yaml b/tests/format/junctions/conflicts/subproject2/inc.yaml
new file mode 100644
index 000000000..bbc78380f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2/inc.yaml
@@ -0,0 +1 @@
+test: Pony
diff --git a/tests/format/junctions/conflicts/subproject2/plugins/found.py b/tests/format/junctions/conflicts/subproject2/plugins/found.py
new file mode 100644
index 000000000..34a7e4398
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2/plugins/found.py
@@ -0,0 +1,19 @@
+from buildstream import Element
+
+
+class Found(Element):
+ BST_MIN_VERSION = "2.0"
+
+ def configure(self, node):
+ pass
+
+ def preflight(self):
+ pass
+
+ def get_unique_key(self):
+ return {}
+
+
+# Plugin entry point
+def setup():
+ return Found
diff --git a/tests/format/junctions/conflicts/subproject2/project.conf b/tests/format/junctions/conflicts/subproject2/project.conf
new file mode 100644
index 000000000..286045aa0
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2/project.conf
@@ -0,0 +1,8 @@
+name: subtest
+min-version: 2.0
+
+plugins:
+- origin: local
+ path: plugins
+ elements:
+ - found
diff --git a/tests/format/junctions/conflicts/subproject2/sub2.txt b/tests/format/junctions/conflicts/subproject2/sub2.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2/sub2.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/conflicts/subproject2/target.bst b/tests/format/junctions/conflicts/subproject2/target.bst
new file mode 100644
index 000000000..a1d15e942
--- /dev/null
+++ b/tests/format/junctions/conflicts/subproject2/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: sub2.txt
diff --git a/tests/format/junctions/invalid/subproject-self-override.bst b/tests/format/junctions/invalid/subproject-self-override.bst
new file mode 100644
index 000000000..22a8b3db8
--- /dev/null
+++ b/tests/format/junctions/invalid/subproject-self-override.bst
@@ -0,0 +1,16 @@
+kind: junction
+sources:
+- kind: local
+ path: base
+
+#
+# In this case, the "base" subproject does not really
+# have a subproject to override, but we're using this
+# setup to test the error of overriding a subproject
+# with the junction declaring the override, which will
+# happen sooner than noticing there is not a subproject.bst
+# to override.
+#
+config:
+ overrides:
+ subproject.bst: subproject-self-override.bst
diff --git a/tests/format/junctions/invalid/target-self-override.bst b/tests/format/junctions/invalid/target-self-override.bst
new file mode 100644
index 000000000..0f7b65676
--- /dev/null
+++ b/tests/format/junctions/invalid/target-self-override.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject-self-override.bst:target.bst
diff --git a/tests/format/junctions/override-twice/override.bst b/tests/format/junctions/override-twice/override.bst
new file mode 100644
index 000000000..c0564b631
--- /dev/null
+++ b/tests/format/junctions/override-twice/override.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: override
diff --git a/tests/format/junctions/override-twice/override/overridden-again.txt b/tests/format/junctions/override-twice/override/overridden-again.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/override-twice/override/overridden-again.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/override-twice/override/project.conf b/tests/format/junctions/override-twice/override/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/override-twice/override/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/override/target.bst b/tests/format/junctions/override-twice/override/target.bst
new file mode 100644
index 000000000..c05396c42
--- /dev/null
+++ b/tests/format/junctions/override-twice/override/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: overridden-again.txt
diff --git a/tests/format/junctions/override-twice/project.conf b/tests/format/junctions/override-twice/project.conf
new file mode 100644
index 000000000..20636c446
--- /dev/null
+++ b/tests/format/junctions/override-twice/project.conf
@@ -0,0 +1,2 @@
+name: test
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/subproject.bst b/tests/format/junctions/override-twice/subproject.bst
new file mode 100644
index 000000000..297dbe90d
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst:subsubsubproject.bst: override.bst
diff --git a/tests/format/junctions/override-twice/subproject/override.bst b/tests/format/junctions/override-twice/subproject/override.bst
new file mode 100644
index 000000000..c0564b631
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/override.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: override
diff --git a/tests/format/junctions/override-twice/subproject/override/overridden.txt b/tests/format/junctions/override-twice/subproject/override/overridden.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/override/overridden.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/override-twice/subproject/override/project.conf b/tests/format/junctions/override-twice/subproject/override/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/override/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/subproject/override/target.bst b/tests/format/junctions/override-twice/subproject/override/target.bst
new file mode 100644
index 000000000..8a725bab6
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/override/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: overridden.txt
diff --git a/tests/format/junctions/override-twice/subproject/project.conf b/tests/format/junctions/override-twice/subproject/project.conf
new file mode 100644
index 000000000..39a53e2ab
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/project.conf
@@ -0,0 +1,2 @@
+name: subtest
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject.bst b/tests/format/junctions/override-twice/subproject/subsubproject.bst
new file mode 100644
index 000000000..fd5101878
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubproject
+
+config:
+ overrides:
+ subsubsubproject.bst: override.bst
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject/project.conf b/tests/format/junctions/override-twice/subproject/subsubproject/project.conf
new file mode 100644
index 000000000..d11bcbb30
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject.bst b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject.bst
new file mode 100644
index 000000000..bce64597b
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubsubproject
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/original.txt b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/original.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/original.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/project.conf b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/target.bst b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/target.bst
new file mode 100644
index 000000000..61edc6467
--- /dev/null
+++ b/tests/format/junctions/override-twice/subproject/subsubproject/subsubsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: original.txt
diff --git a/tests/format/junctions/override-twice/target.bst b/tests/format/junctions/override-twice/target.bst
new file mode 100644
index 000000000..a748441bf
--- /dev/null
+++ b/tests/format/junctions/override-twice/target.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject.bst:subsubproject.bst:subsubsubproject.bst:target.bst
diff --git a/tests/format/junctions/overrides/overridden-subsubproject.bst b/tests/format/junctions/overrides/overridden-subsubproject.bst
new file mode 100644
index 000000000..bb089ab48
--- /dev/null
+++ b/tests/format/junctions/overrides/overridden-subsubproject.bst
@@ -0,0 +1,10 @@
+# This junction resides at the toplevel project
+#
+# It is used to override the subrpoject's junction to
+# the subsubproject, and instead point that to the
+# subsubsubproject.
+#
+kind: junction
+sources:
+- kind: local
+ path: subproject/subsubproject/subsubsubproject
diff --git a/tests/format/junctions/overrides/overridden-subsubsubproject.bst b/tests/format/junctions/overrides/overridden-subsubsubproject.bst
new file mode 100644
index 000000000..ba349d958
--- /dev/null
+++ b/tests/format/junctions/overrides/overridden-subsubsubproject.bst
@@ -0,0 +1,10 @@
+# This junction resides at the toplevel project
+#
+# It is used to override the subrpoject's subsubproject's
+# junction to the subsubsubproject, and instead point that to
+# the surpriseproject.
+#
+kind: junction
+sources:
+- kind: local
+ path: surpriseproject
diff --git a/tests/format/junctions/overrides/project.conf b/tests/format/junctions/overrides/project.conf
new file mode 100644
index 000000000..20636c446
--- /dev/null
+++ b/tests/format/junctions/overrides/project.conf
@@ -0,0 +1,2 @@
+name: test
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/subproject-overriden-with-deep-subproject.bst b/tests/format/junctions/overrides/subproject-overriden-with-deep-subproject.bst
new file mode 100644
index 000000000..f1878c07d
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject-overriden-with-deep-subproject.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst: surpriseproject.bst:deepsurpriseproject.bst
diff --git a/tests/format/junctions/overrides/subproject-with-deep-override.bst b/tests/format/junctions/overrides/subproject-with-deep-override.bst
new file mode 100644
index 000000000..1be1955a7
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject-with-deep-override.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst:subsubsubproject.bst: overridden-subsubsubproject.bst
diff --git a/tests/format/junctions/overrides/subproject-with-override.bst b/tests/format/junctions/overrides/subproject-with-override.bst
new file mode 100644
index 000000000..9c3398b2e
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject-with-override.bst
@@ -0,0 +1,8 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
+
+config:
+ overrides:
+ subsubproject.bst: overridden-subsubproject.bst
diff --git a/tests/format/junctions/overrides/subproject.bst b/tests/format/junctions/overrides/subproject.bst
new file mode 100644
index 000000000..c88189cb0
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subproject
diff --git a/tests/format/junctions/overrides/subproject/project.conf b/tests/format/junctions/overrides/subproject/project.conf
new file mode 100644
index 000000000..39a53e2ab
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/project.conf
@@ -0,0 +1,2 @@
+name: subtest
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/subproject/sub.txt b/tests/format/junctions/overrides/subproject/sub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/sub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/overrides/subproject/subsubproject.bst b/tests/format/junctions/overrides/subproject/subsubproject.bst
new file mode 100644
index 000000000..f535ab0e0
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubproject
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/project.conf b/tests/format/junctions/overrides/subproject/subsubproject/project.conf
new file mode 100644
index 000000000..d11bcbb30
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/subsub.txt b/tests/format/junctions/overrides/subproject/subsubproject/subsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/subsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject.bst b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject.bst
new file mode 100644
index 000000000..bce64597b
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: subsubsubproject
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/project.conf b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/project.conf
new file mode 100644
index 000000000..e508da808
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/project.conf
@@ -0,0 +1,2 @@
+name: subsubsubtest
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/subsubsub.txt b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/subsubsub.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/subsubsub.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/target.bst b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/target.bst
new file mode 100644
index 000000000..351c9a22d
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/subsubsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsubsub.txt
diff --git a/tests/format/junctions/overrides/subproject/subsubproject/target.bst b/tests/format/junctions/overrides/subproject/subsubproject/target.bst
new file mode 100644
index 000000000..afafac601
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/subsubproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: subsub.txt
diff --git a/tests/format/junctions/overrides/subproject/target.bst b/tests/format/junctions/overrides/subproject/target.bst
new file mode 100644
index 000000000..e24d9bbb4
--- /dev/null
+++ b/tests/format/junctions/overrides/subproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: sub.txt
diff --git a/tests/format/junctions/overrides/surpriseproject.bst b/tests/format/junctions/overrides/surpriseproject.bst
new file mode 100644
index 000000000..427c4ebdf
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: surpriseproject
diff --git a/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject.bst b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject.bst
new file mode 100644
index 000000000..62423a996
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: deepsurpriseproject
diff --git a/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/deepsurprise.txt b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/deepsurprise.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/deepsurprise.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/project.conf b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/project.conf
new file mode 100644
index 000000000..cf657b17e
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/project.conf
@@ -0,0 +1,2 @@
+name: deepsurprise
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/target.bst b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/target.bst
new file mode 100644
index 000000000..981f29da3
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/deepsurpriseproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: deepsurprise.txt
diff --git a/tests/format/junctions/overrides/surpriseproject/project.conf b/tests/format/junctions/overrides/surpriseproject/project.conf
new file mode 100644
index 000000000..0d812aed4
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/project.conf
@@ -0,0 +1,2 @@
+name: surprise
+min-version: 2.0
diff --git a/tests/format/junctions/overrides/surpriseproject/surprise.txt b/tests/format/junctions/overrides/surpriseproject/surprise.txt
new file mode 100644
index 000000000..f73f3093f
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/surprise.txt
@@ -0,0 +1 @@
+file
diff --git a/tests/format/junctions/overrides/surpriseproject/target.bst b/tests/format/junctions/overrides/surpriseproject/target.bst
new file mode 100644
index 000000000..bc496303e
--- /dev/null
+++ b/tests/format/junctions/overrides/surpriseproject/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: surprise.txt
diff --git a/tests/format/junctions/overrides/target-overridden-subsubproject.bst b/tests/format/junctions/overrides/target-overridden-subsubproject.bst
new file mode 100644
index 000000000..18610631a
--- /dev/null
+++ b/tests/format/junctions/overrides/target-overridden-subsubproject.bst
@@ -0,0 +1,12 @@
+kind: stack
+
+# Here we depend on the target in subproject's subsubproject,
+# however we've overridden the subproject's subsubproject with
+# our own.
+#
+# We should still be able to address that overridden subproject
+# and access the project we've overridden it with, which will
+# turn out to be the subsubsubproject.
+#
+depends:
+- subproject-with-override.bst:subsubproject.bst:target.bst
diff --git a/tests/format/junctions/overrides/target-overridden-subsubsubproject.bst b/tests/format/junctions/overrides/target-overridden-subsubsubproject.bst
new file mode 100644
index 000000000..5c5437b7a
--- /dev/null
+++ b/tests/format/junctions/overrides/target-overridden-subsubsubproject.bst
@@ -0,0 +1,8 @@
+kind: stack
+
+# Here we depend on the target in subproject's subsubproject's
+# subsubsubproject, however we've overridden the subproject's
+# subsubproject's subsubsubproject with our own surprise project
+#
+depends:
+- subproject-with-deep-override.bst:subsubproject.bst:subsubsubproject.bst:target.bst
diff --git a/tests/format/junctions/overrides/target-overridden-with-deepsubproject.bst b/tests/format/junctions/overrides/target-overridden-with-deepsubproject.bst
new file mode 100644
index 000000000..bf5240906
--- /dev/null
+++ b/tests/format/junctions/overrides/target-overridden-with-deepsubproject.bst
@@ -0,0 +1,4 @@
+kind: stack
+
+depends:
+- subproject-overriden-with-deep-subproject.bst:subsubproject.bst:target.bst