# Pylint doesn't play well with fixtures and dependency injection from pytest # pylint: disable=redefined-outer-name import os import pytest from buildstream._exceptions import ErrorDomain, LoadErrorReason from buildstream.plugintestutils import cli # pylint: disable=unused-import DATA_DIR = os.path.dirname(os.path.realpath(__file__)) # # Exercising some different ways of loading the dependencies # @pytest.mark.datafiles(DATA_DIR) def test_two_files(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['target.bst']) assert elements == ['firstdep.bst', 'target.bst'] @pytest.mark.datafiles(DATA_DIR) def test_shared_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['shareddeptarget.bst']) assert elements == ['firstdep.bst', 'shareddep.bst', 'shareddeptarget.bst'] @pytest.mark.datafiles(DATA_DIR) def test_dependency_dict(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['target-depdict.bst']) assert elements == ['firstdep.bst', 'target-depdict.bst'] @pytest.mark.datafiles(DATA_DIR) def test_invalid_dependency_declaration(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') result = cli.run(project=project, args=['show', 'invaliddep.bst']) result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA) @pytest.mark.datafiles(DATA_DIR) def test_invalid_dependency_type(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') result = cli.run(project=project, args=['show', 'invaliddeptype.bst']) result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.INVALID_DATA) @pytest.mark.datafiles(DATA_DIR) def test_circular_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') result = cli.run(project=project, args=['show', 'circulartarget.bst']) result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.CIRCULAR_DEPENDENCY) @pytest.mark.datafiles(DATA_DIR) def test_build_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['builddep.bst'], scope='run') assert elements == ['builddep.bst'] elements = cli.get_pipeline(project, ['builddep.bst'], scope='build') assert elements == ['firstdep.bst'] @pytest.mark.datafiles(DATA_DIR) def test_runtime_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['runtimedep.bst'], scope='build') # FIXME: The empty line should probably never happen here when there are no results. assert elements == [''] elements = cli.get_pipeline(project, ['runtimedep.bst'], scope='run') assert elements == ['firstdep.bst', 'runtimedep.bst'] @pytest.mark.datafiles(DATA_DIR) def test_all_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') elements = cli.get_pipeline(project, ['alldep.bst'], scope='build') assert elements == ['firstdep.bst'] elements = cli.get_pipeline(project, ['alldep.bst'], scope='run') assert elements == ['firstdep.bst', 'alldep.bst'] @pytest.mark.datafiles(DATA_DIR) def test_list_build_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') # Check that the pipeline includes the build dependency deps = cli.get_pipeline(project, ['builddep-list.bst'], scope="build") assert "firstdep.bst" in deps @pytest.mark.datafiles(DATA_DIR) def test_list_runtime_dependency(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') # Check that the pipeline includes the runtime dependency deps = cli.get_pipeline(project, ['runtimedep-list.bst'], scope="run") assert "firstdep.bst" in deps @pytest.mark.datafiles(DATA_DIR) def test_list_dependencies_combined(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') # Check that runtime deps get combined rundeps = cli.get_pipeline(project, ['list-combine.bst'], scope="run") assert "firstdep.bst" not in rundeps assert "seconddep.bst" in rundeps assert "thirddep.bst" in rundeps # Check that build deps get combined builddeps = cli.get_pipeline(project, ['list-combine.bst'], scope="build") assert "firstdep.bst" in builddeps assert "seconddep.bst" not in builddeps assert "thirddep.bst" in builddeps @pytest.mark.datafiles(DATA_DIR) def test_list_overlap(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies1') # Check that dependencies get merged rundeps = cli.get_pipeline(project, ['list-overlap.bst'], scope="run") assert "firstdep.bst" in rundeps builddeps = cli.get_pipeline(project, ['list-overlap.bst'], scope="build") assert "firstdep.bst" in builddeps # # Testing the order of elements reported when iterating through # Element.dependencies() with various scopes. # @pytest.mark.datafiles(DATA_DIR) def test_scope_all(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies2') elements = ['target.bst'] element_list = cli.get_pipeline(project, elements, scope='all') assert element_list == [ "build-build.bst", "run-build.bst", "build.bst", "dep-one.bst", "run.bst", "dep-two.bst", "target.bst", ] @pytest.mark.datafiles(DATA_DIR) def test_scope_run(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies2') elements = ['target.bst'] element_list = cli.get_pipeline(project, elements, scope='run') assert element_list == [ "dep-one.bst", "run.bst", "dep-two.bst", "target.bst", ] @pytest.mark.datafiles(DATA_DIR) def test_scope_build(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies2') elements = ['target.bst'] element_list = cli.get_pipeline(project, elements, scope='build') assert element_list == ["dep-one.bst", "run.bst", "dep-two.bst"] @pytest.mark.datafiles(DATA_DIR) def test_scope_build_of_child(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies2') elements = ['target.bst'] element_list = cli.get_pipeline(project, elements, scope='build') # First pass, lets check dep-two element = element_list[2] # Pass two, let's look at these element_list = cli.get_pipeline(project, [element], scope='build') assert element_list == ["run-build.bst", "build.bst"] @pytest.mark.datafiles(DATA_DIR) def test_no_recurse(cli, datafiles): project = os.path.join(str(datafiles), 'dependencies2') elements = ['target.bst'] # We abuse the 'plan' scope here to ensure that we call # element.dependencies() with recurse=False - currently, no `bst # show` option does this directly. element_list = cli.get_pipeline(project, elements, scope='plan') assert element_list == [ 'build-build.bst', 'run-build.bst', 'build.bst', 'dep-one.bst', 'run.bst', 'dep-two.bst', 'target.bst', ]