blob: bfadce7edc1b722ab046c1e0d9d43f9260281069 [file] [log] [blame]
# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name
import os
import textwrap
import pytest
from buildstream import _yaml
from buildstream._exceptions import ErrorDomain, LoadErrorReason
from buildstream.testing import cli # pylint: disable=unused-import
from buildstream.testing import create_repo
from tests.testutils import generate_junction
# Project directory
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'include'
)
@pytest.mark.datafiles(DATA_DIR)
def test_include_project_file(cli, datafiles):
project = os.path.join(str(datafiles), 'file')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, bool, 'included')
def test_include_missing_file(cli, tmpdir):
tmpdir.join('project.conf').write('{"name": "test"}')
element = tmpdir.join('include_missing_file.bst')
# Normally we would use dicts and _yaml.dump to write such things, but here
# we want to be sure of a stable line and column number.
element.write(textwrap.dedent("""
kind: manual
"(@)":
- nosuch.yaml
""").strip())
result = cli.run(project=str(tmpdir), args=['show', str(element.basename)])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.MISSING_FILE)
# Make sure the root cause provenance is in the output.
assert 'line 4 column 2' in result.stderr
def test_include_dir(cli, tmpdir):
tmpdir.join('project.conf').write('{"name": "test"}')
tmpdir.mkdir('subdir')
element = tmpdir.join('include_dir.bst')
# Normally we would use dicts and _yaml.dump to write such things, but here
# we want to be sure of a stable line and column number.
element.write(textwrap.dedent("""
kind: manual
"(@)":
- subdir/
""").strip())
result = cli.run(project=str(tmpdir), args=['show', str(element.basename)])
result.assert_main_error(
ErrorDomain.LOAD, LoadErrorReason.LOADING_DIRECTORY)
# Make sure the root cause provenance is in the output.
assert 'line 4 column 2' in result.stderr
@pytest.mark.datafiles(DATA_DIR)
def test_include_junction_file(cli, tmpdir, datafiles):
project = os.path.join(str(datafiles), 'junction')
generate_junction(tmpdir,
os.path.join(project, 'subproject'),
os.path.join(project, 'junction.bst'),
store_ref=True)
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, bool, 'included')
@pytest.mark.datafiles(DATA_DIR)
def test_include_junction_options(cli, datafiles):
project = os.path.join(str(datafiles), 'options')
result = cli.run(project=project, args=[
'-o', 'build_arch', 'x86_64',
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'build_arch') == 'x86_64'
@pytest.mark.datafiles(DATA_DIR)
def test_junction_element_partial_project_project(cli, tmpdir, datafiles):
"""
Junction elements never depend on fully include processed project.
"""
project = os.path.join(str(datafiles), 'junction')
subproject_path = os.path.join(project, 'subproject')
junction_path = os.path.join(project, 'junction.bst')
repo = create_repo('git', str(tmpdir))
ref = repo.create(subproject_path)
element = {
'kind': 'junction',
'sources': [
repo.source_config(ref=ref)
]
}
_yaml.dump(element, junction_path)
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'junction.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'included', default_value=None) is None
@pytest.mark.datafiles(DATA_DIR)
def test_junction_element_not_partial_project_file(cli, tmpdir, datafiles):
"""
Junction elements never depend on fully include processed project.
"""
project = os.path.join(str(datafiles), 'file_with_subproject')
subproject_path = os.path.join(project, 'subproject')
junction_path = os.path.join(project, 'junction.bst')
repo = create_repo('git', str(tmpdir))
ref = repo.create(subproject_path)
element = {
'kind': 'junction',
'sources': [
repo.source_config(ref=ref)
]
}
_yaml.dump(element, junction_path)
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'junction.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'included', default_value=None) is not None
@pytest.mark.datafiles(DATA_DIR)
def test_include_element_overrides(cli, datafiles):
project = os.path.join(str(datafiles), 'overrides')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'manual_main_override', default_value=None) is not None
assert _yaml.node_get(loaded, str, 'manual_included_override', default_value=None) is not None
@pytest.mark.datafiles(DATA_DIR)
def test_include_element_overrides_composition(cli, datafiles):
project = os.path.join(str(datafiles), 'overrides')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{config}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, list, 'build-commands') == ['first', 'second']
@pytest.mark.datafiles(DATA_DIR)
def test_list_overide_does_not_fail_upon_first_composition(cli, datafiles):
project = os.path.join(str(datafiles), 'eventual_overrides')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{public}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
# Assert that the explicitly overwritten public data is present
bst = _yaml.node_get(loaded, dict, 'bst')
assert 'foo-commands' in bst
assert _yaml.node_get(bst, list, 'foo-commands') == ['need', 'this']
@pytest.mark.datafiles(DATA_DIR)
def test_include_element_overrides_sub_include(cli, datafiles):
project = os.path.join(str(datafiles), 'sub-include')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'included', default_value=None) is not None
@pytest.mark.datafiles(DATA_DIR)
def test_junction_do_not_use_included_overrides(cli, tmpdir, datafiles):
project = os.path.join(str(datafiles), 'overrides-junction')
generate_junction(tmpdir,
os.path.join(project, 'subproject'),
os.path.join(project, 'junction.bst'),
store_ref=True)
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'junction.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'main_override', default_value=None) is not None
assert _yaml.node_get(loaded, str, 'included_override', default_value=None) is None
@pytest.mark.datafiles(DATA_DIR)
def test_conditional_in_fragment(cli, datafiles):
project = os.path.join(str(datafiles), 'conditional')
result = cli.run(project=project, args=[
'-o', 'build_arch', 'x86_64',
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'size') == '8'
@pytest.mark.datafiles(DATA_DIR)
def test_inner(cli, datafiles):
project = os.path.join(str(datafiles), 'inner')
result = cli.run(project=project, args=[
'-o', 'build_arch', 'x86_64',
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, str, 'build_arch') == 'x86_64'
@pytest.mark.datafiles(DATA_DIR)
def test_recursive_include(cli, datafiles):
project = os.path.join(str(datafiles), 'recursive')
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_main_error(ErrorDomain.LOAD, LoadErrorReason.RECURSIVE_INCLUDE)
assert 'line 2 column 2' in result.stderr
@pytest.mark.datafiles(DATA_DIR)
def test_local_to_junction(cli, tmpdir, datafiles):
project = os.path.join(str(datafiles), 'local_to_junction')
generate_junction(tmpdir,
os.path.join(project, 'subproject'),
os.path.join(project, 'junction.bst'),
store_ref=True)
result = cli.run(project=project, args=[
'show',
'--deps', 'none',
'--format', '%{vars}',
'element.bst'])
result.assert_success()
loaded = _yaml.load_data(result.output)
assert _yaml.node_get(loaded, bool, 'included')