| import os |
| import pytest |
| from tests.testutils.runcli import cli |
| from buildstream._exceptions import ErrorDomain |
| from buildstream import _yaml |
| from buildstream.plugin import CoreWarnings |
| |
| # Project directory |
| DATA_DIR = os.path.join( |
| os.path.dirname(os.path.realpath(__file__)), |
| "overlaps" |
| ) |
| |
| project_template = { |
| "name": "test", |
| "element-path": "." |
| } |
| |
| |
| def gen_project(project_dir, fail_on_overlap, use_fatal_warnings=True): |
| template = dict(project_template) |
| if use_fatal_warnings: |
| template["fatal-warnings"] = [CoreWarnings.OVERLAPS] if fail_on_overlap else [] |
| else: |
| template["fail-on-overlap"] = fail_on_overlap |
| projectfile = os.path.join(project_dir, "project.conf") |
| _yaml.dump(template, projectfile) |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| @pytest.mark.parametrize("use_fatal_warnings", [True, False]) |
| def test_overlaps(cli, datafiles, use_fatal_warnings): |
| project_dir = str(datafiles) |
| gen_project(project_dir, False, use_fatal_warnings) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'collect.bst']) |
| result.assert_success() |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| @pytest.mark.parametrize("use_fatal_warnings", [True, False]) |
| def test_overlaps_error(cli, datafiles, use_fatal_warnings): |
| project_dir = str(datafiles) |
| gen_project(project_dir, True, use_fatal_warnings) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'collect.bst']) |
| result.assert_main_error(ErrorDomain.STREAM, None) |
| result.assert_task_error(ErrorDomain.PLUGIN, CoreWarnings.OVERLAPS) |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| def test_overlaps_whitelist(cli, datafiles): |
| project_dir = str(datafiles) |
| gen_project(project_dir, True) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'collect-whitelisted.bst']) |
| result.assert_success() |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| def test_overlaps_whitelist_ignored(cli, datafiles): |
| project_dir = str(datafiles) |
| gen_project(project_dir, False) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'collect-whitelisted.bst']) |
| result.assert_success() |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| def test_overlaps_whitelist_on_overlapper(cli, datafiles): |
| # Tests that the overlapping element is responsible for whitelisting, |
| # i.e. that if A overlaps B overlaps C, and the B->C overlap is permitted, |
| # it'll still fail because A doesn't permit overlaps. |
| project_dir = str(datafiles) |
| gen_project(project_dir, True) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'collect-partially-whitelisted.bst']) |
| result.assert_main_error(ErrorDomain.STREAM, None) |
| result.assert_task_error(ErrorDomain.PLUGIN, CoreWarnings.OVERLAPS) |
| |
| |
| @pytest.mark.datafiles(DATA_DIR) |
| @pytest.mark.parametrize("use_fatal_warnings", [True, False]) |
| def test_overlaps_script(cli, datafiles, use_fatal_warnings): |
| # Test overlaps with script element to test |
| # Element.stage_dependency_artifacts() with Scope.RUN |
| project_dir = str(datafiles) |
| gen_project(project_dir, False, use_fatal_warnings) |
| result = cli.run(project=project_dir, silent=True, args=[ |
| 'build', 'script.bst']) |
| result.assert_success() |