WIP: test: type annotate suffix + pathlib (MR 2252)

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
This commit is contained in:
Caleb Connolly 2024-03-13 02:31:01 +00:00 committed by Oliver Smith
parent 9301412f90
commit 3bfc6474bb
No known key found for this signature in database
GPG key ID: 5AE7F5513E0885CB
38 changed files with 164 additions and 128 deletions

View file

@ -3,6 +3,7 @@
""" Common code for git tests """
import os
from pmb.core.types import PmbArgs
import pmb.helpers.git
import pmb.helpers.run
import shutil

View file

@ -7,7 +7,7 @@ import sys
import pmb_test # noqa
import pmb.build
import pmb.chroot.apk
from pmb.core import Suffix
from pmb.core import Chroot
@pytest.fixture
@ -15,7 +15,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -89,7 +89,7 @@ def test_install_run_apk(monkeypatch, args):
global cmds
func = pmb.chroot.apk.install_run_apk
suffix = Suffix.native()
suffix = Chroot.native()
def fake_chroot_root(args: PmbArgs, command, suffix):
global cmds

View file

@ -12,6 +12,7 @@ import pmb.chroot.apk_static
import pmb.config
import pmb.parse.apkindex
import pmb.helpers.logging
from pmb.core.types import PmbArgs
@pytest.fixture
@ -19,16 +20,16 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_read_signature_info(args):
def test_read_signature_info(args: PmbArgs):
# Tempfolder inside chroot for fake apk files
tmp_path = "/tmp/test_read_signature_info"
tmp_path_outside = args.work + "/chroot_native" + tmp_path
tmp_path_outside = pmb.config.work / "chroot_native" + tmp_path
if os.path.exists(tmp_path_outside):
pmb.chroot.root(args, ["rm", "-r", tmp_path])
pmb.chroot.user(args, ["mkdir", "-p", tmp_path])
@ -74,17 +75,17 @@ def test_read_signature_info(args):
def test_successful_extraction(args: PmbArgs, tmpdir):
if os.path.exists(args.work + "/apk.static"):
os.remove(args.work + "/apk.static")
if os.path.exists(pmb.config.work / "apk.static"):
os.remove(pmb.config.work / "apk.static")
pmb.chroot.apk_static.init(args)
assert os.path.exists(args.work + "/apk.static")
os.remove(args.work + "/apk.static")
assert os.path.exists(pmb.config.work / "apk.static")
os.remove(pmb.config.work / "apk.static")
def test_signature_verification(args: PmbArgs, tmpdir):
if os.path.exists(args.work + "/apk.static"):
os.remove(args.work + "/apk.static")
if os.path.exists(pmb.config.work / "apk.static"):
os.remove(pmb.config.work / "apk.static")
version = pmb.parse.apkindex.package(args, "apk-tools-static")["version"]
apk_path = pmb.chroot.apk_static.download(
@ -117,8 +118,8 @@ def test_signature_verification(args: PmbArgs, tmpdir):
def test_outdated_version(args: PmbArgs, monkeypatch):
if os.path.exists(args.work + "/apk.static"):
os.remove(args.work + "/apk.static")
if os.path.exists(pmb.config.work / "apk.static"):
os.remove(pmb.config.work / "apk.static")
# Change min version for all branches
min_copy = copy.copy(pmb.config.apk_tools_min_version)

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import os
import sys
from pmb.core.types import PmbArgs
import pytest
import shutil
import filecmp
@ -21,7 +22,7 @@ def args(tmpdir, request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
args.fork_alpine = False
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
@ -84,7 +85,7 @@ def test_aportgen(args: PmbArgs, tmpdir):
os.mkdir(tmpdir + "/cross")
# Create aportgen folder -> code path where it still exists
pmb.helpers.run.user(args, ["mkdir", "-p", args.work + "/aportgen"])
pmb.helpers.run.user(args, ["mkdir", "-p", pmb.config.work / "aportgen"])
# Generate all valid packages (gcc twice -> different code path)
pkgnames = ["musl-armv7",
@ -95,7 +96,7 @@ def test_aportgen(args: PmbArgs, tmpdir):
pmb.aportgen.generate(args, pkgname)
def test_aportgen_invalid_generator(args):
def test_aportgen_invalid_generator(args: PmbArgs):
with pytest.raises(ValueError) as e:
pmb.aportgen.generate(args, "pkgname-with-no-generator")
assert "No generator available" in str(e.value)
@ -115,7 +116,7 @@ def test_aportgen_get_upstream_aport(args: PmbArgs, monkeypatch):
# Equal version
func = pmb.aportgen.core.get_upstream_aport
upstream = "gcc"
upstream_full = args.work + "/cache_git/aports_upstream/main/" + upstream
upstream_full = pmb.config.work / "cache_git/aports_upstream/main/" + upstream
apkbuild = {"pkgver": "2.0", "pkgrel": "0"}
package = {"version": "2.0-r0"}
assert func(args, upstream) == upstream_full

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import logging
from pmb.core.types import PmbArgs
import pytest
import sys
import shutil
@ -20,7 +21,7 @@ def args(tmpdir, request):
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "build", "-i",
"device-testsuite-testdevice"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)

View file

@ -16,32 +16,32 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_bootimg_invalid_path(args):
def test_bootimg_invalid_path(args: PmbArgs):
with pytest.raises(RuntimeError) as e:
pmb.parse.bootimg(args, "/invalid-path")
assert "Could not find file" in str(e.value)
def test_bootimg_kernel(args):
def test_bootimg_kernel(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/kernel-boot.img"
with pytest.raises(RuntimeError) as e:
pmb.parse.bootimg(args, path)
assert "heimdall-isorec" in str(e.value)
def test_bootimg_invalid_file(args):
def test_bootimg_invalid_file(args: PmbArgs):
with pytest.raises(RuntimeError) as e:
pmb.parse.bootimg(args, __file__)
assert "File is not an Android boot.img" in str(e.value)
def test_bootimg_normal(args):
def test_bootimg_normal(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/normal-boot.img"
output = {"header_version": "0",
"base": "0x80000000",
@ -56,7 +56,7 @@ def test_bootimg_normal(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_qcdt(args):
def test_bootimg_qcdt(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/qcdt-boot.img"
output = {"base": "0x80000000",
"kernel_offset": "0x00008000",
@ -70,7 +70,7 @@ def test_bootimg_qcdt(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_mtk(args):
def test_bootimg_mtk(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/mtk-boot.img"
output = {"header_version": "0",
"base": "0x10000000",
@ -87,7 +87,7 @@ def test_bootimg_mtk(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_mtk_recovery(args):
def test_bootimg_mtk_recovery(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/mtk-boot-recovery.img"
output = {"header_version": "0",
"base": "0x80000000",
@ -104,7 +104,7 @@ def test_bootimg_mtk_recovery(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_mtk_kernelonly(args):
def test_bootimg_mtk_kernelonly(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/mtk-boot-kernel-only.img"
output = {"header_version": "0",
"base": "0x10000000",
@ -120,7 +120,7 @@ def test_bootimg_mtk_kernelonly(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_dtb_second(args):
def test_bootimg_dtb_second(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/dtb-second-boot.img"
output = {"header_version": "0",
"base": "0x00000000",
@ -135,7 +135,7 @@ def test_bootimg_dtb_second(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_v2(args):
def test_bootimg_v2(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/boot-header-v2.img"
output = {"header_version": "2",
"base": "0x40078000",
@ -151,7 +151,7 @@ def test_bootimg_v2(args):
assert pmb.parse.bootimg(args, path) == output
def test_bootimg_v3(args):
def test_bootimg_v3(args: PmbArgs):
path = pmb_test.const.testdata + "/bootimg/boot-header-v3.img"
output = {"header_version": "3",
"pagesize": "4096",

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import os
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa
@ -14,7 +15,7 @@ def args(request, tmpdir):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
@ -41,7 +42,7 @@ def cache_apkindex(version):
providers["hello-world"]["version"] = version
def test_build_is_necessary(args):
def test_build_is_necessary(args: PmbArgs):
# Prepare APKBUILD and APKINDEX data
aport = pmb.helpers.pmaports.find(args, "hello-world")
apkbuild = pmb.parse.apkbuild(f"{aport}/APKBUILD")
@ -66,7 +67,7 @@ def test_build_is_necessary(args):
assert pmb.build.is_necessary(args, None, apkbuild, indexes) is False
def test_build_is_necessary_no_binary_available(args):
def test_build_is_necessary_no_binary_available(args: PmbArgs):
"""
APKINDEX cache is set up to fake an empty APKINDEX, which means that the
hello-world package has not been built yet.
@ -77,7 +78,7 @@ def test_build_is_necessary_no_binary_available(args):
assert pmb.build.is_necessary(args, None, apkbuild, indexes) is True
def test_build_is_necessary_cant_build_pmaport_for_arch(args):
def test_build_is_necessary_cant_build_pmaport_for_arch(args: PmbArgs):
""" pmaport version is higher than Alpine's binary package, but pmaport
can't be built for given arch. (#1897) """

View file

@ -4,6 +4,7 @@
import datetime
import glob
import os
from pmb.core.types import PmbArgs
import pytest
import shutil
import sys
@ -22,7 +23,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -57,7 +58,7 @@ def args_patched(monkeypatch, argv):
return pmb.parse.arguments()
def test_skip_already_built(args):
def test_skip_already_built(args: PmbArgs):
func = pmb.build._package.skip_already_built
assert pmb.helpers.other.cache["built"] == {}
assert func("test-package", "armhf") is False
@ -65,7 +66,7 @@ def test_skip_already_built(args):
assert func("test-package", "armhf") is True
def test_get_apkbuild(args):
def test_get_apkbuild(args: PmbArgs):
func = pmb.build._package.get_apkbuild
# Valid aport
@ -314,7 +315,7 @@ def test_finish(args: PmbArgs, monkeypatch):
func(args, apkbuild, pmb.config.arch_native, output)
def test_package(args):
def test_package(args: PmbArgs):
# First build
assert pmb.build.package(args, "hello-world", force=True)
@ -352,8 +353,8 @@ def test_build_depends_high_level(args: PmbArgs, monkeypatch):
# Build hello-world to get its full output path
channel = pmb.config.pmaports.read_config(args)["channel"]
output_hello = pmb.build.package(args, "hello-world")
output_hello_outside = f"{args.work}/packages/{channel}/{output_hello}"
assert os.path.exists(output_hello_outside)
output_hello_outside = pmb.config.work / "packages" / channel / output_hello
assert output_hello_outside.exists()
# Make sure the wrapper exists
pmb.build.package(args, "hello-world-wrapper")

View file

@ -2,39 +2,40 @@
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb/chroot/mount.py """
import os
from pmb.core.types import PmbArgs
import pytest
import sys
import pmb_test # noqa
import pmb.chroot
from pmb.core import Chroot
@pytest.fixture
def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_chroot_mount(args):
suffix = "native"
mnt_dir = f"{args.work}/chroot_native/mnt/pmbootstrap"
def test_chroot_mount(args: PmbArgs):
chroot = Chroot.native()
mnt_dir = chroot / "mnt/pmbootstrap"
# Run something in the chroot to have the dirs created
pmb.chroot.root(args, ["true"])
assert os.path.exists(mnt_dir)
assert os.path.exists(f"{mnt_dir}/packages")
assert mnt_dir.exists()
assert (mnt_dir / "packages").exists()
# Umount everything, like in pmb.install.install_system_image
pmb.helpers.mount.umount_all(args, f"{args.work}/chroot_{suffix}")
pmb.helpers.mount.umount_all(args, chroot.path)
# Remove all /mnt/pmbootstrap dirs
pmb.chroot.remove_mnt_pmbootstrap(args, suffix)
assert not os.path.exists(mnt_dir)
pmb.chroot.remove_mnt_pmbootstrap(args, chroot)
assert not mnt_dir.exists()
# Run again: it should not crash
pmb.chroot.remove_mnt_pmbootstrap(args, suffix)
pmb.chroot.remove_mnt_pmbootstrap(args, chroot)

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb/config/pmaports.py """
from pmb.core.types import PmbArgs
import pytest
import sys
@ -18,7 +19,7 @@ def args(request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa
@ -17,7 +18,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb/config/workdir.py """
import os
from pmb.core.types import PmbArgs
import pytest
import sys
import time
@ -17,7 +18,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -42,7 +43,7 @@ def test_chroot_save_init(args: PmbArgs, tmpdir, monkeypatch):
"native = 1234567890\n\n"
"[chroot-channels]\n"
"native = v20.05\n\n")
with open(args.work + "/workdir.cfg", "r") as handle:
with open(pmb.config.work / "workdir.cfg", "r") as handle:
assert handle.read() == expected
# Write again (different code path)
@ -53,7 +54,7 @@ def test_chroot_save_init(args: PmbArgs, tmpdir, monkeypatch):
"[chroot-channels]\n"
"native = v20.05\n"
"buildroot_armhf = v20.05\n\n")
with open(args.work + "/workdir.cfg", "r") as handle:
with open(pmb.config.work / "workdir.cfg", "r") as handle:
assert handle.read() == expected
@ -70,12 +71,12 @@ def test_chroots_outdated(args: PmbArgs, tmpdir, monkeypatch):
assert func(args) is False
# workdir.cfg is empty file
with open(args.work + "/workdir.cfg", "w") as handle:
with open(pmb.config.work / "workdir.cfg", "w") as handle:
handle.write("")
assert func(args) is False
# Write fake workdir.cfg: native was created at "90"
with open(args.work + "/workdir.cfg", "w") as handle:
with open(pmb.config.work / "workdir.cfg", "w") as handle:
handle.write("[chroot-init-dates]\nnative = 90\n\n")
# Outdated (date_outdated: 90)
@ -131,21 +132,21 @@ def test_clean(args: PmbArgs, tmpdir):
# Write fake workdir.cfg
cfg_fake = "[chroot-init-dates]\nnative = 1337\n\n"
with open(args.work + "/workdir.cfg", "w") as handle:
with open(pmb.config.work / "workdir.cfg", "w") as handle:
handle.write(cfg_fake)
# 1. chroot_native dir exists
os.makedirs(args.work + "/chroot_native")
os.makedirs(pmb.config.work / "chroot_native")
assert func(args) is False
# workdir.cfg: unchanged
with open(args.work + "/workdir.cfg", "r") as handle:
with open(pmb.config.work / "workdir.cfg", "r") as handle:
assert handle.read() == cfg_fake
# 2. chroot_native dir does not exist
os.rmdir(args.work + "/chroot_native")
os.rmdir(pmb.config.work / "chroot_native")
assert func(args) is True
# workdir.cfg: "native" entry removed
with open(args.work + "/workdir.cfg", "r") as handle:
with open(pmb.config.work / "workdir.cfg", "r") as handle:
assert handle.read() == "[chroot-init-dates]\n\n"

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test
@ -18,13 +19,13 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_package_kernel_args(args):
def test_package_kernel_args(args: PmbArgs):
args.packages = ["package-one", "package-two"]
with pytest.raises(RuntimeError) as e:
pmb.build.envkernel.package_kernel(args)

View file

@ -3,6 +3,7 @@
import os
import sys
import time
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa
@ -16,7 +17,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import os
import sys
from pmb.core.types import PmbArgs
import pytest
import shutil
@ -19,13 +20,13 @@ def args(request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_get_path(args):
def test_get_path(args: PmbArgs):
func = pmb.helpers.git.get_path
args.work = "/wrk"
args.aports = "/tmp/pmaports"
@ -109,7 +110,7 @@ def test_get_upstream_remote(args: PmbArgs, monkeypatch, tmpdir):
assert func(args, name_repo) == "hello"
def test_parse_channels_cfg(args):
def test_parse_channels_cfg(args: PmbArgs):
exp = {"meta": {"recommended": "edge"},
"channels": {"edge": {"description": "Rolling release channel",
"branch_pmaports": "master",
@ -126,7 +127,7 @@ def test_parse_channels_cfg(args):
assert pmb.helpers.git.parse_channels_cfg(args) == exp
def test_pull_non_existing(args):
def test_pull_non_existing(args: PmbArgs):
assert pmb.helpers.git.pull(args, "non-existing-repo-name") == 1

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import os
from pmb.core.types import PmbArgs
import pytest
import shutil
import sys
@ -16,7 +17,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap", "lint"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa
@ -13,7 +14,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -78,7 +79,7 @@ def test_helpers_package_get_apkindex(args: PmbArgs, monkeypatch):
assert func(args, "testpkgname", "x86_64") == package
def test_helpers_package_depends_recurse(args):
def test_helpers_package_depends_recurse(args: PmbArgs):
""" Test pmb.helpers.package.depends_recurse() """
# Put fake data into the pmb.helpers.package.get() cache
@ -98,7 +99,7 @@ def test_helpers_package_depends_recurse(args):
assert func(args, "d", "armhf") == ["b", "d"]
def test_helpers_package_check_arch_package(args):
def test_helpers_package_check_arch_package(args: PmbArgs):
""" Test pmb.helpers.package.check_arch(): binary = True """
# Put fake data into the pmb.helpers.package.get() cache
func = pmb.helpers.package.check_arch

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import os
from pmb.core.types import PmbArgs
import pytest
import sys
@ -13,7 +14,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb.helpers.repo """
from pmb.core.types import PmbArgs
import pytest
import sys
@ -15,7 +16,7 @@ def args(tmpdir, request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -27,10 +28,10 @@ def test_hash():
assert pmb.helpers.repo.hash(url, 8) == hash
def test_alpine_apkindex_path(args):
def test_alpine_apkindex_path(args: PmbArgs):
func = pmb.helpers.repo.alpine_apkindex_path
args.mirror_alpine = "http://dl-cdn.alpinelinux.org/alpine/"
ret = args.work + "/cache_apk_armhf/APKINDEX.30e6f5af.tar.gz"
ret = pmb.config.work / "cache_apk_armhf/APKINDEX.30e6f5af.tar.gz"
assert func(args, "testing", "armhf") == ret

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pmb.core.types import PmbArgs
import pytest
import sys
@ -12,13 +13,13 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_filter_missing_packages_invalid(args):
def test_filter_missing_packages_invalid(args: PmbArgs):
""" Test ...repo_missing.filter_missing_packages(): invalid package """
func = pmb.helpers.repo_missing.filter_missing_packages
with pytest.raises(RuntimeError) as e:
@ -26,7 +27,7 @@ def test_filter_missing_packages_invalid(args):
assert str(e.value).startswith("Could not find aport")
def test_filter_missing_packages_binary_exists(args):
def test_filter_missing_packages_binary_exists(args: PmbArgs):
""" Test ...repo_missing.filter_missing_packages(): binary exists """
func = pmb.helpers.repo_missing.filter_missing_packages
assert func(args, "armhf", ["busybox"]) == []
@ -48,7 +49,7 @@ def test_filter_missing_packages_pmaports(args: PmbArgs, monkeypatch):
assert func(args, "x86_64", ["busybox", "hello-world"]) == []
def test_filter_aport_packages(args):
def test_filter_aport_packages(args: PmbArgs):
""" Test ...repo_missing.filter_aport_packages() """
func = pmb.helpers.repo_missing.filter_aport_packages
assert func(args, "armhf", ["busybox", "hello-world"]) == ["hello-world"]

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pmb.core.types import PmbArgs
import pytest
import sys
@ -15,13 +16,13 @@ def args(tmpdir, request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_helpers_ui(args):
def test_helpers_ui(args: PmbArgs):
""" Test the UIs returned by pmb.helpers.ui.list() with a testdata pmaports
dir. That test dir has a plasma-mobile UI, which is disabled for armhf,
so it must not be returned when querying the UI list for armhf. """

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pmb.core.types import PmbArgs
import pytest
import sys
import os
@ -12,7 +13,7 @@ import pmb.config
import pmb.config.init
import pmb.helpers.logging
import pmb.install._install
from pmb.core import Suffix, SuffixType
from pmb.core import Chroot, ChrootType
@pytest.fixture
@ -20,13 +21,13 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_get_nonfree_packages(args):
def test_get_nonfree_packages(args: PmbArgs):
args.aports = pmb_test.const.testdata + "/init_questions_device/aports"
func = pmb.install._install.get_nonfree_packages
@ -43,7 +44,7 @@ def test_get_nonfree_packages(args):
assert func(args, device) == ["device-" + device + "-nonfree-userland"]
def test_get_recommends(args):
def test_get_recommends(args: PmbArgs):
args.aports = pmb_test.const.testdata + "/pmb_recommends"
func = pmb.install._install.get_recommends
@ -74,7 +75,7 @@ def test_get_recommends(args):
assert func(args, ["test-app"]) == ["foot", "htop"]
def test_get_groups(args):
def test_get_groups(args: PmbArgs):
args.aports = f"{pmb_test.const.testdata}/pmb_groups"
func = pmb.install.ui.get_groups
@ -99,11 +100,11 @@ def test_get_groups(args):
assert str(e.value).startswith("Could not find aport for package")
def test_generate_binary_list(args):
suffix = Suffix(SuffixType.ROOTFS, "mysuffix")
def test_generate_binary_list(args: PmbArgs):
suffix = Chroot(ChrootType.ROOTFS, "mysuffix")
args.work = "/tmp"
func = pmb.install._install.generate_binary_list
binary_dir = os.path.join(args.work, f"{suffix.chroot()}", "usr/share")
binary_dir = suffix / "usr/share"
os.makedirs(binary_dir, exist_ok=True)
step = 1024
binaries = [f"{pmb_test.const.testdata}/pmb_install/small.bin",

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
import pmb_test # noqa
import pmb.helpers.mount
@ -14,12 +15,12 @@ def test_umount_all_list(tmpdir):
handle.write("source /test/proc\n")
handle.write("source /test/dev/loop0p2\\040(deleted)\n")
ret = pmb.helpers.mount.umount_all_list("/no/match", fake_mounts)
ret = pmb.helpers.mount.umount_all_list(Path("/no/match"), fake_mounts)
assert ret == []
ret = pmb.helpers.mount.umount_all_list("/test/var/cache", fake_mounts)
ret = pmb.helpers.mount.umount_all_list(Path("/test/var/cache"), fake_mounts)
assert ret == ["/test/var/cache"]
ret = pmb.helpers.mount.umount_all_list("/test", fake_mounts)
ret = pmb.helpers.mount.umount_all_list(Path("/test"), fake_mounts)
assert ret == ["/test/var/cache", "/test/proc", "/test/home/pmos/packages",
"/test/dev/loop0p2", "/test"]

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import glob
import os
from pmb.core.types import PmbArgs
import pytest
import shutil
import sys
@ -20,7 +21,7 @@ def args(tmpdir, request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pmb.core.types import PmbArgs
import pytest
import sys
@ -13,7 +14,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -55,7 +56,7 @@ def test_subpackages(args):
assert apkbuild["subpackages"]["invalid-function"] is None
def test_kernels(args):
def test_kernels(args: PmbArgs):
# Kernel hardcoded in depends
args.aports = pmb_test.const.testdata + "/init_questions_device/aports"
func = pmb.parse._apkbuild.kernels

View file

@ -3,6 +3,7 @@
""" Test pmb.parse.apkindex """
import collections
import os
from pmb.core.types import PmbArgs
import pytest
import sys
@ -17,7 +18,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -143,7 +144,7 @@ def test_parse_next_block_conflict():
assert start == [20]
def test_parse_add_block(args):
def test_parse_add_block(args: PmbArgs):
func = pmb.parse.apkindex.parse_add_block
multiple_providers = False
@ -170,7 +171,7 @@ def test_parse_add_block(args):
assert ret == {"test": block_new, "test_alias": block_new}
def test_parse_add_block_multiple_providers(args):
def test_parse_add_block_multiple_providers(args: PmbArgs):
func = pmb.parse.apkindex.parse_add_block
# One package without alias

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb.parse.depends """
import collections
from pmb.core.types import PmbArgs
import pytest
import sys
@ -17,13 +18,13 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_package_from_aports(args):
def test_package_from_aports(args: PmbArgs):
func = pmb.parse.depends.package_from_aports
assert func(args, "invalid-package") is None
assert func(args, "hello-world") == {"pkgname": "hello-world",

View file

@ -1,5 +1,6 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
from pmb.core.types import PmbArgs
import pytest
import sys
@ -12,13 +13,13 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_kernel_suffix(args):
def test_kernel_suffix(args: PmbArgs):
args.aports = pmb_test.const.testdata + "/deviceinfo/aports"
device = "multiple-kernels"

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb/parse/kconfig.py """
from pmb.core.types import PmbArgs
import pytest
import sys
import os
@ -17,7 +18,7 @@ def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "kconfig", "check"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -3,6 +3,7 @@
""" Test pmb.helper.pkgrel_bump """
import glob
import os
from pmb.core.types import PmbArgs
import pytest
import sys
@ -17,7 +18,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -72,7 +73,7 @@ def setup_work(args: PmbArgs, tmpdir):
pmb.helpers.run.user(args, ["./pmbootstrap.py", "shutdown"])
# Link everything from work (except for "packages") to the tmpdir
for path in glob.glob(args.work + "/*"):
for path in glob.glob(pmb.config.work / "*"):
if os.path.basename(path) != "packages":
pmb.helpers.run.user(args, ["ln", "-s", path, tmpdir + "/"])

View file

@ -3,6 +3,7 @@
""" Test preserving HTTP_PROXY and other proxy env vars with all pmbootstrap
run functions. """
import os
from pmb.core.types import PmbArgs
import pytest
import sys
@ -18,7 +19,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -7,6 +7,7 @@ via SSH if expected processes are running.
We use an extra config file (based on ~/.config/pmbootstrap.cfg), because we
need to change it a lot (e.g. UI, username, ...).
"""
from pmb.core.types import PmbArgs
import pytest
import sys
import shutil
@ -26,15 +27,15 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def ssh_create_askpass_script(args):
def ssh_create_askpass_script(args: PmbArgs):
"""Create /tmp/y.sh, which we need to automatically login via SSH."""
with open(args.work + "/chroot_native/tmp/y.sh", "w") as handle:
with open(pmb.config.work / "chroot_native/tmp/y.sh", "w") as handle:
handle.write("#!/bin/sh\necho y\n")
pmb.chroot.root(args, ["chmod", "+x", "/tmp/y.sh"])

View file

@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
import logging
import os
from pmb.core.types import PmbArgs
import pytest
import sys
@ -20,7 +21,7 @@ def args(tmpdir, request):
cfg = f"{pmb_test.const.testdata}/channels.cfg"
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
""" Test pmb.helpers.run_core """
from pmb.core.types import PmbArgs
import pytest
import re
import subprocess
@ -16,7 +17,7 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
@ -44,7 +45,7 @@ def test_sanity_checks():
assert str(e.value).startswith("Can't use output_return with")
def test_background(args):
def test_background(args: PmbArgs):
# Sleep in background
process = pmb.helpers.run_core.background(["sleep", "1"], "/")
@ -52,7 +53,7 @@ def test_background(args):
assert process.poll() is None
def test_pipe(args):
def test_pipe(args: PmbArgs):
# Sleep in background
process = pmb.helpers.run_core.pipe(["sleep", "1"], "/")
@ -66,7 +67,7 @@ def test_pipe(args):
assert process.communicate()[0].decode('utf-8') == "hello"
def test_foreground_pipe(args):
def test_foreground_pipe(args: PmbArgs):
func = pmb.helpers.run_core.foreground_pipe
cmd = ["echo", "test"]
@ -159,7 +160,7 @@ def test_core(args: PmbArgs, monkeypatch):
@pytest.mark.skip_ci
def test_sudo_timer(args):
def test_sudo_timer(args: PmbArgs):
pmb.helpers.run.root(args, ["whoami"])
time.sleep(300)

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test # noqa
@ -16,13 +17,13 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_shell_escape(args):
def test_shell_escape(args: PmbArgs):
cmds = {"test\n": ["echo", "test"],
"test && test\n": ["echo", "test", "&&", "test"],
"test ; test\n": ["echo", "test", ";", "test"],
@ -54,7 +55,7 @@ def test_shell_escape(args):
assert cmd == copy
def test_shell_escape_env(args):
def test_shell_escape_env(args: PmbArgs):
key = "PMBOOTSTRAP_TEST_ENVIRONMENT_VARIABLE"
value = "long value with spaces and special characters: '\"\\!$test"
env = {key: value}

View file

@ -1,6 +1,7 @@
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys
from pmb.core.types import PmbArgs
import pytest
import pmb_test
@ -15,13 +16,13 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_version(args):
def test_version(args: PmbArgs):
# Fail after the first error or print a grand total of failures
keep_going = False

View file

@ -4,6 +4,7 @@
# sourcehut currently. Related to some CDN caching issue probably.
import os
import sys
from pmb.core.types import PmbArgs
import pytest
import glob
import filecmp
@ -19,23 +20,23 @@ def args(request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "chroot"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
args.log = pmb.config.work / "log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(pmb.helpers.logging.logfd.close)
return args
def test_keys(args):
def test_keys(args: PmbArgs):
# Get the alpine-keys apk filename
pmb.chroot.init(args)
version = pmb.parse.apkindex.package(args, "alpine-keys")["version"]
pattern = (args.work + "/cache_apk_" + pmb.config.arch_native +
pattern = (pmb.config.work / "cache_apk_" + pmb.config.arch_native +
"/alpine-keys-" + version + ".*.apk")
filename = os.path.basename(glob.glob(pattern)[0])
# Extract it to a temporary folder
temp = "/tmp/test_keys_extract"
temp_outside = args.work + "/chroot_native" + temp
temp_outside = pmb.config.work / "chroot_native" + temp
if os.path.exists(temp_outside):
pmb.chroot.root(args, ["rm", "-r", temp])
pmb.chroot.user(args, ["mkdir", "-p", temp])