From ad5264418049b9c18f2030b92e25e331771716dc Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Fri, 22 Feb 2019 17:15:09 +0900 Subject: tests/frontend/overlaps.py: Added regression test for cross project overlaps This test ensures the overlap failure vs warning policy in one project only ever affects the artifacts created for the project which declares it and does not force it's policy onto another consuming project. A regression test against issue #926 --- tests/frontend/overlaps.py | 41 ++++++++++++++++++----- tests/frontend/overlaps/sub-collect.bst | 11 ++++++ tests/frontend/overlaps/sub-project/a-sub.bst | 7 ++++ tests/frontend/overlaps/sub-project/files/a/file3 | 1 + tests/frontend/overlaps/sub-project/files/z/file1 | 1 + tests/frontend/overlaps/sub-project/files/z/file2 | 1 + tests/frontend/overlaps/sub-project/z-sub.bst | 7 ++++ 7 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 tests/frontend/overlaps/sub-collect.bst create mode 100644 tests/frontend/overlaps/sub-project/a-sub.bst create mode 100644 tests/frontend/overlaps/sub-project/files/a/file3 create mode 100644 tests/frontend/overlaps/sub-project/files/z/file1 create mode 100644 tests/frontend/overlaps/sub-project/files/z/file2 create mode 100644 tests/frontend/overlaps/sub-project/z-sub.bst diff --git a/tests/frontend/overlaps.py b/tests/frontend/overlaps.py index 36e15acd7..7c86445f6 100644 --- a/tests/frontend/overlaps.py +++ b/tests/frontend/overlaps.py @@ -1,6 +1,7 @@ import os import pytest from tests.testutils.runcli import cli +from tests.testutils import generate_junction from buildstream._exceptions import ErrorDomain from buildstream import _yaml @@ -10,15 +11,12 @@ DATA_DIR = os.path.join( "overlaps" ) -project_template = { - "name": "test", - "element-path": "." -} - -def gen_project(project_dir, fail_on_overlap): - template = dict(project_template) - template["fail-on-overlap"] = fail_on_overlap +def gen_project(project_dir, fail_on_overlap, project_name="test"): + template = { + "name": project_name, + "fail-on-overlap": fail_on_overlap + } projectfile = os.path.join(project_dir, "project.conf") _yaml.dump(template, projectfile) @@ -82,3 +80,30 @@ def test_overlaps_script(cli, datafiles): result = cli.run(project=project_dir, silent=True, args=[ 'build', 'script.bst']) result.assert_success() + + +@pytest.mark.datafiles(DATA_DIR) +@pytest.mark.parametrize("project_policy", [('fail'), ('warn')]) +@pytest.mark.parametrize("subproject_policy", [('fail'), ('warn')]) +def test_overlap_subproject(cli, tmpdir, datafiles, project_policy, subproject_policy): + project_dir = str(datafiles) + subproject_dir = os.path.join(project_dir, 'sub-project') + junction_path = os.path.join(project_dir, 'sub-project.bst') + + gen_project(project_dir, bool(project_policy == 'fail'), project_name='test') + gen_project(subproject_dir, bool(subproject_policy == 'fail'), project_name='subtest') + generate_junction(tmpdir, subproject_dir, junction_path) + + # Here we have a dependency chain where the project element + # always overlaps with the subproject element. + # + # Test that overlap error vs warning policy for this overlap + # is always controlled by the project and not the subproject. + # + result = cli.run(project=project_dir, silent=True, args=['build', 'sub-collect.bst']) + if project_policy == 'fail': + result.assert_main_error(ErrorDomain.STREAM, None) + result.assert_task_error(ErrorDomain.ELEMENT, "overlap-error") + else: + result.assert_success() + assert "WARNING Non-whitelisted overlaps detected" in result.stderr diff --git a/tests/frontend/overlaps/sub-collect.bst b/tests/frontend/overlaps/sub-collect.bst new file mode 100644 index 000000000..85d327e1b --- /dev/null +++ b/tests/frontend/overlaps/sub-collect.bst @@ -0,0 +1,11 @@ +kind: compose + +depends: +- filename: c.bst + type: build +- filename: a-sub.bst + junction: sub-project.bst + type: build +- filename: z-sub.bst + junction: sub-project.bst + type: build diff --git a/tests/frontend/overlaps/sub-project/a-sub.bst b/tests/frontend/overlaps/sub-project/a-sub.bst new file mode 100644 index 000000000..40b8f5d9c --- /dev/null +++ b/tests/frontend/overlaps/sub-project/a-sub.bst @@ -0,0 +1,7 @@ +kind: import +config: + source: / + target: / +sources: +- kind: local + path: "files/a" diff --git a/tests/frontend/overlaps/sub-project/files/a/file3 b/tests/frontend/overlaps/sub-project/files/a/file3 new file mode 100644 index 000000000..e416e0d0d --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/a/file3 @@ -0,0 +1 @@ +barny diff --git a/tests/frontend/overlaps/sub-project/files/z/file1 b/tests/frontend/overlaps/sub-project/files/z/file1 new file mode 100644 index 000000000..257cc5642 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/z/file1 @@ -0,0 +1 @@ +foo diff --git a/tests/frontend/overlaps/sub-project/files/z/file2 b/tests/frontend/overlaps/sub-project/files/z/file2 new file mode 100644 index 000000000..5716ca598 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/files/z/file2 @@ -0,0 +1 @@ +bar diff --git a/tests/frontend/overlaps/sub-project/z-sub.bst b/tests/frontend/overlaps/sub-project/z-sub.bst new file mode 100644 index 000000000..e9729ae31 --- /dev/null +++ b/tests/frontend/overlaps/sub-project/z-sub.bst @@ -0,0 +1,7 @@ +kind: import +config: + source: / + target: / +sources: +- kind: local + path: "files/z" -- cgit v1.2.1