blob: af144f6344b0a893eacae1152b394dd14f9844d8 [file] [log] [blame]
import os
import pytest
from tests.testutils import cli
from buildstream import utils, _yaml
from buildstream._exceptions import ErrorDomain, LoadErrorReason
# Project directory
DATA_DIR = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'project',
)
def generate_remote_import_element(input_path, output_path):
return {
'kind': 'import',
'sources': [
{
'kind': 'remote',
'url': 'file://{}'.format(input_path),
'filename': output_path,
'ref': utils.sha256sum(input_path),
}
]
}
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout(datafiles, cli):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkout = os.path.join(cli.directory, 'source-checkout')
target = 'checkout-deps.bst'
result = cli.run(project=project, args=['source-checkout', target, '--deps', 'none', checkout])
result.assert_success()
assert os.path.exists(os.path.join(checkout, 'checkout-deps', 'etc', 'buildstream', 'config'))
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize('deps', [('build'), ('none'), ('run'), ('all')])
def test_source_checkout_deps(datafiles, cli, deps):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkout = os.path.join(cli.directory, 'source-checkout')
target = 'checkout-deps.bst'
result = cli.run(project=project, args=['source-checkout', target, '--deps', deps, checkout])
result.assert_success()
# Sources of the target
if deps == 'build':
assert not os.path.exists(os.path.join(checkout, 'checkout-deps'))
else:
assert os.path.exists(os.path.join(checkout, 'checkout-deps', 'etc', 'buildstream', 'config'))
# Sources of the target's build dependencies
if deps in ('build', 'all'):
assert os.path.exists(os.path.join(checkout, 'import-dev', 'usr', 'include', 'pony.h'))
else:
assert not os.path.exists(os.path.join(checkout, 'import-dev'))
# Sources of the target's runtime dependencies
if deps in ('run', 'all'):
assert os.path.exists(os.path.join(checkout, 'import-bin', 'usr', 'bin', 'hello'))
else:
assert not os.path.exists(os.path.join(checkout, 'import-bin'))
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_except(datafiles, cli):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkout = os.path.join(cli.directory, 'source-checkout')
target = 'checkout-deps.bst'
result = cli.run(project=project, args=['source-checkout', target,
'--deps', 'all',
'--except', 'import-bin.bst',
checkout])
result.assert_success()
# Sources for the target should be present
assert os.path.exists(os.path.join(checkout, 'checkout-deps', 'etc', 'buildstream', 'config'))
# Sources for import-bin.bst should not be present
assert not os.path.exists(os.path.join(checkout, 'import-bin'))
# Sources for other dependencies should be present
assert os.path.exists(os.path.join(checkout, 'import-dev', 'usr', 'include', 'pony.h'))
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize('no_fetch', [(False), (True)])
def test_source_checkout_fetch(datafiles, cli, no_fetch):
project = os.path.join(datafiles.dirname, datafiles.basename)
checkout = os.path.join(cli.directory, 'source-checkout')
target = 'remote-import-dev.bst'
target_path = os.path.join(project, 'elements', target)
# Create an element with remote source
element = generate_remote_import_element(
os.path.join(project, 'files', 'dev-files', 'usr', 'include', 'pony.h'),
'pony.h')
_yaml.dump(element, target_path)
# Testing --no-fetch option requires that we do not have the sources
# cached already
assert cli.get_element_state(project, target) == 'fetch needed'
args = ['source-checkout']
if no_fetch:
args += ['--no-fetch']
args += [target, checkout]
result = cli.run(project=project, args=args)
if no_fetch:
result.assert_main_error(ErrorDomain.PIPELINE, 'uncached-sources')
else:
result.assert_success()
assert os.path.exists(os.path.join(checkout, 'remote-import-dev', 'pony.h'))