tests: Add filter element tests
diff --git a/tests/plugins/filter.py b/tests/plugins/filter.py
new file mode 100644
index 0000000..a8e7257
--- /dev/null
+++ b/tests/plugins/filter.py
@@ -0,0 +1,87 @@
+import os
+import pytest
+from tests.testutils.runcli import cli
+from buildstream._exceptions import ErrorDomain
+
+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"))
+
+
+@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 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.PIPELINE, '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.PIPELINE, '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.PIPELINE, '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.PIPELINE, 'filter-bdepend-also-rdepend')
diff --git a/tests/plugins/filter/basic/elements/deps-permitted.bst b/tests/plugins/filter/basic/elements/deps-permitted.bst
new file mode 100644
index 0000000..00883b1
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/forbidden-also-rdep.bst b/tests/plugins/filter/basic/elements/forbidden-also-rdep.bst
new file mode 100644
index 0000000..aa996a6
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/forbidden-multi-bdep.bst b/tests/plugins/filter/basic/elements/forbidden-multi-bdep.bst
new file mode 100644
index 0000000..2d5d0a2
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/forbidden-no-bdep.bst b/tests/plugins/filter/basic/elements/forbidden-no-bdep.bst
new file mode 100644
index 0000000..a7d4054
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/forbidden-source.bst b/tests/plugins/filter/basic/elements/forbidden-source.bst
new file mode 100644
index 0000000..d9eb079
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/input.bst b/tests/plugins/filter/basic/elements/input.bst
new file mode 100644
index 0000000..fb3f5d1
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/output-exclude.bst b/tests/plugins/filter/basic/elements/output-exclude.bst
new file mode 100644
index 0000000..c1ec17a
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/output-include.bst b/tests/plugins/filter/basic/elements/output-include.bst
new file mode 100644
index 0000000..c05cbdb
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/elements/output-orphans.bst b/tests/plugins/filter/basic/elements/output-orphans.bst
new file mode 100644
index 0000000..e682fca
--- /dev/null
+++ b/tests/plugins/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/plugins/filter/basic/files/bar b/tests/plugins/filter/basic/files/bar
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/plugins/filter/basic/files/bar
diff --git a/tests/plugins/filter/basic/files/baz b/tests/plugins/filter/basic/files/baz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/plugins/filter/basic/files/baz
diff --git a/tests/plugins/filter/basic/files/foo b/tests/plugins/filter/basic/files/foo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/plugins/filter/basic/files/foo
diff --git a/tests/plugins/filter/basic/project.conf b/tests/plugins/filter/basic/project.conf
new file mode 100644
index 0000000..6275225
--- /dev/null
+++ b/tests/plugins/filter/basic/project.conf
@@ -0,0 +1,2 @@
+name: test
+element-path: elements