summaryrefslogtreecommitdiff
path: root/tests/elements
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-01-11 17:37:20 -0500
committerTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-01-16 18:35:21 -0500
commit42150422f0c04a3ea5d418713b87fdc2db960567 (patch)
treef3c75f513535057cd7462b8d849a336fb4b88368 /tests/elements
parentc7f69bcc2d772157cde3a932c0e93f09a329019f (diff)
downloadbuildstream-42150422f0c04a3ea5d418713b87fdc2db960567.tar.gz
tests: Rename `plugins` directory to `elements` directory
Now that the remaining test "filter.py" in the plugins directory tests a specific element, it makes sense to create a place for testing elements, just like we do for sources.
Diffstat (limited to 'tests/elements')
-rw-r--r--tests/elements/__init__.py0
-rw-r--r--tests/elements/filter.py463
-rw-r--r--tests/elements/filter/basic/element_plugins/dynamic.py35
-rw-r--r--tests/elements/filter/basic/elements/deps-permitted.bst11
-rw-r--r--tests/elements/filter/basic/elements/forbidden-also-rdep.bst8
-rw-r--r--tests/elements/filter/basic/elements/forbidden-multi-bdep.bst8
-rw-r--r--tests/elements/filter/basic/elements/forbidden-no-bdep.bst8
-rw-r--r--tests/elements/filter/basic/elements/forbidden-source.bst10
-rw-r--r--tests/elements/filter/basic/elements/input-dynamic.bst10
-rw-r--r--tests/elements/filter/basic/elements/input.bst11
-rw-r--r--tests/elements/filter/basic/elements/output-dynamic-include.bst7
-rw-r--r--tests/elements/filter/basic/elements/output-exclude.bst7
-rw-r--r--tests/elements/filter/basic/elements/output-include.bst7
-rw-r--r--tests/elements/filter/basic/elements/output-orphans.bst9
-rw-r--r--tests/elements/filter/basic/files/bar0
-rw-r--r--tests/elements/filter/basic/files/baz0
-rw-r--r--tests/elements/filter/basic/files/foo0
-rw-r--r--tests/elements/filter/basic/project.conf7
18 files changed, 601 insertions, 0 deletions
diff --git a/tests/elements/__init__.py b/tests/elements/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/elements/__init__.py
diff --git a/tests/elements/filter.py b/tests/elements/filter.py
new file mode 100644
index 000000000..31b23c124
--- /dev/null
+++ b/tests/elements/filter.py
@@ -0,0 +1,463 @@
+import os
+import pytest
+import shutil
+from tests.testutils import cli, create_repo, ALL_REPO_KINDS
+from buildstream._exceptions import ErrorDomain
+from buildstream import _yaml
+
+DATA_DIR = os.path.join(
+ os.path.dirname(os.path.realpath(__file__)),
+ 'filter',
+)
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_include(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'output-include.bst'])
+ result.assert_success()
+
+ checkout = os.path.join(tmpdir.dirname, tmpdir.basename, 'checkout')
+ result = cli.run(project=project, args=['checkout', 'output-include.bst', checkout])
+ result.assert_success()
+ assert os.path.exists(os.path.join(checkout, "foo"))
+ assert not os.path.exists(os.path.join(checkout, "bar"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_include_dynamic(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'output-dynamic-include.bst'])
+ result.assert_success()
+
+ checkout = os.path.join(tmpdir.dirname, tmpdir.basename, 'checkout')
+ result = cli.run(project=project, args=['checkout', 'output-dynamic-include.bst', checkout])
+ result.assert_success()
+ assert os.path.exists(os.path.join(checkout, "foo"))
+ assert not os.path.exists(os.path.join(checkout, "bar"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_exclude(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'output-exclude.bst'])
+ result.assert_success()
+
+ checkout = os.path.join(tmpdir.dirname, tmpdir.basename, 'checkout')
+ result = cli.run(project=project, args=['checkout', 'output-exclude.bst', checkout])
+ result.assert_success()
+ assert not os.path.exists(os.path.join(checkout, "foo"))
+ assert os.path.exists(os.path.join(checkout, "bar"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_orphans(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'output-orphans.bst'])
+ result.assert_success()
+
+ checkout = os.path.join(tmpdir.dirname, tmpdir.basename, 'checkout')
+ result = cli.run(project=project, args=['checkout', 'output-orphans.bst', checkout])
+ result.assert_success()
+ assert os.path.exists(os.path.join(checkout, "baz"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_deps_ok(datafiles, cli):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'deps-permitted.bst'])
+ result.assert_success()
+
+ result = cli.run(project=project,
+ args=['show', '--deps=run', "--format='%{name}'", 'deps-permitted.bst'])
+ result.assert_success()
+
+ assert 'output-exclude.bst' in result.output
+ assert 'output-orphans.bst' in result.output
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_forbid_sources(datafiles, cli):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'forbidden-source.bst'])
+ result.assert_main_error(ErrorDomain.ELEMENT, 'element-forbidden-sources')
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_forbid_multi_bdep(datafiles, cli):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'forbidden-multi-bdep.bst'])
+ result.assert_main_error(ErrorDomain.ELEMENT, 'filter-bdepend-wrong-count')
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_forbid_no_bdep(datafiles, cli):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'forbidden-no-bdep.bst'])
+ result.assert_main_error(ErrorDomain.ELEMENT, 'filter-bdepend-wrong-count')
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_forbid_also_rdep(datafiles, cli):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(project=project, args=['build', 'forbidden-also-rdep.bst'])
+ result.assert_main_error(ErrorDomain.ELEMENT, 'filter-bdepend-also-rdepend')
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_workspace_open(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ workspace_dir = os.path.join(tmpdir.dirname, tmpdir.basename, "workspace")
+ result = cli.run(project=project, args=['workspace', 'open', '--directory', workspace_dir, 'deps-permitted.bst'])
+ result.assert_success()
+ assert os.path.exists(os.path.join(workspace_dir, "foo"))
+ assert os.path.exists(os.path.join(workspace_dir, "bar"))
+ assert os.path.exists(os.path.join(workspace_dir, "baz"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_workspace_open_multi(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ result = cli.run(cwd=project, project=project, args=['workspace', 'open', 'deps-permitted.bst',
+ 'output-orphans.bst'])
+ result.assert_success()
+ assert os.path.exists(os.path.join(project, "input"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_workspace_build(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ tempdir = os.path.join(tmpdir.dirname, tmpdir.basename)
+ workspace_dir = os.path.join(tempdir, "workspace")
+ result = cli.run(project=project, args=['workspace', 'open', '--directory', workspace_dir, 'output-orphans.bst'])
+ result.assert_success()
+ src = os.path.join(workspace_dir, "foo")
+ dst = os.path.join(workspace_dir, "quux")
+ shutil.copyfile(src, dst)
+ result = cli.run(project=project, args=['build', 'output-orphans.bst'])
+ result.assert_success()
+ checkout_dir = os.path.join(tempdir, "checkout")
+ result = cli.run(project=project, args=['checkout', 'output-orphans.bst', checkout_dir])
+ result.assert_success()
+ assert os.path.exists(os.path.join(checkout_dir, "quux"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_workspace_close(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ tempdir = os.path.join(tmpdir.dirname, tmpdir.basename)
+ workspace_dir = os.path.join(tempdir, "workspace")
+ result = cli.run(project=project, args=['workspace', 'open', '--directory', workspace_dir, 'output-orphans.bst'])
+ result.assert_success()
+ src = os.path.join(workspace_dir, "foo")
+ dst = os.path.join(workspace_dir, "quux")
+ shutil.copyfile(src, dst)
+ result = cli.run(project=project, args=['workspace', 'close', 'deps-permitted.bst'])
+ result.assert_success()
+ result = cli.run(project=project, args=['build', 'output-orphans.bst'])
+ result.assert_success()
+ checkout_dir = os.path.join(tempdir, "checkout")
+ result = cli.run(project=project, args=['checkout', 'output-orphans.bst', checkout_dir])
+ result.assert_success()
+ assert not os.path.exists(os.path.join(checkout_dir, "quux"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_workspace_reset(datafiles, cli, tmpdir):
+ project = os.path.join(datafiles.dirname, datafiles.basename)
+ tempdir = os.path.join(tmpdir.dirname, tmpdir.basename)
+ workspace_dir = os.path.join(tempdir, "workspace")
+ result = cli.run(project=project, args=['workspace', 'open', '--directory', workspace_dir, 'output-orphans.bst'])
+ result.assert_success()
+ src = os.path.join(workspace_dir, "foo")
+ dst = os.path.join(workspace_dir, "quux")
+ shutil.copyfile(src, dst)
+ result = cli.run(project=project, args=['workspace', 'reset', 'deps-permitted.bst'])
+ result.assert_success()
+ result = cli.run(project=project, args=['build', 'output-orphans.bst'])
+ result.assert_success()
+ checkout_dir = os.path.join(tempdir, "checkout")
+ result = cli.run(project=project, args=['checkout', 'output-orphans.bst', checkout_dir])
+ result.assert_success()
+ assert not os.path.exists(os.path.join(checkout_dir, "quux"))
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_track(datafiles, cli, tmpdir):
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), "files"))
+ elements_dir = os.path.join(str(tmpdir), "elements")
+ project = str(tmpdir)
+ input_name = "input.bst"
+
+ project_config = {
+ "name": "filter-track-test",
+ "element-path": "elements",
+ }
+ project_file = os.path.join(str(tmpdir), "project.conf")
+ _yaml.dump(project_config, project_file)
+
+ input_config = {
+ "kind": "import",
+ "sources": [repo.source_config()],
+ }
+
+ input_file = os.path.join(elements_dir, input_name)
+ _yaml.dump(input_config, input_file)
+
+ filter1_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter1_file = os.path.join(elements_dir, "filter1.bst")
+ _yaml.dump(filter1_config, filter1_file)
+
+ filter2_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": "filter1.bst", "type": "build"}
+ ]
+ }
+ filter2_file = os.path.join(elements_dir, "filter2.bst")
+ _yaml.dump(filter2_config, filter2_file)
+
+ # Assert that a fetch is needed
+ assert cli.get_element_state(project, input_name) == 'no reference'
+
+ # Now try to track it
+ result = cli.run(project=project, args=["source", "track", "filter2.bst"])
+ result.assert_success()
+
+ # Now check that a ref field exists
+ new_input = _yaml.load(input_file)
+ assert new_input["sources"][0]["ref"] == ref
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_track_excepted(datafiles, cli, tmpdir):
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), "files"))
+ elements_dir = os.path.join(str(tmpdir), "elements")
+ project = str(tmpdir)
+ input_name = "input.bst"
+
+ project_config = {
+ "name": "filter-track-test",
+ "element-path": "elements",
+ }
+ project_file = os.path.join(str(tmpdir), "project.conf")
+ _yaml.dump(project_config, project_file)
+
+ input_config = {
+ "kind": "import",
+ "sources": [repo.source_config()],
+ }
+
+ input_file = os.path.join(elements_dir, input_name)
+ _yaml.dump(input_config, input_file)
+
+ filter1_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter1_file = os.path.join(elements_dir, "filter1.bst")
+ _yaml.dump(filter1_config, filter1_file)
+
+ filter2_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": "filter1.bst", "type": "build"}
+ ]
+ }
+ filter2_file = os.path.join(elements_dir, "filter2.bst")
+ _yaml.dump(filter2_config, filter2_file)
+
+ # Assert that a fetch is needed
+ assert cli.get_element_state(project, input_name) == 'no reference'
+
+ # Now try to track it
+ result = cli.run(project=project, args=["source", "track", "filter2.bst", "--except", "input.bst"])
+ result.assert_success()
+
+ # Now check that a ref field exists
+ new_input = _yaml.load(input_file)
+ assert "ref" not in new_input["sources"][0]
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_track_multi_to_one(datafiles, cli, tmpdir):
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), "files"))
+ elements_dir = os.path.join(str(tmpdir), "elements")
+ project = str(tmpdir)
+ input_name = "input.bst"
+
+ project_config = {
+ "name": "filter-track-test",
+ "element-path": "elements",
+ }
+ project_file = os.path.join(str(tmpdir), "project.conf")
+ _yaml.dump(project_config, project_file)
+
+ input_config = {
+ "kind": "import",
+ "sources": [repo.source_config()],
+ }
+
+ input_file = os.path.join(elements_dir, input_name)
+ _yaml.dump(input_config, input_file)
+
+ filter1_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter1_file = os.path.join(elements_dir, "filter1.bst")
+ _yaml.dump(filter1_config, filter1_file)
+
+ filter2_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter2_file = os.path.join(elements_dir, "filter2.bst")
+ _yaml.dump(filter2_config, filter2_file)
+
+ # Assert that a fetch is needed
+ assert cli.get_element_state(project, input_name) == 'no reference'
+
+ # Now try to track it
+ result = cli.run(project=project, args=["source", "track", "filter1.bst", "filter2.bst"])
+ result.assert_success()
+
+ # Now check that a ref field exists
+ new_input = _yaml.load(input_file)
+ assert new_input["sources"][0]["ref"] == ref
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_track_multi(datafiles, cli, tmpdir):
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), "files"))
+ elements_dir = os.path.join(str(tmpdir), "elements")
+ project = str(tmpdir)
+ input_name = "input.bst"
+ input2_name = "input2.bst"
+
+ project_config = {
+ "name": "filter-track-test",
+ "element-path": "elements",
+ }
+ project_file = os.path.join(str(tmpdir), "project.conf")
+ _yaml.dump(project_config, project_file)
+
+ input_config = {
+ "kind": "import",
+ "sources": [repo.source_config()],
+ }
+
+ input_file = os.path.join(elements_dir, input_name)
+ _yaml.dump(input_config, input_file)
+
+ input2_config = dict(input_config)
+ input2_file = os.path.join(elements_dir, input2_name)
+ _yaml.dump(input2_config, input2_file)
+
+ filter1_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter1_file = os.path.join(elements_dir, "filter1.bst")
+ _yaml.dump(filter1_config, filter1_file)
+
+ filter2_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input2_name, "type": "build"}
+ ]
+ }
+ filter2_file = os.path.join(elements_dir, "filter2.bst")
+ _yaml.dump(filter2_config, filter2_file)
+
+ # Assert that a fetch is needed
+ assert cli.get_element_state(project, input_name) == 'no reference'
+ assert cli.get_element_state(project, input2_name) == 'no reference'
+
+ # Now try to track it
+ result = cli.run(project=project, args=["source", "track", "filter1.bst", "filter2.bst"])
+ result.assert_success()
+
+ # Now check that a ref field exists
+ new_input = _yaml.load(input_file)
+ assert new_input["sources"][0]["ref"] == ref
+ new_input2 = _yaml.load(input2_file)
+ assert new_input2["sources"][0]["ref"] == ref
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'basic'))
+def test_filter_track_multi_exclude(datafiles, cli, tmpdir):
+ repo = create_repo('git', str(tmpdir))
+ ref = repo.create(os.path.join(str(datafiles), "files"))
+ elements_dir = os.path.join(str(tmpdir), "elements")
+ project = str(tmpdir)
+ input_name = "input.bst"
+ input2_name = "input2.bst"
+
+ project_config = {
+ "name": "filter-track-test",
+ "element-path": "elements",
+ }
+ project_file = os.path.join(str(tmpdir), "project.conf")
+ _yaml.dump(project_config, project_file)
+
+ input_config = {
+ "kind": "import",
+ "sources": [repo.source_config()],
+ }
+
+ input_file = os.path.join(elements_dir, input_name)
+ _yaml.dump(input_config, input_file)
+
+ input2_config = dict(input_config)
+ input2_file = os.path.join(elements_dir, input2_name)
+ _yaml.dump(input2_config, input2_file)
+
+ filter1_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input_name, "type": "build"}
+ ]
+ }
+ filter1_file = os.path.join(elements_dir, "filter1.bst")
+ _yaml.dump(filter1_config, filter1_file)
+
+ filter2_config = {
+ "kind": "filter",
+ "depends": [
+ {"filename": input2_name, "type": "build"}
+ ]
+ }
+ filter2_file = os.path.join(elements_dir, "filter2.bst")
+ _yaml.dump(filter2_config, filter2_file)
+
+ # Assert that a fetch is needed
+ assert cli.get_element_state(project, input_name) == 'no reference'
+ assert cli.get_element_state(project, input2_name) == 'no reference'
+
+ # Now try to track it
+ result = cli.run(project=project, args=["source", "track", "filter1.bst", "filter2.bst", "--except", input_name])
+ result.assert_success()
+
+ # Now check that a ref field exists
+ new_input = _yaml.load(input_file)
+ assert "ref" not in new_input["sources"][0]
+ new_input2 = _yaml.load(input2_file)
+ assert new_input2["sources"][0]["ref"] == ref
diff --git a/tests/elements/filter/basic/element_plugins/dynamic.py b/tests/elements/filter/basic/element_plugins/dynamic.py
new file mode 100644
index 000000000..1208a4a4d
--- /dev/null
+++ b/tests/elements/filter/basic/element_plugins/dynamic.py
@@ -0,0 +1,35 @@
+from buildstream import Element, Scope
+
+
+# Copies files from the dependent element but inserts split-rules using dynamic data
+class DynamicElement(Element):
+ def configure(self, node):
+ self.node_validate(node, ['split-rules'])
+ self.split_rules = self.node_get_member(node, dict, 'split-rules')
+
+ def preflight(self):
+ pass
+
+ def get_unique_key(self):
+ return {'split-rules': self.split_rules}
+
+ def configure_sandbox(self, sandbox):
+ pass
+
+ def stage(self, sandbox):
+ pass
+
+ def assemble(self, sandbox):
+ with self.timed_activity("Staging artifact", silent_nested=True):
+ for dep in self.dependencies(Scope.BUILD):
+ dep.stage_artifact(sandbox)
+
+ bstdata = self.get_public_data("bst")
+ bstdata["split-rules"] = self.split_rules
+ self.set_public_data("bst", bstdata)
+
+ return ""
+
+
+def setup():
+ return DynamicElement
diff --git a/tests/elements/filter/basic/elements/deps-permitted.bst b/tests/elements/filter/basic/elements/deps-permitted.bst
new file mode 100644
index 000000000..00883b1f8
--- /dev/null
+++ b/tests/elements/filter/basic/elements/deps-permitted.bst
@@ -0,0 +1,11 @@
+kind: filter
+depends:
+- filename: output-include.bst
+ type: build
+- filename: output-exclude.bst
+ type: runtime
+- filename: output-orphans.bst
+ type: runtime
+config:
+ include:
+ - foo
diff --git a/tests/elements/filter/basic/elements/forbidden-also-rdep.bst b/tests/elements/filter/basic/elements/forbidden-also-rdep.bst
new file mode 100644
index 000000000..aa996a649
--- /dev/null
+++ b/tests/elements/filter/basic/elements/forbidden-also-rdep.bst
@@ -0,0 +1,8 @@
+kind: filter
+depends:
+- filename: output-include.bst
+ type: all
+- filename: output-exclude.bst
+ type: runtime
+- filename: output-orphans.bst
+ type: runtime
diff --git a/tests/elements/filter/basic/elements/forbidden-multi-bdep.bst b/tests/elements/filter/basic/elements/forbidden-multi-bdep.bst
new file mode 100644
index 000000000..2d5d0a2ca
--- /dev/null
+++ b/tests/elements/filter/basic/elements/forbidden-multi-bdep.bst
@@ -0,0 +1,8 @@
+kind: filter
+depends:
+- filename: output-include.bst
+ type: build
+- filename: output-exclude.bst
+ type: build
+- filename: output-orphans.bst
+ type: runtime
diff --git a/tests/elements/filter/basic/elements/forbidden-no-bdep.bst b/tests/elements/filter/basic/elements/forbidden-no-bdep.bst
new file mode 100644
index 000000000..a7d405458
--- /dev/null
+++ b/tests/elements/filter/basic/elements/forbidden-no-bdep.bst
@@ -0,0 +1,8 @@
+kind: filter
+depends:
+- filename: output-include.bst
+ type: runtime
+- filename: output-exclude.bst
+ type: runtime
+- filename: output-orphans.bst
+ type: runtime
diff --git a/tests/elements/filter/basic/elements/forbidden-source.bst b/tests/elements/filter/basic/elements/forbidden-source.bst
new file mode 100644
index 000000000..d9eb07921
--- /dev/null
+++ b/tests/elements/filter/basic/elements/forbidden-source.bst
@@ -0,0 +1,10 @@
+kind: filter
+depends:
+- filename: output-include.bst
+ type: build
+config:
+ include:
+ - foo
+sources:
+- kind: local
+ path: files
diff --git a/tests/elements/filter/basic/elements/input-dynamic.bst b/tests/elements/filter/basic/elements/input-dynamic.bst
new file mode 100644
index 000000000..e39cefe74
--- /dev/null
+++ b/tests/elements/filter/basic/elements/input-dynamic.bst
@@ -0,0 +1,10 @@
+kind: dynamic
+depends:
+- filename: input.bst
+ type: build
+config:
+ split-rules:
+ foo:
+ - /foo
+ bar:
+ - /bar
diff --git a/tests/elements/filter/basic/elements/input.bst b/tests/elements/filter/basic/elements/input.bst
new file mode 100644
index 000000000..fb3f5d194
--- /dev/null
+++ b/tests/elements/filter/basic/elements/input.bst
@@ -0,0 +1,11 @@
+kind: import
+sources:
+- kind: local
+ path: files
+public:
+ bst:
+ split-rules:
+ foo:
+ - /foo
+ bar:
+ - /bar
diff --git a/tests/elements/filter/basic/elements/output-dynamic-include.bst b/tests/elements/filter/basic/elements/output-dynamic-include.bst
new file mode 100644
index 000000000..ea45c96ef
--- /dev/null
+++ b/tests/elements/filter/basic/elements/output-dynamic-include.bst
@@ -0,0 +1,7 @@
+kind: filter
+depends:
+- filename: input-dynamic.bst
+ type: build
+config:
+ include:
+ - foo
diff --git a/tests/elements/filter/basic/elements/output-exclude.bst b/tests/elements/filter/basic/elements/output-exclude.bst
new file mode 100644
index 000000000..c1ec17a45
--- /dev/null
+++ b/tests/elements/filter/basic/elements/output-exclude.bst
@@ -0,0 +1,7 @@
+kind: filter
+depends:
+- filename: input.bst
+ type: build
+config:
+ exclude:
+ - foo
diff --git a/tests/elements/filter/basic/elements/output-include.bst b/tests/elements/filter/basic/elements/output-include.bst
new file mode 100644
index 000000000..c05cbdb83
--- /dev/null
+++ b/tests/elements/filter/basic/elements/output-include.bst
@@ -0,0 +1,7 @@
+kind: filter
+depends:
+- filename: input.bst
+ type: build
+config:
+ include:
+ - foo
diff --git a/tests/elements/filter/basic/elements/output-orphans.bst b/tests/elements/filter/basic/elements/output-orphans.bst
new file mode 100644
index 000000000..e682fca7a
--- /dev/null
+++ b/tests/elements/filter/basic/elements/output-orphans.bst
@@ -0,0 +1,9 @@
+kind: filter
+depends:
+- filename: input.bst
+ type: build
+config:
+ exclude:
+ - foo
+ - bar
+ include-orphans: True
diff --git a/tests/elements/filter/basic/files/bar b/tests/elements/filter/basic/files/bar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/elements/filter/basic/files/bar
diff --git a/tests/elements/filter/basic/files/baz b/tests/elements/filter/basic/files/baz
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/elements/filter/basic/files/baz
diff --git a/tests/elements/filter/basic/files/foo b/tests/elements/filter/basic/files/foo
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/elements/filter/basic/files/foo
diff --git a/tests/elements/filter/basic/project.conf b/tests/elements/filter/basic/project.conf
new file mode 100644
index 000000000..418ed02c6
--- /dev/null
+++ b/tests/elements/filter/basic/project.conf
@@ -0,0 +1,7 @@
+name: test
+element-path: elements
+plugins:
+- origin: local
+ path: element_plugins
+ elements:
+ dynamic: 0