forked from Mirror/pmbootstrap
While at it, also remove unnecessary "#!/usr/bin/env python3" in files that only get imported, and adjust other empty/comment lines in the beginnings of the files for consistency. This makes files easier to read, and makes the pmbootstrap codebase more consistent with the build.postmarketos.org codebase.
154 lines
4.6 KiB
Python
154 lines
4.6 KiB
Python
# Copyright 2020 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(args.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-r5"}
|
|
|
|
|
|
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 the first one
|
|
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
|