blob: 3d9e57154837e193b00be9e66333218f3664e6f0 [file] [log] [blame]
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name
import os
import tarfile
import pytest
from buildstream._testing import cli # pylint: disable=unused-import
from buildstream import utils, _yaml
# 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)
@pytest.mark.parametrize(
"with_workspace,guess_element",
[(True, True), (True, False), (False, False)],
ids=["workspace-guess", "workspace-no-guess", "no-workspace-no-guess"],
)
def test_source_checkout(datafiles, cli, tmpdir_factory, with_workspace, guess_element):
tmpdir = tmpdir_factory.mktemp(os.path.basename(__file__))
project = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
target = "checkout-deps.bst"
workspace = os.path.join(str(tmpdir), "workspace")
elm_cmd = [target] if not guess_element else []
if with_workspace:
ws_cmd = ["-C", workspace]
result = cli.run(project=project, args=["workspace", "open", "--directory", workspace, target])
result.assert_success()
else:
ws_cmd = []
args = ws_cmd + ["source", "checkout", "--deps", "none", "--directory", checkout, *elm_cmd]
result = cli.run(project=project, args=args)
result.assert_success()
assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("force_flag", ["--force", "-f"])
def test_source_checkout_force(datafiles, cli, force_flag):
project = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
target = "checkout-deps.bst"
# Make the checkout directory with 'some-thing' inside it
os.makedirs(os.path.join(checkout, "some-thing"))
result = cli.run(
project=project, args=["source", "checkout", force_flag, "--deps", "none", "--directory", checkout, target]
)
result.assert_success()
assert os.path.exists(os.path.join(checkout, "checkout-deps", "etc", "buildstream", "config"))
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_tar(datafiles, cli):
project = str(datafiles)
tar = os.path.join(cli.directory, "source-checkout.tar")
target = "checkout-deps.bst"
result = cli.run(project=project, args=["source", "checkout", "--tar", tar, "--deps", "none", target])
result.assert_success()
assert os.path.exists(tar)
with tarfile.open(tar) as tf:
expected_content = os.path.join(tar, "checkout-deps", "etc", "buildstream", "config")
tar_members = [f.name for f in tf]
for member in tar_members:
assert member in expected_content
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("compression", [("gz"), ("xz"), ("bz2")])
def test_source_checkout_compressed_tar(datafiles, cli, compression):
project = str(datafiles)
tarfile_name = "source-checkout.tar" + compression
tar = os.path.join(cli.directory, tarfile_name)
target = "checkout-deps.bst"
result = cli.run(
project=project,
args=["source", "checkout", "--tar", tar, "--compression", compression, "--deps", "none", target],
)
result.assert_success()
with tarfile.open(name=tar, mode="r:" + compression) as tar:
assert os.path.join("checkout-deps", "etc", "buildstream", "config") in tar.getnames()
@pytest.mark.datafiles(DATA_DIR)
@pytest.mark.parametrize("deps", [("build"), ("none"), ("run"), ("all")])
def test_source_checkout_deps(datafiles, cli, deps):
project = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
target = "checkout-deps.bst"
result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, "--deps", deps, target])
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 = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
target = "checkout-deps.bst"
result = cli.run(
project=project,
args=["source", "checkout", "--directory", checkout, "--deps", "all", "--except", "import-bin.bst", target],
)
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)
def test_source_checkout_fetch(datafiles, cli):
project = str(datafiles)
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.roundtrip_dump(element, target_path)
# Testing implicit fetching requires that we do not have the sources
# cached already
assert cli.get_element_state(project, target) == "fetch needed"
args = ["source", "checkout"]
args += [target, checkout]
result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, target])
result.assert_success()
assert os.path.exists(os.path.join(checkout, "remote-import-dev", "pony.h"))
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_build_scripts(cli, tmpdir, datafiles):
project_path = str(datafiles)
element_name = "source-bundle/source-bundle-hello.bst"
normal_name = "source-bundle-source-bundle-hello"
checkout = os.path.join(str(tmpdir), "source-checkout")
args = ["source", "checkout", "--include-build-scripts", "--directory", checkout, element_name]
result = cli.run(project=project_path, args=args)
result.assert_success()
# There sould be a script for each element (just one in this case) and a top level build script
expected_scripts = ["build.sh", "build-" + normal_name]
for script in expected_scripts:
assert script in os.listdir(checkout)
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_tar_buildscripts(cli, tmpdir, datafiles):
project_path = str(datafiles)
element_name = "source-bundle/source-bundle-hello.bst"
normal_name = "source-bundle-source-bundle-hello"
tar_file = os.path.join(str(tmpdir), "source-checkout.tar")
args = ["source", "checkout", "--include-build-scripts", "--tar", tar_file, element_name]
result = cli.run(project=project_path, args=args)
result.assert_success()
expected_scripts = ["build.sh", "build-" + normal_name]
with tarfile.open(tar_file, "r") as tf:
for script in expected_scripts:
assert script in tf.getnames()
# Test that the --directory and --tar options conflict
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_options_tar_and_dir_conflict(cli, tmpdir, datafiles):
project = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
tar_file = os.path.join(str(tmpdir), "source-checkout.tar")
target = "checkout-deps.bst"
result = cli.run(project=project, args=["source", "checkout", "--directory", checkout, "--tar", tar_file, target])
assert result.exit_code != 0
assert "ERROR: options --directory and --tar conflict" in result.stderr
# Test that the --compression option without --tar fails
@pytest.mark.datafiles(DATA_DIR)
def test_source_checkout_compression_without_tar(cli, tmpdir, datafiles):
project = str(datafiles)
checkout = os.path.join(cli.directory, "source-checkout")
target = "checkout-deps.bst"
result = cli.run(
project=project, args=["source", "checkout", "--directory", checkout, "--compression", "xz", target]
)
assert result.exit_code != 0
assert "ERROR: --compression specified without --tar" in result.stderr