summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2017-11-27 08:39:49 +0100
committerJürg Billeter <j@bitron.ch>2018-02-08 16:38:48 +0100
commit319af30c4426375c843d5c0113904657b5e48bf1 (patch)
treef64e55d6537db94f2e2b93d51a7e3d31d21aad4a
parent399f09b74c0014066fbb32c3a7db84e5b4ef51e5 (diff)
downloadbuildstream-319af30c4426375c843d5c0113904657b5e48bf1.tar.gz
Add junction tests
-rw-r--r--tests/loader/junctions.py262
-rw-r--r--tests/loader/junctions/bar/app.bst7
-rw-r--r--tests/loader/junctions/bar/bar.txt1
-rw-r--r--tests/loader/junctions/bar/base.bst4
-rw-r--r--tests/loader/junctions/bar/project.conf1
-rw-r--r--tests/loader/junctions/bar/target.bst5
-rw-r--r--tests/loader/junctions/base/base.txt1
-rw-r--r--tests/loader/junctions/base/project.conf1
-rw-r--r--tests/loader/junctions/base/target.bst4
-rw-r--r--tests/loader/junctions/conflict/bar.bst4
-rw-r--r--tests/loader/junctions/conflict/foo.bst4
-rw-r--r--tests/loader/junctions/conflict/project.conf1
-rw-r--r--tests/loader/junctions/conflict/target.bst6
-rw-r--r--tests/loader/junctions/foo/app.bst7
-rw-r--r--tests/loader/junctions/foo/base.bst4
-rw-r--r--tests/loader/junctions/foo/foo.txt1
-rw-r--r--tests/loader/junctions/foo/project.conf1
-rw-r--r--tests/loader/junctions/foo/target.bst5
-rw-r--r--tests/loader/junctions/invalid/app.bst4
-rw-r--r--tests/loader/junctions/invalid/base-with-deps.bst6
-rw-r--r--tests/loader/junctions/invalid/base.bst4
-rw-r--r--tests/loader/junctions/invalid/foo.txt1
-rw-r--r--tests/loader/junctions/invalid/junction-dep.bst3
-rw-r--r--tests/loader/junctions/invalid/junction-with-deps.bst4
-rw-r--r--tests/loader/junctions/invalid/missing.bst4
-rw-r--r--tests/loader/junctions/invalid/project.conf1
-rw-r--r--tests/loader/junctions/nested/foo.bst4
-rw-r--r--tests/loader/junctions/nested/project.conf1
-rw-r--r--tests/loader/junctions/nested/target.bst4
-rw-r--r--tests/loader/junctions/options-base/horsy.txt1
-rw-r--r--tests/loader/junctions/options-base/pony.txt1
-rw-r--r--tests/loader/junctions/options-base/project.conf9
-rw-r--r--tests/loader/junctions/options-base/target.bst8
-rw-r--r--tests/loader/junctions/options-default/base.bst4
-rw-r--r--tests/loader/junctions/options-default/project.conf1
-rw-r--r--tests/loader/junctions/options-default/target.bst4
-rw-r--r--tests/loader/junctions/options-inherit/base.bst7
-rw-r--r--tests/loader/junctions/options-inherit/project.conf10
-rw-r--r--tests/loader/junctions/options-inherit/target.bst4
-rw-r--r--tests/loader/junctions/options/base.bst7
-rw-r--r--tests/loader/junctions/options/project.conf1
-rw-r--r--tests/loader/junctions/options/target.bst4
-rw-r--r--tests/loader/junctions/toplevel/bar.bst4
-rw-r--r--tests/loader/junctions/toplevel/base.bst4
-rw-r--r--tests/loader/junctions/toplevel/foo.bst4
-rw-r--r--tests/loader/junctions/toplevel/project.conf1
-rw-r--r--tests/loader/junctions/toplevel/target.bst6
47 files changed, 435 insertions, 0 deletions
diff --git a/tests/loader/junctions.py b/tests/loader/junctions.py
new file mode 100644
index 000000000..0634b8aa2
--- /dev/null
+++ b/tests/loader/junctions.py
@@ -0,0 +1,262 @@
+import os
+import pytest
+import shutil
+
+from buildstream import _yaml
+from buildstream._exceptions import LoadError, LoadErrorReason
+from tests.testutils import cli, create_repo
+from tests.testutils.site import HAVE_GIT
+
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ 'junctions',
+)
+
+
+def copy_subprojects(project, datafiles, subprojects):
+ for subproject in subprojects:
+ shutil.copytree(os.path.join(str(datafiles), subproject), os.path.join(str(project), subproject))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_simple_pipeline(cli, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(project, datafiles, ['base'])
+
+ # Check that the pipeline includes the subproject element
+ element_list = cli.get_pipeline(project, ['target.bst'])
+ assert 'base.bst:target.bst' in element_list
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_simple_build(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(project, datafiles, ['base'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ # Check that the checkout contains the expected files from both projects
+ assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'foo.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_nested_simple(cli, tmpdir, datafiles):
+ foo = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(foo, datafiles, ['base'])
+
+ project = os.path.join(str(datafiles), 'nested')
+ copy_subprojects(project, datafiles, ['foo'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ # Check that the checkout contains the expected files from all subprojects
+ assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'foo.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_nested_double(cli, tmpdir, datafiles):
+ foo = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(foo, datafiles, ['base'])
+
+ bar = os.path.join(str(datafiles), 'bar')
+ copy_subprojects(bar, datafiles, ['base'])
+
+ project = os.path.join(str(datafiles), 'toplevel')
+ copy_subprojects(project, datafiles, ['base', 'foo', 'bar'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ # Check that the checkout contains the expected files from all subprojects
+ assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'foo.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'bar.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_nested_conflict(cli, datafiles):
+ foo = os.path.join(str(datafiles), 'foo')
+ copy_subprojects(foo, datafiles, ['base'])
+
+ bar = os.path.join(str(datafiles), 'bar')
+ copy_subprojects(bar, datafiles, ['base'])
+
+ project = os.path.join(str(datafiles), 'conflict')
+ copy_subprojects(project, datafiles, ['foo', 'bar'])
+
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code != 0
+ assert result.exception
+ assert isinstance(result.exception, LoadError)
+ assert result.exception.reason == LoadErrorReason.CONFLICTING_JUNCTION
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_invalid_missing(cli, datafiles):
+ project = os.path.join(str(datafiles), 'invalid')
+
+ result = cli.run(project=project, args=['build', 'missing.bst'])
+ assert result.exit_code != 0
+ assert result.exception
+ assert isinstance(result.exception, LoadError)
+ assert result.exception.reason == LoadErrorReason.MISSING_FILE
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_invalid_with_deps(cli, datafiles):
+ project = os.path.join(str(datafiles), 'invalid')
+ copy_subprojects(project, datafiles, ['base'])
+
+ result = cli.run(project=project, args=['build', 'junction-with-deps.bst'])
+ assert result.exit_code != 0
+ assert result.exception
+ assert isinstance(result.exception, LoadError)
+ assert result.exception.reason == LoadErrorReason.INVALID_DATA
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_invalid_junction_dep(cli, datafiles):
+ project = os.path.join(str(datafiles), 'invalid')
+ copy_subprojects(project, datafiles, ['base'])
+
+ result = cli.run(project=project, args=['build', 'junction-dep.bst'])
+ assert result.exit_code != 0
+ assert result.exception
+ assert isinstance(result.exception, LoadError)
+ assert result.exception.reason == LoadErrorReason.INVALID_DATA
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_options_default(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'options-default')
+ copy_subprojects(project, datafiles, ['options-base'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ assert(os.path.exists(os.path.join(checkoutdir, 'pony.txt')))
+ assert(not os.path.exists(os.path.join(checkoutdir, 'horsy.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_options(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'options')
+ copy_subprojects(project, datafiles, ['options-base'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ assert(not os.path.exists(os.path.join(checkoutdir, 'pony.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'horsy.txt')))
+
+
+@pytest.mark.datafiles(DATA_DIR)
+def test_options_inherit(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'options-inherit')
+ copy_subprojects(project, datafiles, ['options-base'])
+
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Build, checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ assert(not os.path.exists(os.path.join(checkoutdir, 'pony.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'horsy.txt')))
+
+
+@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
+@pytest.mark.datafiles(DATA_DIR)
+def test_git_show(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Create the repo from 'base' subdir
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), 'base'))
+
+ # Write out junction element with git source
+ element = {
+ 'kind': 'junction',
+ 'sources': [
+ repo.source_config(ref=ref)
+ ]
+ }
+ _yaml.dump(element, os.path.join(project, 'base.bst'))
+
+ # Verify that bst show does not implicitly fetch subproject
+ result = cli.run(project=project, args=['show', 'target.bst'])
+ assert result.exit_code != 0
+ assert result.exception
+ assert isinstance(result.exception, LoadError)
+ assert result.exception.reason == LoadErrorReason.MISSING_FILE
+
+ # Explicitly fetch subproject
+ result = cli.run(project=project, args=['fetch', 'base.bst'])
+ assert result.exit_code == 0
+
+ # Check that bst show succeeds now and the pipeline includes the subproject element
+ element_list = cli.get_pipeline(project, ['target.bst'])
+ assert 'base.bst:target.bst' in element_list
+
+
+@pytest.mark.skipif(HAVE_GIT is False, reason="git is not available")
+@pytest.mark.datafiles(DATA_DIR)
+def test_git_build(cli, tmpdir, datafiles):
+ project = os.path.join(str(datafiles), 'foo')
+ checkoutdir = os.path.join(str(tmpdir), "checkout")
+
+ # Create the repo from 'base' subdir
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), 'base'))
+
+ # Write out junction element with git source
+ element = {
+ 'kind': 'junction',
+ 'sources': [
+ repo.source_config(ref=ref)
+ ]
+ }
+ _yaml.dump(element, os.path.join(project, 'base.bst'))
+
+ # Build (with implicit fetch of subproject), checkout
+ result = cli.run(project=project, args=['build', 'target.bst'])
+ assert result.exit_code == 0
+ result = cli.run(project=project, args=['checkout', 'target.bst', checkoutdir])
+ assert result.exit_code == 0
+
+ # Check that the checkout contains the expected files from both projects
+ assert(os.path.exists(os.path.join(checkoutdir, 'base.txt')))
+ assert(os.path.exists(os.path.join(checkoutdir, 'foo.txt')))
diff --git a/tests/loader/junctions/bar/app.bst b/tests/loader/junctions/bar/app.bst
new file mode 100644
index 000000000..a1a7a0ed9
--- /dev/null
+++ b/tests/loader/junctions/bar/app.bst
@@ -0,0 +1,7 @@
+kind: import
+sources:
+- kind: local
+ path: bar.txt
+depends:
+- junction: base.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/bar/bar.txt b/tests/loader/junctions/bar/bar.txt
new file mode 100644
index 000000000..5716ca598
--- /dev/null
+++ b/tests/loader/junctions/bar/bar.txt
@@ -0,0 +1 @@
+bar
diff --git a/tests/loader/junctions/bar/base.bst b/tests/loader/junctions/bar/base.bst
new file mode 100644
index 000000000..10ce559a9
--- /dev/null
+++ b/tests/loader/junctions/bar/base.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: base
diff --git a/tests/loader/junctions/bar/project.conf b/tests/loader/junctions/bar/project.conf
new file mode 100644
index 000000000..f8ed6621d
--- /dev/null
+++ b/tests/loader/junctions/bar/project.conf
@@ -0,0 +1 @@
+name: bar
diff --git a/tests/loader/junctions/bar/target.bst b/tests/loader/junctions/bar/target.bst
new file mode 100644
index 000000000..70b78a3fc
--- /dev/null
+++ b/tests/loader/junctions/bar/target.bst
@@ -0,0 +1,5 @@
+kind: stack
+depends:
+- junction: base.bst
+ filename: target.bst
+- app.bst
diff --git a/tests/loader/junctions/base/base.txt b/tests/loader/junctions/base/base.txt
new file mode 100644
index 000000000..a496efee8
--- /dev/null
+++ b/tests/loader/junctions/base/base.txt
@@ -0,0 +1 @@
+This is a text file
diff --git a/tests/loader/junctions/base/project.conf b/tests/loader/junctions/base/project.conf
new file mode 100644
index 000000000..951ea1a34
--- /dev/null
+++ b/tests/loader/junctions/base/project.conf
@@ -0,0 +1 @@
+name: base
diff --git a/tests/loader/junctions/base/target.bst b/tests/loader/junctions/base/target.bst
new file mode 100644
index 000000000..2b61c518b
--- /dev/null
+++ b/tests/loader/junctions/base/target.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: base.txt
diff --git a/tests/loader/junctions/conflict/bar.bst b/tests/loader/junctions/conflict/bar.bst
new file mode 100644
index 000000000..62eee825a
--- /dev/null
+++ b/tests/loader/junctions/conflict/bar.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: bar
diff --git a/tests/loader/junctions/conflict/foo.bst b/tests/loader/junctions/conflict/foo.bst
new file mode 100644
index 000000000..1feb4010b
--- /dev/null
+++ b/tests/loader/junctions/conflict/foo.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: foo
diff --git a/tests/loader/junctions/conflict/project.conf b/tests/loader/junctions/conflict/project.conf
new file mode 100644
index 000000000..395bb8423
--- /dev/null
+++ b/tests/loader/junctions/conflict/project.conf
@@ -0,0 +1 @@
+name: conflict
diff --git a/tests/loader/junctions/conflict/target.bst b/tests/loader/junctions/conflict/target.bst
new file mode 100644
index 000000000..5e280e542
--- /dev/null
+++ b/tests/loader/junctions/conflict/target.bst
@@ -0,0 +1,6 @@
+kind: stack
+depends:
+- junction: foo.bst
+ filename: target.bst
+- junction: bar.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/foo/app.bst b/tests/loader/junctions/foo/app.bst
new file mode 100644
index 000000000..e658628b0
--- /dev/null
+++ b/tests/loader/junctions/foo/app.bst
@@ -0,0 +1,7 @@
+kind: import
+sources:
+- kind: local
+ path: foo.txt
+depends:
+- junction: base.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/foo/base.bst b/tests/loader/junctions/foo/base.bst
new file mode 100644
index 000000000..10ce559a9
--- /dev/null
+++ b/tests/loader/junctions/foo/base.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: base
diff --git a/tests/loader/junctions/foo/foo.txt b/tests/loader/junctions/foo/foo.txt
new file mode 100644
index 000000000..257cc5642
--- /dev/null
+++ b/tests/loader/junctions/foo/foo.txt
@@ -0,0 +1 @@
+foo
diff --git a/tests/loader/junctions/foo/project.conf b/tests/loader/junctions/foo/project.conf
new file mode 100644
index 000000000..5a240e3ed
--- /dev/null
+++ b/tests/loader/junctions/foo/project.conf
@@ -0,0 +1 @@
+name: foo
diff --git a/tests/loader/junctions/foo/target.bst b/tests/loader/junctions/foo/target.bst
new file mode 100644
index 000000000..70b78a3fc
--- /dev/null
+++ b/tests/loader/junctions/foo/target.bst
@@ -0,0 +1,5 @@
+kind: stack
+depends:
+- junction: base.bst
+ filename: target.bst
+- app.bst
diff --git a/tests/loader/junctions/invalid/app.bst b/tests/loader/junctions/invalid/app.bst
new file mode 100644
index 000000000..9906149a6
--- /dev/null
+++ b/tests/loader/junctions/invalid/app.bst
@@ -0,0 +1,4 @@
+kind: import
+sources:
+- kind: local
+ path: foo.txt
diff --git a/tests/loader/junctions/invalid/base-with-deps.bst b/tests/loader/junctions/invalid/base-with-deps.bst
new file mode 100644
index 000000000..a30eb3a52
--- /dev/null
+++ b/tests/loader/junctions/invalid/base-with-deps.bst
@@ -0,0 +1,6 @@
+kind: junction
+sources:
+- kind: local
+ path: base
+depends:
+- app.bst
diff --git a/tests/loader/junctions/invalid/base.bst b/tests/loader/junctions/invalid/base.bst
new file mode 100644
index 000000000..10ce559a9
--- /dev/null
+++ b/tests/loader/junctions/invalid/base.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: base
diff --git a/tests/loader/junctions/invalid/foo.txt b/tests/loader/junctions/invalid/foo.txt
new file mode 100644
index 000000000..257cc5642
--- /dev/null
+++ b/tests/loader/junctions/invalid/foo.txt
@@ -0,0 +1 @@
+foo
diff --git a/tests/loader/junctions/invalid/junction-dep.bst b/tests/loader/junctions/invalid/junction-dep.bst
new file mode 100644
index 000000000..20fd30011
--- /dev/null
+++ b/tests/loader/junctions/invalid/junction-dep.bst
@@ -0,0 +1,3 @@
+kind: stack
+depends:
+- base.bst
diff --git a/tests/loader/junctions/invalid/junction-with-deps.bst b/tests/loader/junctions/invalid/junction-with-deps.bst
new file mode 100644
index 000000000..d2ca337dd
--- /dev/null
+++ b/tests/loader/junctions/invalid/junction-with-deps.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: base-with-deps.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/invalid/missing.bst b/tests/loader/junctions/invalid/missing.bst
new file mode 100644
index 000000000..672e967fe
--- /dev/null
+++ b/tests/loader/junctions/invalid/missing.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: missingfile.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/invalid/project.conf b/tests/loader/junctions/invalid/project.conf
new file mode 100644
index 000000000..38070bf71
--- /dev/null
+++ b/tests/loader/junctions/invalid/project.conf
@@ -0,0 +1 @@
+name: invalid
diff --git a/tests/loader/junctions/nested/foo.bst b/tests/loader/junctions/nested/foo.bst
new file mode 100644
index 000000000..1feb4010b
--- /dev/null
+++ b/tests/loader/junctions/nested/foo.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: foo
diff --git a/tests/loader/junctions/nested/project.conf b/tests/loader/junctions/nested/project.conf
new file mode 100644
index 000000000..551f51c6a
--- /dev/null
+++ b/tests/loader/junctions/nested/project.conf
@@ -0,0 +1 @@
+name: nested
diff --git a/tests/loader/junctions/nested/target.bst b/tests/loader/junctions/nested/target.bst
new file mode 100644
index 000000000..db59499a7
--- /dev/null
+++ b/tests/loader/junctions/nested/target.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: foo.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/options-base/horsy.txt b/tests/loader/junctions/options-base/horsy.txt
new file mode 100644
index 000000000..063dad656
--- /dev/null
+++ b/tests/loader/junctions/options-base/horsy.txt
@@ -0,0 +1 @@
+horsy
diff --git a/tests/loader/junctions/options-base/pony.txt b/tests/loader/junctions/options-base/pony.txt
new file mode 100644
index 000000000..f62144808
--- /dev/null
+++ b/tests/loader/junctions/options-base/pony.txt
@@ -0,0 +1 @@
+pony
diff --git a/tests/loader/junctions/options-base/project.conf b/tests/loader/junctions/options-base/project.conf
new file mode 100644
index 000000000..a98ebd5ed
--- /dev/null
+++ b/tests/loader/junctions/options-base/project.conf
@@ -0,0 +1,9 @@
+name: options-base
+options:
+ animal:
+ type: enum
+ description: The kind of animal
+ values:
+ - pony
+ - horsy
+ default: pony
diff --git a/tests/loader/junctions/options-base/target.bst b/tests/loader/junctions/options-base/target.bst
new file mode 100644
index 000000000..cda17af98
--- /dev/null
+++ b/tests/loader/junctions/options-base/target.bst
@@ -0,0 +1,8 @@
+kind: import
+sources:
+- kind: local
+ (?):
+ - animal == "pony":
+ path: pony.txt
+ - animal == "horsy":
+ path: horsy.txt
diff --git a/tests/loader/junctions/options-default/base.bst b/tests/loader/junctions/options-default/base.bst
new file mode 100644
index 000000000..5d42e5c31
--- /dev/null
+++ b/tests/loader/junctions/options-default/base.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: options-base
diff --git a/tests/loader/junctions/options-default/project.conf b/tests/loader/junctions/options-default/project.conf
new file mode 100644
index 000000000..b9e58a582
--- /dev/null
+++ b/tests/loader/junctions/options-default/project.conf
@@ -0,0 +1 @@
+name: options-default
diff --git a/tests/loader/junctions/options-default/target.bst b/tests/loader/junctions/options-default/target.bst
new file mode 100644
index 000000000..8395c0c77
--- /dev/null
+++ b/tests/loader/junctions/options-default/target.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: base.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/options-inherit/base.bst b/tests/loader/junctions/options-inherit/base.bst
new file mode 100644
index 000000000..8623d0d01
--- /dev/null
+++ b/tests/loader/junctions/options-inherit/base.bst
@@ -0,0 +1,7 @@
+kind: junction
+sources:
+- kind: local
+ path: options-base
+config:
+ options:
+ animal: '%{animal}'
diff --git a/tests/loader/junctions/options-inherit/project.conf b/tests/loader/junctions/options-inherit/project.conf
new file mode 100644
index 000000000..1e0ea4464
--- /dev/null
+++ b/tests/loader/junctions/options-inherit/project.conf
@@ -0,0 +1,10 @@
+name: options-inherit
+options:
+ animal:
+ type: enum
+ description: The kind of animal
+ values:
+ - pony
+ - horsy
+ default: horsy
+ variable: animal
diff --git a/tests/loader/junctions/options-inherit/target.bst b/tests/loader/junctions/options-inherit/target.bst
new file mode 100644
index 000000000..8395c0c77
--- /dev/null
+++ b/tests/loader/junctions/options-inherit/target.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: base.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/options/base.bst b/tests/loader/junctions/options/base.bst
new file mode 100644
index 000000000..a100e5e1e
--- /dev/null
+++ b/tests/loader/junctions/options/base.bst
@@ -0,0 +1,7 @@
+kind: junction
+sources:
+- kind: local
+ path: options-base
+config:
+ options:
+ animal: horsy
diff --git a/tests/loader/junctions/options/project.conf b/tests/loader/junctions/options/project.conf
new file mode 100644
index 000000000..de53ae176
--- /dev/null
+++ b/tests/loader/junctions/options/project.conf
@@ -0,0 +1 @@
+name: options
diff --git a/tests/loader/junctions/options/target.bst b/tests/loader/junctions/options/target.bst
new file mode 100644
index 000000000..8395c0c77
--- /dev/null
+++ b/tests/loader/junctions/options/target.bst
@@ -0,0 +1,4 @@
+kind: stack
+depends:
+- junction: base.bst
+ filename: target.bst
diff --git a/tests/loader/junctions/toplevel/bar.bst b/tests/loader/junctions/toplevel/bar.bst
new file mode 100644
index 000000000..62eee825a
--- /dev/null
+++ b/tests/loader/junctions/toplevel/bar.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: bar
diff --git a/tests/loader/junctions/toplevel/base.bst b/tests/loader/junctions/toplevel/base.bst
new file mode 100644
index 000000000..10ce559a9
--- /dev/null
+++ b/tests/loader/junctions/toplevel/base.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: base
diff --git a/tests/loader/junctions/toplevel/foo.bst b/tests/loader/junctions/toplevel/foo.bst
new file mode 100644
index 000000000..1feb4010b
--- /dev/null
+++ b/tests/loader/junctions/toplevel/foo.bst
@@ -0,0 +1,4 @@
+kind: junction
+sources:
+- kind: local
+ path: foo
diff --git a/tests/loader/junctions/toplevel/project.conf b/tests/loader/junctions/toplevel/project.conf
new file mode 100644
index 000000000..496c82128
--- /dev/null
+++ b/tests/loader/junctions/toplevel/project.conf
@@ -0,0 +1 @@
+name: toplevel
diff --git a/tests/loader/junctions/toplevel/target.bst b/tests/loader/junctions/toplevel/target.bst
new file mode 100644
index 000000000..5e280e542
--- /dev/null
+++ b/tests/loader/junctions/toplevel/target.bst
@@ -0,0 +1,6 @@
+kind: stack
+depends:
+- junction: foo.bst
+ filename: target.bst
+- junction: bar.bst
+ filename: target.bst