155 lines
4.8 KiB
Python
155 lines
4.8 KiB
Python
# Copyright 2023 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import fnmatch
|
|
import pytest
|
|
import sys
|
|
|
|
import pmb_test # noqa
|
|
import pmb.build
|
|
import pmb.chroot.apk
|
|
|
|
|
|
@pytest.fixture
|
|
def args(tmpdir, request):
|
|
import pmb.parse
|
|
sys.argv = ["pmbootstrap.py", "init"]
|
|
args = pmb.parse.arguments()
|
|
args.log = args.work + "/log_testsuite.txt"
|
|
pmb.helpers.logging.init(args)
|
|
request.addfinalizer(pmb.helpers.logging.logfd.close)
|
|
return args
|
|
|
|
|
|
def test_install_build(monkeypatch, args):
|
|
func = pmb.chroot.apk.install_build
|
|
ret_apkindex_package = None
|
|
|
|
def fake_build_package(args, package, arch):
|
|
return "build-pkg"
|
|
monkeypatch.setattr(pmb.build, "package", fake_build_package)
|
|
|
|
def fake_apkindex_package(args, package, arch, must_exist):
|
|
return ret_apkindex_package
|
|
monkeypatch.setattr(pmb.parse.apkindex, "package", fake_apkindex_package)
|
|
|
|
package = "hello-world"
|
|
arch = "x86_64"
|
|
|
|
# invoked as pmb install, build_pkgs_on_install disabled
|
|
args.action = "install"
|
|
args.build_pkgs_on_install = False
|
|
with pytest.raises(RuntimeError) as e:
|
|
func(args, package, arch)
|
|
assert "no binary package found" in str(e.value)
|
|
|
|
# invoked as pmb install, build_pkgs_on_install disabled, binary exists
|
|
args.action = "install"
|
|
args.build_pkgs_on_install = False
|
|
ret_apkindex_package = {"pkgname": "hello-world"}
|
|
assert func(args, package, arch) is None
|
|
|
|
# invoked as pmb install, build_pkgs_on_install enabled
|
|
args.action = "install"
|
|
args.build_pkgs_on_install = True
|
|
assert func(args, package, arch) == "build-pkg"
|
|
|
|
# invoked as not pmb install
|
|
args.action = "chroot"
|
|
args.build_pkgs_on_install = False
|
|
assert func(args, package, arch) == "build-pkg"
|
|
|
|
|
|
def test_packages_split_to_add_del():
|
|
packages = ["hello", "!test", "hello2", "test2", "!test3"]
|
|
|
|
to_add, to_del = pmb.chroot.apk.packages_split_to_add_del(packages)
|
|
assert to_add == ["hello", "hello2", "test2"]
|
|
assert to_del == ["test", "test3"]
|
|
|
|
|
|
def test_packages_get_locally_built_apks(monkeypatch, args):
|
|
args.assume_yes = True
|
|
|
|
arch = pmb.config.arch_native
|
|
packages = ["hello-world", # will exist in repo and locally
|
|
"postmarketos-base", # will exist in repo only
|
|
"package-that-does-not-exist"] # will not exist at all
|
|
|
|
pmb.chroot.zap(args, pkgs_local=True)
|
|
pmb.build.package(args, "hello-world", force=True)
|
|
|
|
ret = pmb.chroot.apk.packages_get_locally_built_apks(args, packages, arch)
|
|
assert len(ret) == 1
|
|
assert fnmatch.fnmatch(ret[0], "*/hello-world-*.apk")
|
|
|
|
|
|
def test_install_run_apk(monkeypatch, args):
|
|
global cmds_progress
|
|
global cmds
|
|
|
|
func = pmb.chroot.apk.install_run_apk
|
|
suffix = "chroot_native"
|
|
|
|
def fake_chroot_root(args, command, suffix):
|
|
global cmds
|
|
cmds += [command]
|
|
monkeypatch.setattr(pmb.chroot, "root", fake_chroot_root)
|
|
|
|
def fake_apk_progress(args, command, chroot, suffix):
|
|
global cmds_progress
|
|
cmds_progress += [command]
|
|
monkeypatch.setattr(pmb.helpers.apk, "apk_with_progress", fake_apk_progress)
|
|
|
|
def reset_cmds():
|
|
global cmds_progress, cmds
|
|
cmds = []
|
|
cmds_progress = []
|
|
|
|
# Simple add
|
|
reset_cmds()
|
|
to_add = ["postmarketos-base", "device-ppp"]
|
|
to_add_local = []
|
|
to_del = []
|
|
func(args, to_add, to_add_local, to_del, suffix)
|
|
assert cmds_progress == [["apk", "add", "postmarketos-base", "device-ppp"]]
|
|
assert cmds == []
|
|
|
|
# Add and delete
|
|
reset_cmds()
|
|
to_add = ["postmarketos-base", "device-ppp"]
|
|
to_add_local = []
|
|
to_del = ["osk-sdl"]
|
|
func(args, to_add, to_add_local, to_del, suffix)
|
|
assert cmds_progress == [["apk", "add", "postmarketos-base", "device-ppp"]]
|
|
assert cmds == [["apk", "--no-progress", "del", "osk-sdl"]]
|
|
|
|
# Add with local package
|
|
reset_cmds()
|
|
to_add = ["postmarketos-base", "device-ppp"]
|
|
to_add_local = ["/tmp/device-ppp.apk"]
|
|
to_del = []
|
|
func(args, to_add, to_add_local, to_del, suffix)
|
|
assert cmds_progress == [["apk", "add", "postmarketos-base", "device-ppp"]]
|
|
assert cmds == [["apk", "--no-progress", "add", "-u", "--virtual",
|
|
".pmbootstrap", "/tmp/device-ppp.apk"],
|
|
["apk", "--no-progress", "del", ".pmbootstrap"]]
|
|
|
|
# Add with --no-network
|
|
reset_cmds()
|
|
args.offline = True
|
|
to_add = ["hello-world"]
|
|
to_add_local = []
|
|
to_del = []
|
|
func(args, to_add, to_add_local, to_del, suffix)
|
|
assert cmds_progress == [["apk", "--no-network", "add", "hello-world"]]
|
|
assert cmds == []
|
|
|
|
# Package name starting with '-'
|
|
reset_cmds()
|
|
to_add = ["hello-world", "--allow-untrusted"]
|
|
to_add_local = []
|
|
to_del = []
|
|
with pytest.raises(ValueError) as e:
|
|
func(args, to_add, to_add_local, to_del, suffix)
|
|
assert "Invalid package name" in str(e.value)
|