import os import pytest from buildstream._exceptions import ErrorDomain from buildstream import _yaml from tests.testutils.runcli import cli DATA_DIR = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'load', ) @pytest.mark.datafiles(os.path.join(DATA_DIR, 'simple')) def test_load_simple(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) result = cli.get_element_config(basedir, 'simple.bst') assert(result['configure-commands'][0] == 'pony') ############################################################### # Testing Element.dependencies() iteration # ############################################################### @pytest.mark.datafiles(os.path.join(DATA_DIR, 'iterate')) def test_iterate_scope_all(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) elements = ['target.bst'] element_list = cli.get_pipeline(basedir, elements, scope='all') assert(len(element_list) == 7) assert(element_list[0] == "build-build.bst") assert(element_list[1] == "run-build.bst") assert(element_list[2] == "build.bst") assert(element_list[3] == "dep-one.bst") assert(element_list[4] == "run.bst") assert(element_list[5] == "dep-two.bst") assert(element_list[6] == "target.bst") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'iterate')) def test_iterate_scope_run(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) elements = ['target.bst'] element_list = cli.get_pipeline(basedir, elements, scope='run') assert(len(element_list) == 4) assert(element_list[0] == "dep-one.bst") assert(element_list[1] == "run.bst") assert(element_list[2] == "dep-two.bst") assert(element_list[3] == "target.bst") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'iterate')) def test_iterate_scope_build(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) elements = ['target.bst'] element_list = cli.get_pipeline(basedir, elements, scope='build') assert(len(element_list) == 3) assert(element_list[0] == "dep-one.bst") assert(element_list[1] == "run.bst") assert(element_list[2] == "dep-two.bst") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'iterate')) def test_iterate_scope_build_of_child(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) elements = ['target.bst'] element_list = cli.get_pipeline(basedir, 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(basedir, [element], scope='build') assert(len(element_list) == 2) assert(element_list[0] == "run-build.bst") assert(element_list[1] == "build.bst") @pytest.mark.datafiles(os.path.join(DATA_DIR, 'iterate')) def test_iterate_no_recurse(cli, datafiles): basedir = os.path.join(datafiles.dirname, datafiles.basename) 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(basedir, elements, scope='plan') assert(len(element_list) == 7) assert(element_list[0] == 'build-build.bst') assert(element_list[1] in ['build.bst', 'run-build.bst']) assert(element_list[2] in ['build.bst', 'run-build.bst']) assert(element_list[3] in ['dep-one.bst', 'run.bst', 'dep-two.bst']) assert(element_list[4] in ['dep-one.bst', 'run.bst', 'dep-two.bst']) assert(element_list[5] in ['dep-one.bst', 'run.bst', 'dep-two.bst']) assert(element_list[6] == 'target.bst') # This test checks various constructions of a pipeline # with one or more targets and 0 or more exception elements, # each data set provides the targets, exceptions and expected # result list. # @pytest.mark.datafiles(os.path.join(DATA_DIR, 'exceptions')) @pytest.mark.parametrize("elements,exceptions,results", [ # Test without exceptions, lets just see the whole list here (['build.bst'], None, [ 'fourth-level-1.bst', 'third-level-1.bst', 'fourth-level-2.bst', 'third-level-2.bst', 'fourth-level-3.bst', 'third-level-3.bst', 'second-level-1.bst', 'first-level-1.bst', 'first-level-2.bst', 'build.bst', ]), # Test one target and excepting a part of the pipeline, this # removes forth-level-1 and third-level-1 (['build.bst'], ['third-level-1.bst'], [ 'fourth-level-2.bst', 'third-level-2.bst', 'fourth-level-3.bst', 'third-level-3.bst', 'second-level-1.bst', 'first-level-1.bst', 'first-level-2.bst', 'build.bst', ]), # Test one target and excepting a part of the pipeline, check that # excepted dependencies remain in the pipeline if depended on from # outside of the except element (['build.bst'], ['second-level-1.bst'], [ 'fourth-level-2.bst', 'third-level-2.bst', # first-level-2 depends on this, so not excepted 'first-level-1.bst', 'first-level-2.bst', 'build.bst', ]), # The same as the above test, but excluding the toplevel build.bst, # instead only select the two toplevel dependencies as targets (['first-level-1.bst', 'first-level-2.bst'], ['second-level-1.bst'], [ 'fourth-level-2.bst', 'third-level-2.bst', # first-level-2 depends on this, so not excepted 'first-level-1.bst', 'first-level-2.bst', ]), # Test one target and excepting an element outisde the pipeline (['build.bst'], ['unrelated-1.bst'], [ 'fourth-level-2.bst', 'third-level-2.bst', # first-level-2 depends on this, so not excepted 'first-level-1.bst', 'first-level-2.bst', 'build.bst', ]), # Test one target and excepting two elements (['build.bst'], ['unrelated-1.bst', 'unrelated-2.bst'], [ 'first-level-1.bst', 'build.bst', ]), ]) def test_except_elements(cli, datafiles, elements, exceptions, results): basedir = os.path.join(datafiles.dirname, datafiles.basename) # Except second-level-2 and check that the correct dependencies # are removed. element_list = cli.get_pipeline(basedir, elements, except_=exceptions, scope='all') assert element_list == results @pytest.mark.datafiles(os.path.join(DATA_DIR, 'noloadref')) @pytest.mark.parametrize("ref_storage", [('inline'), ('project.refs')]) def test_unsupported_load_ref(cli, datafiles, ref_storage): basedir = os.path.join(datafiles.dirname, datafiles.basename) # Generate project with access to the noloadref plugin and project.refs enabled # config = { 'name': 'test', 'ref-storage': ref_storage, 'plugins': [ { 'origin': 'local', 'path': 'plugins', 'sources': { 'noloadref': 0 } } ] } _yaml.dump(config, os.path.join(basedir, 'project.conf')) result = cli.run(project=basedir, silent=True, args=['show', 'noloadref.bst']) # There is no error if project.refs is not in use, otherwise we # assert our graceful failure if ref_storage == 'inline': result.assert_success() else: result.assert_main_error(ErrorDomain.SOURCE, 'unsupported-load-ref')