mirror of
https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
synced 2025-07-13 19:39:51 +03:00
Replace "args.logfd" with "pmb.helpers.logging.logfd" in order to avoid passing "args" to all functions that only use it to write to logfd. This is the first step to get rid of this args-passed-to-all-functions pattern in pmbootstrap.
162 lines
5 KiB
Python
162 lines
5 KiB
Python
# Copyright 2021 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
""" Test pmb.parse.depends """
|
|
import collections
|
|
import pytest
|
|
import sys
|
|
|
|
import pmb_test # noqa
|
|
import pmb.config
|
|
import pmb.config.init
|
|
import pmb.helpers.logging
|
|
import pmb.parse.depends
|
|
|
|
|
|
@pytest.fixture
|
|
def args(tmpdir, request):
|
|
import pmb.parse
|
|
sys.argv = ["pmbootstrap", "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_package_from_aports(args):
|
|
func = pmb.parse.depends.package_from_aports
|
|
assert func(args, "invalid-package") is None
|
|
assert func(args, "hello-world") == {"pkgname": "hello-world",
|
|
"depends": [],
|
|
"version": "1-r6"}
|
|
|
|
|
|
def test_package_provider(args, monkeypatch):
|
|
# Override pmb.parse.apkindex.providers()
|
|
providers = collections.OrderedDict()
|
|
|
|
def return_providers(*args, **kwargs):
|
|
return providers
|
|
monkeypatch.setattr(pmb.parse.apkindex, "providers", return_providers)
|
|
|
|
# Override pmb.chroot.apk.installed()
|
|
installed = {}
|
|
|
|
def return_installed(*args, **kwards):
|
|
return installed
|
|
monkeypatch.setattr(pmb.chroot.apk, "installed", return_installed)
|
|
|
|
# 0. No provider
|
|
pkgname = "test"
|
|
pkgnames_install = []
|
|
func = pmb.parse.depends.package_provider
|
|
assert func(args, pkgname, pkgnames_install) is None
|
|
|
|
# 1. Only one provider
|
|
package = {"pkgname": "test", "version": "1234"}
|
|
providers = {"test": package}
|
|
assert func(args, pkgname, pkgnames_install) == package
|
|
|
|
# 2. Provider with the same package name
|
|
package_two = {"pkgname": "test-two", "provides": ["test"]}
|
|
providers = {"test-two": package_two, "test": package}
|
|
assert func(args, pkgname, pkgnames_install) == package
|
|
|
|
# 3. Pick a package that will be installed anyway
|
|
providers = {"test_": package, "test-two": package_two}
|
|
installed = {"test_": package}
|
|
pkgnames_install = ["test-two"]
|
|
assert func(args, pkgname, pkgnames_install) == package_two
|
|
|
|
# 4. Pick a package that is already installed
|
|
pkgnames_install = []
|
|
assert func(args, pkgname, pkgnames_install) == package
|
|
|
|
# 5. Pick package with highest priority
|
|
package_with_priority = {"pkgname": "test-priority", "provides": ["test"],
|
|
"provider_priority": 100}
|
|
providers = {"test-two": package_two,
|
|
"test-priority": package_with_priority}
|
|
assert func(args, pkgname, pkgnames_install) == package_with_priority
|
|
|
|
# 6. Pick the first one
|
|
providers = {"test_": package, "test-two": package_two}
|
|
installed = {}
|
|
assert func(args, pkgname, pkgnames_install) == package
|
|
|
|
|
|
def test_package_from_index(args, monkeypatch):
|
|
# Override pmb.parse.depends.package_provider()
|
|
provider = None
|
|
|
|
def return_provider(*args, **kwargs):
|
|
return provider
|
|
monkeypatch.setattr(pmb.parse.depends, "package_provider",
|
|
return_provider)
|
|
|
|
func = pmb.parse.depends.package_from_index
|
|
aport = {"pkgname": "test", "version": "2"}
|
|
pkgname = "test"
|
|
pkgnames_install = []
|
|
|
|
# No binary package providers
|
|
assert func(args, pkgname, pkgnames_install, aport) is aport
|
|
|
|
# Binary package outdated
|
|
provider = {"pkgname": "test", "version": "1"}
|
|
assert func(args, pkgname, pkgnames_install, aport) is aport
|
|
|
|
# Binary package up-to-date
|
|
for version in ["2", "3"]:
|
|
provider = {"pkgname": "test", "version": version}
|
|
assert func(args, pkgname, pkgnames_install, aport) is provider
|
|
|
|
|
|
def test_recurse_invalid(args, monkeypatch):
|
|
func = pmb.parse.depends.recurse
|
|
|
|
# Invalid package
|
|
with pytest.raises(RuntimeError) as e:
|
|
func(args, ["invalid-pkgname"])
|
|
assert str(e.value).startswith("Could not find dependency")
|
|
|
|
|
|
def return_none(*args, **kwargs):
|
|
return None
|
|
|
|
|
|
def test_recurse(args, monkeypatch):
|
|
"""
|
|
Test recursing through the following dependencies:
|
|
|
|
test:
|
|
libtest
|
|
so:libtest.so.1
|
|
libtest:
|
|
libtest_depend
|
|
libtest_depend:
|
|
so:libtest.so.1:
|
|
libtest_depend
|
|
"""
|
|
# Override finding the package in aports: always no result
|
|
monkeypatch.setattr(pmb.parse.depends, "package_from_aports",
|
|
return_none)
|
|
|
|
# Override depends returned from APKINDEX
|
|
depends = {
|
|
"test": ["libtest", "so:libtest.so.1"],
|
|
"libtest": ["libtest_depend"],
|
|
"libtest_depend": [],
|
|
"so:libtest.so.1": ["libtest_depend"],
|
|
}
|
|
|
|
def package_from_index(args, pkgname, install, aport, suffix):
|
|
return {"pkgname": pkgname, "depends": depends[pkgname]}
|
|
monkeypatch.setattr(pmb.parse.depends, "package_from_index",
|
|
package_from_index)
|
|
|
|
# Run
|
|
func = pmb.parse.depends.recurse
|
|
pkgnames = ["test", "so:libtest.so.1"]
|
|
result = ["test", "so:libtest.so.1", "libtest", "libtest_depend"]
|
|
assert func(args, pkgnames) == result
|