blob: 29ceb6dde0f2768c4691c2ab4040c1fcf6aa1e8c [file] [log] [blame]
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')