Commit 8d676a84 authored by Tristan Van Berkom's avatar Tristan Van Berkom

tests: Migrate dependencies test to tests/format

This used to be an internal test, converted this to use the `cli` fixture.
parent f712aaa5
import os
import pytest
from buildstream._exceptions import ErrorDomain, LoadErrorReason
from tests.testutils import cli
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'dependencies',
)
@pytest.mark.datafiles(DATA_DIR)
def test_two_files(cli, datafiles):
project = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
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 = str(datafiles)
# 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 = str(datafiles)
# 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 = str(datafiles)
# 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 = str(datafiles)
# 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
kind: pony
kind: manual
description: This element has a dependency with type 'all'
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
type: all
kind: stack
description: This element has a build-only dependency specified via build-depends
build-depends:
- elements/firstdep.bst
- firstdep.bst
kind: pony
kind: manual
description: This element has a build-only dependency
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
type: build
kind: pony
kind: manual
description: Depend on another dep which depends on the target
depends:
- elements/circular-seconddep.bst
- circular-seconddep.bst
kind: pony
kind: manual
description: Depend on the target, creating a circular dependency
depends:
- elements/circulartarget.bst
- circulartarget.bst
kind: pony
kind: stack
description: This is a main target which introduces a circular dependency
depends:
- elements/circular-firstdep.bst
- circular-firstdep.bst
kind: pony
kind: manual
description: This is an invalid dependency type
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
type: should be build or runtime
kind: stack
description: This element depends on three elements in different ways
build-depends:
- elements/firstdep.bst
- firstdep.bst
runtime-depends:
- elements/seconddep.bst
- seconddep.bst
depends:
- elements/thirddep.bst
- thirddep.bst
kind: stack
description: This element depends on two elements in different ways
build-depends:
- elements/firstdep.bst
- firstdep.bst
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
type: runtime
kind: stack
description: This element has a runtime-only dependency
runtime-depends:
- elements/firstdep.bst
- firstdep.bst
kind: pony
kind: manual
description: This element has a runtime-only dependency
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
type: runtime
kind: shareddep
kind: stack
description: This is the first dependency
depends:
- elements/firstdep.bst
- firstdep.bst
kind: pony
kind: stack
description: This is the main target
depends:
- elements/firstdep.bst
- elements/shareddep.bst
- firstdep.bst
- shareddep.bst
kind: pony
kind: manual
description: This is the main target
depends:
- filename: elements/firstdep.bst
- filename: firstdep.bst
kind: pony
kind: stack
description: This is the main target
depends:
- elements/firstdep.bst
- firstdep.bst
import os
from buildstream._context import Context
from buildstream._project import Project
from buildstream._loader import Loader
#
# This is used by the loader test modules, these should
# be removed in favor of testing the functionality via
# the CLI like in the frontend tests anyway.
#
def dummy_handler(message, context):
pass
def make_loader(basedir):
context = Context()
context.load(config=os.devnull)
context.set_message_handler(dummy_handler)
project = Project(basedir, context)
return project.loader
import os
import pytest
from buildstream._exceptions import LoadError, LoadErrorReason
from buildstream._loader import Loader, MetaElement
from tests.testutils import cli
from . import make_loader
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'dependencies',
)
##############################################################
# Basics: Test behavior loading projects with dependencies #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_two_files(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/target.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 1)
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
assert(firstdep.kind == 'manual')
@pytest.mark.datafiles(DATA_DIR)
def test_shared_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/shareddeptarget.bst'])[0]
# Toplevel is 'pony' with 2 dependencies
#
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 2)
# The first specified dependency is 'thefirstdep'
#
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
assert(firstdep.kind == 'manual')
assert(len(firstdep.dependencies) == 0)
# The second specified dependency is 'shareddep'
#
shareddep = element.dependencies[1]
assert(isinstance(shareddep, MetaElement))
assert(shareddep.kind == 'shareddep')
assert(len(shareddep.dependencies) == 1)
# The element which shareddep depends on is
# the same element in memory as firstdep
#
shareddepdep = shareddep.dependencies[0]
assert(isinstance(shareddepdep, MetaElement))
# Assert they are in fact the same LoadElement
#
# Note we must use 'is' to test that both variables
# refer to the same object in memory, not a regular
# equality test with '==' which is one of those operator
# overridable thingies.
#
assert(shareddepdep is firstdep)
@pytest.mark.datafiles(DATA_DIR)
def test_dependency_dict(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/target-depdict.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 1)
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
assert(firstdep.kind == 'manual')
@pytest.mark.datafiles(DATA_DIR)
def test_invalid_dependency_declaration(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
with pytest.raises(LoadError) as exc:
element = loader.load(['elements/invaliddep.bst'])[0]
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_circular_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
with pytest.raises(LoadError) as exc:
element = loader.load(['elements/circulartarget.bst'])[0]
assert (exc.value.reason == LoadErrorReason.CIRCULAR_DEPENDENCY)
assert ("seconddep" in exc.value.args[0])
@pytest.mark.datafiles(DATA_DIR)
def test_invalid_dependency_type(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
with pytest.raises(LoadError) as exc:
element = loader.load(['elements/invaliddeptype.bst'])[0]
assert (exc.value.reason == LoadErrorReason.INVALID_DATA)
@pytest.mark.datafiles(DATA_DIR)
def test_build_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/builddep.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.build_dependencies) == 1)
firstdep = element.build_dependencies[0]
assert(isinstance(firstdep, MetaElement))
assert(len(element.dependencies) == 0)
@pytest.mark.datafiles(DATA_DIR)
def test_runtime_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/runtimedep.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 1)
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
assert(len(element.build_dependencies) == 0)
@pytest.mark.datafiles(DATA_DIR)
def test_build_runtime_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/target.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 1)
assert(len(element.build_dependencies) == 1)
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
firstbuilddep = element.build_dependencies[0]
assert(firstdep == firstbuilddep)
@pytest.mark.datafiles(DATA_DIR)
def test_all_dependency(datafiles):
basedir = os.path.join(datafiles.dirname, datafiles.basename)
loader = make_loader(basedir)
element = loader.load(['elements/alldep.bst'])[0]
assert(isinstance(element, MetaElement))
assert(element.kind == 'pony')
assert(len(element.dependencies) == 1)
assert(len(element.build_dependencies) == 1)
firstdep = element.dependencies[0]
assert(isinstance(firstdep, MetaElement))
firstbuilddep = element.build_dependencies[0]
assert(firstdep == firstbuilddep)
@pytest.mark.datafiles(DATA_DIR)
def test_list_build_dependency(cli, datafiles):
project = str(datafiles)
# Check that the pipeline includes the build dependency
deps = cli.get_pipeline(project, ['elements/builddep-list.bst'], scope="build")
assert "elements/firstdep.bst" in deps
@pytest.mark.datafiles(DATA_DIR)
def test_list_runtime_dependency(cli, datafiles):
project = str(datafiles)
# Check that the pipeline includes the runtime dependency
deps = cli.get_pipeline(project, ['elements/runtimedep-list.bst'], scope="run")
assert "elements/firstdep.bst" in deps
@pytest.mark.datafiles(DATA_DIR)
def test_list_dependencies_combined(cli, datafiles):
project = str(datafiles)
# Check that runtime deps get combined
rundeps = cli.get_pipeline(project, ['elements/list-combine.bst'], scope="run")
assert "elements/firstdep.bst" not in rundeps
assert "elements/seconddep.bst" in rundeps
assert "elements/thirddep.bst" in rundeps
# Check that build deps get combined
builddeps = cli.get_pipeline(project, ['elements/list-combine.bst'], scope="build")
assert "elements/firstdep.bst" in builddeps
assert "elements/seconddep.bst" not in builddeps
assert "elements/thirddep.bst" in builddeps
@pytest.mark.datafiles(DATA_DIR)
def test_list_overlap(cli, datafiles):
project = str(datafiles)
# Check that dependencies get merged
rundeps = cli.get_pipeline(project, ['elements/list-overlap.bst'], scope="run")
assert "elements/firstdep.bst" in rundeps
builddeps = cli.get_pipeline(project, ['elements/list-overlap.bst'], scope="build")
assert "elements/firstdep.bst" in builddeps
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment