kupferbootstrap/tests/test_integration.py
2025-03-30 15:20:30 +02:00

164 lines
4.6 KiB
Python

import click
import os
import pytest
from glob import glob
from subprocess import CompletedProcess
from kupferbootstrap.config.state import config, CONFIG_DEFAULTS
from kupferbootstrap.constants import SRCINFO_METADATA_FILE
from kupferbootstrap.exec.cmd import run_cmd
from kupferbootstrap.exec.file import get_temp_dir
from kupferbootstrap.logger import setup_logging
from kupferbootstrap.packages.cli import (
SRCINFO_CACHE_FILES,
cmd_build,
cmd_clean,
cmd_init,
cmd_update,
)
from kupferbootstrap.utils import git_get_branch
tempdir = None
config.try_load_file()
setup_logging(True)
PKG_TEST_PATH = "device/device-sdm845-oneplus-enchilada"
PKG_TEST_NAME = "device-sdm845-xiaomi-beryllium-ebbg"
INTEGRATION_TESTS_ENABLE_ENV_VAR = "INTEGRATION_TESTS_ENABLE"
integration_enabled = False
try:
integration_enabled = bool(
int(os.environ.get(INTEGRATION_TESTS_ENABLE_ENV_VAR, 0)) > 0
)
except Exception:
pass
pytestmark = [
pytest.mark.skipif(
condition=not integration_enabled,
reason=(
"Integration tests disabled by default, "
f"set env var {INTEGRATION_TESTS_ENABLE_ENV_VAR}=1 to enable."
),
),
pytest.mark.integration(),
pytest.mark.order("first"),
]
@pytest.fixture()
def ctx() -> click.Context:
global tempdir
if not tempdir:
tempdir = get_temp_dir()
if (
not os.environ.get(
"INTEGRATION_TESTS_USE_GLOBAL_CONFIG", "false"
).lower()
== "true"
):
config.file.paths.update(
CONFIG_DEFAULTS.paths | {"cache_dir": tempdir}
)
config_path = os.path.join(tempdir, "kupferbootstrap.toml")
config.runtime.config_file = config_path
if not os.path.exists(config_path):
config.write()
config.try_load_file(config_path)
print(f"cache_dir: {config.file.paths.cache_dir}")
return click.Context(click.Command("integration_tests"))
def test_main_import():
from kupferbootstrap.main import cli
assert cli
def test_config_load(ctx: click.Context):
path = config.runtime.config_file
assert path
assert path.startswith("/tmp/")
assert os.path.exists(path)
config.enforce_config_loaded()
def test_packages_update(ctx: click.Context):
pkgbuilds_path = config.get_path("pkgbuilds")
assert config.runtime.script_source_dir
kbs_branch = git_get_branch(
os.path.join(config.runtime.script_source_dir, "../..")
)
# Gitlab CI integration: the CI checks out a detached commit, branch comes back empty.
if not kbs_branch and os.environ.get("CI", "false") == "true":
kbs_branch = os.environ.get("CI_COMMIT_BRANCH", "")
branches: dict[str, bool] = {"main": False, "dev": False}
if kbs_branch:
branches[kbs_branch] = True
for branch, may_fail in branches.items():
config.file.pkgbuilds.git_branch = branch
try:
ctx.invoke(
cmd_init,
update=True,
non_interactive=True,
switch_branch=True,
discard_changes=True,
init_caches=False,
)
except Exception as ex:
print(f"may_fail: {may_fail}; Exception: {ex}")
if not may_fail:
raise ex
# check branch really doesn't exist
res = run_cmd(
f"git ls-remote {CONFIG_DEFAULTS.pkgbuilds.git_repo} 'refs/heads/*' | grep 'refs/heads/{branch}'"
)
assert isinstance(res, CompletedProcess)
assert res.returncode != 0
continue
assert git_get_branch(pkgbuilds_path) == branch
def test_packages_clean(ctx: click.Context):
if not glob(
os.path.join(
config.get_path("pkgbuilds"), "*", "*", SRCINFO_METADATA_FILE
)
):
ctx.invoke(cmd_update, non_interactive=True)
ctx.invoke(cmd_clean, what=["git"], force=True)
def test_packages_cache_init(ctx: click.Context):
ctx.invoke(
cmd_update,
non_interactive=True,
switch_branch=False,
discard_changes=False,
init_caches=True,
)
for f in SRCINFO_CACHE_FILES:
assert os.path.exists(
os.path.join(config.get_path("pkgbuilds"), PKG_TEST_PATH, f)
)
def build_pkgs(
_ctx: click.Context, query: list[str], arch: str = "aarch64", **kwargs
):
_ctx.invoke(cmd_build, paths=query, arch=arch, **kwargs)
def test_packages_build_by_path(ctx: click.Context):
build_pkgs(ctx, [PKG_TEST_PATH], force=True)
def test_split_package_build_by_name(ctx: click.Context):
build_pkgs(ctx, [PKG_TEST_NAME])