blob: ad23389e8e94bb5b2c2ee94a7e1a6a1fc9d43ed9 [file] [log] [blame]
import os
import pytest
from buildstream import LoadError, LoadErrorReason
from buildstream._loader import Loader
from buildstream._metaelement import MetaElement
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'variants',
)
##############################################################
# Test Basic Failure Modes #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_variant_not_list(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/variants-not-list.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_unnamed(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/unnamed-variant.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_bad_name(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/variant-bad-name.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_only_one(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/only-one-variant.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_illegal_composite(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/variant-illegal-composite.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.ILLEGAL_COMPOSITE)
##############################################################
# Test Invalid Variant Requests #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_variant_invalid_target(datafiles):
# Test that an invalid variant requested as the pipeline target raises the appropriate error
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-compositing.bst', 'green', None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_VARIANT)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_invalid_dependency(datafiles):
# Test that an invalid variant requested as an element dependency raises the appropriate error
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-invalid.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_VARIANT)
@pytest.mark.datafiles(DATA_DIR)
def test_variant_invalid_unused_dependency(datafiles):
# Test that an invalid variant requested as an element dependency which is
# unused in the effective variant resolution still raises the appropriate
# error (ensure that errors occur even on unused variant paths)
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-unused-variant-invalid.bst', 'blue', None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.INVALID_VARIANT)
##############################################################
# Test Variant Default and Priority #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_variant_default_target(datafiles):
# Assert that the default (first) variant is chosen for a toplevel target with variants.
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-compositing.bst', None, None, None, [])
element = loader.load()
assert(element.variant == 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_default_dependency(datafiles):
# Assert that the default (first) variant is chosen for a dependency of a toplevel
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/depends-on-element-with-variants.bst', None, None, None, [])
element = loader.load()
dependency = element.dependencies[0]
assert(dependency.variant == 'pink')
##############################################################
# Test Simple Variant Compositing #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_composite_default(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-compositing.bst', None, None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Without specifying a variant, the default (first) should have been chosen
assert(element.config.get('somedata') == 5)
assert(element.config.get('pony-color') == 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_composite_pink_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-compositing.bst', 'pink', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# We explicitly asked for the pink variation of this pony
assert(element.config.get('somedata') == 5)
assert(element.config.get('pony-color') == 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_composite_blue_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-variant-compositing.bst', 'blue', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# We explicitly asked for the blue variation of this pony,
# which has the side effect of overriding the value of 'somedata'
assert(element.config.get('somedata') == 6)
assert(element.config.get('pony-color') == 'blue')
##############################################################
# Test Variant Dependency Plotting #
##############################################################
#
# Convenience for asserting dependencies
#
def assert_dependency(element, index, name, key, value):
# Test that the dependency we got is the pink color by default
assert(len(element.dependencies) >= index + 1)
dep = element.dependencies[index]
assert(isinstance(dep, MetaElement))
assert(dep.name == name)
assert(isinstance(dep.config, dict))
assert(dep.config.get(key) == value)
return dep
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_dependency_default(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-dependency-variants.bst', None, None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test that the default is a pink pony
assert_dependency(element, 0, 'elements/simply-pink.bst', 'color', 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_dependency_pink_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-dependency-variants.bst', 'pink', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test that the explicit pink dependency is correct
assert_dependency(element, 0, 'elements/simply-pink.bst', 'color', 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_simple_dependency_blue_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/simple-dependency-variants.bst', 'blue', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test that the explicit blue dependency is correct
assert_dependency(element, 0, 'elements/simply-blue.bst', 'color', 'blue')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_indirect_dependency_default(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/indirect-dependency-variants.bst', None, None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test that the default is a blue pony-color by default
simple = assert_dependency(
element, 0, 'elements/simple-dependency-variants.bst', 'pony-color', 'blue')
# Test that the element we depend on now depends on the blue color
assert_dependency(simple, 0, 'elements/simply-blue.bst', 'color', 'blue')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_indirect_dependency_blue_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/indirect-dependency-variants.bst', 'blue', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test for a blue pony-color
simple = assert_dependency(
element, 0, 'elements/simple-dependency-variants.bst', 'pony-color', 'blue')
# Test that the element we depend on now depends on the blue color
assert_dependency(simple, 0, 'elements/simply-blue.bst', 'color', 'blue')
@pytest.mark.datafiles(DATA_DIR)
def test_variant_indirect_dependency_pink_pony(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(
basedir, 'elements/indirect-dependency-variants.bst', 'pink', None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
# Test for a blue pony-color
simple = assert_dependency(
element, 0, 'elements/simple-dependency-variants.bst', 'pony-color', 'pink')
# Test that the element we depend on now depends on the blue color
assert_dependency(simple, 0, 'elements/simply-pink.bst', 'color', 'pink')
@pytest.mark.datafiles(DATA_DIR)
def test_engine_resolve_agreement(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/tricky.bst', None, None, None, [])
element = loader.load()
assert(isinstance(element, MetaElement))
assert(element.kind == 'tricky')
# Test the first dependency
first = assert_dependency(element, 0, 'elements/tricky-first.bst', 'choice', 'second')
second = assert_dependency(element, 1, 'elements/tricky-second.bst', 'choice', 'second')
@pytest.mark.datafiles(DATA_DIR)
def test_engine_disagreement(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = Loader(basedir, 'elements/disagreement.bst', None, None, None, [])
with pytest.raises(LoadError) as exc:
element = loader.load()
assert (exc.value.reason == LoadErrorReason.VARIANT_DISAGREEMENT)