deb-mock/mock/tests/test_buildroot_lock.py
robojerk 4c0dcb2522
Some checks failed
Build Deb-Mock Package / build (push) Successful in 54s
Lint Code / Lint All Code (push) Failing after 1s
Test Deb-Mock Build / test (push) Failing after 36s
enhance: Add comprehensive .gitignore for deb-mock project
- Add mock-specific build artifacts (chroot/, mock-*, mockroot/)
- Include package build files (*.deb, *.changes, *.buildinfo)
- Add development tools (.coverage, .pytest_cache, .tox)
- Include system files (.DS_Store, Thumbs.db, ._*)
- Add temporary and backup files (*.tmp, *.bak, *.backup)
- Include local configuration overrides (config.local.yaml, .env.local)
- Add test artifacts and documentation builds
- Comprehensive coverage for Python build system project

This ensures build artifacts, chroot environments, and development
tools are properly ignored in version control.
2025-08-18 23:37:49 -07:00

162 lines
5.5 KiB
Python

"""
Test the methods that generate buildroot_lock.json
"""
import copy
import json
import os
import tempfile
from unittest import TestCase
from unittest.mock import MagicMock, patch
import jsonschema
from mockbuild.plugins.buildroot_lock import init
import mockbuild.exception
# gpg-pubkey packages stay ignored
# fedora-release is normal package with simple license
RPM_OUTPUT = """\
gpg-pubkey|/@(none)|/@pubkey|/@105ef944|/@65ca83d1|/@(none)|/@(none)|/@(none)
gpg-pubkey|/@(none)|/@pubkey|/@e99d6ad1|/@64d2612c|/@(none)|/@(none)|/@(none)
fedora-release|/@noarch|/@MIT|/@42|/@0.3|/@(none)|/@cf31d87e5e3eac97ff32a98e7e073f37|/@(none)
bash|/@x86_64|/@GPLv3+|/@5.1.8|/@9.el9|/@(none)|/@57e93b1739cc3512f9f29dcaa8a38055|/@RSA/SHA256, Sun Mar 31 12:41:20 2024, Key ID 199e2f91fd431d51
""" # noqa: E501
# cyrus-sasl-lib is not present in the REPOQUERY_OUTPUT
RPM_ONLY_RPM = """\
cyrus-sasl-lib|/@x86_64|/@BSD with advertising|/@2.1.27|/@21.el9|/@(none)|/@9e1caba09fac94568419b9dfd14fb4c5|/@RSA/SHA256, Mon Sep 12 23:24:22 2022, Key ID 199e2f91fd431d51
""" # noqa: E501
REPOQUERY_OUTPUT = """\
http://ftp.fi.muni.cz/pub/linux/fedora/linux/development/rawhide/Everything/x86_64/os/Packages/f/fedora-release-42-0.3.noarch.rpm
https://cdn.redhat.com/content/dist/rhel9/9/x86_64/baseos/os/Packages/b/bash-5.1.8-9.el9.x86_64.rpm
"""
EXPECTED_OUTPUT = {
'version': '1.1.0',
'buildroot': {
'rpms': [{
'arch': 'x86_64',
'epoch': None,
'license': 'GPLv3+',
'name': 'bash',
'release': '9.el9',
'sigmd5': '57e93b1739cc3512f9f29dcaa8a38055',
'signature': 'fd431d51',
'url': 'https://cdn.redhat.com/content/dist/rhel9/9/x86_64'
'/baseos/os/Packages/b/bash-5.1.8-9.el9.x86_64.rpm',
'version': '5.1.8'
}, {
'arch': 'noarch',
'epoch': None,
'license': 'MIT',
'name': 'fedora-release',
'release': '0.3',
'sigmd5': 'cf31d87e5e3eac97ff32a98e7e073f37',
'signature': None,
'url': 'http://ftp.fi.muni.cz/pub/linux/fedora/linux'
'/development/rawhide/Everything/x86_64/os'
'/Packages/f/fedora-release-42-0.3.noarch.rpm',
'version': '42',
}]
},
"bootstrap": {
"image_digest": "sha256:ba1067bef190fbe88f085bd019464a8c0803b7cd1e3f",
"pull_digest": "sha256:1d9f0eaec60b59a669b285d1e775d970061b9694d4998b5bdb9626c9f33685cd",
"id": "b222730c2ba32385173fe3351026c316c9a294fa8d8c3c0f80d8afdb1b1aeef7",
"architecture": "amd64",
},
'config': {
'bootstrap_image': 'foo',
'bootstrap_image_ready': True,
"legal_host_arches": ["x86_64"],
"target_arch": "x86_64",
"dist": ".f42",
},
}
def _exp_output_bootstrap(exp_data):
data = copy.deepcopy(exp_data["bootstrap"])
del data["image_digest"]
return data
def _mock_vars(rpm_out, repoquery_out):
tc = TestCase()
tc.maxDiff = None
buildroot = MagicMock()
buildroot.state = MagicMock()
buildroot.uid_manager = MagicMock()
buildroot.doOutChroot = MagicMock(
side_effect=iter([
(rpm_out, None),
(repoquery_out, None),
])
)
buildroot.config = EXPECTED_OUTPUT['config']
buildroot.resultdir = tempfile.mkdtemp(prefix="mock-test-buildroot-lock")
plugins = MagicMock()
plugins.add_hook = MagicMock()
return tc, buildroot, plugins
def _call_method(plugins, buildroot):
# initialize the plugin
init(plugins, {}, buildroot)
# obtain the hook method, and call it
plugins.add_hook.assert_called_once()
_, method = plugins.add_hook.call_args[0]
podman_obj = MagicMock()
podman_obj.get_oci_digest.return_value = EXPECTED_OUTPUT["bootstrap"]["image_digest"]
podman_obj.inspect_hermetic_metadata.return_value = _exp_output_bootstrap(EXPECTED_OUTPUT)
podman_cls = MagicMock(return_value=podman_obj)
with patch("mockbuild.plugins.buildroot_lock.Podman", side_effect=podman_cls):
method()
def test_nonexisting_file_in_repo():
"""
Test the situation when RPM is installed, and no longer available in
repository.
"""
_, buildroot, plugins = _mock_vars(
RPM_OUTPUT + RPM_ONLY_RPM,
REPOQUERY_OUTPUT,
)
raised = False
try:
_call_method(plugins, buildroot)
except mockbuild.exception.Error as e:
assert e.msg == "Can't get location for cyrus-sasl-lib-2.1.27-21.el9.x86_64"
raised = True
assert raised
def _get_json_schema():
testdir = os.path.dirname(__file__)
basename = "buildroot-lock-schema-" + EXPECTED_OUTPUT["version"] + ".json"
with open(os.path.join(testdir, "..", "docs", basename),
"r", encoding="utf-8") as fd:
return json.load(fd)
def test_buildroot_lock_output():
""" test the buildroot_lock.json file format """
tc, buildroot, plugins = _mock_vars(RPM_OUTPUT, REPOQUERY_OUTPUT)
_call_method(plugins, buildroot)
with open(os.path.join(buildroot.resultdir, "buildroot_lock.json"), "r",
encoding="utf-8") as fd:
data = json.load(fd)
tc.assertDictEqual(data, EXPECTED_OUTPUT)
schema = _get_json_schema()
jsonschema.validate(EXPECTED_OUTPUT, schema)
def test_json_schema_metadata():
""" Test basic format of the json schema """
schema = _get_json_schema()
version = EXPECTED_OUTPUT["version"]
assert "Version " + version + ";" in schema["description"]
assert "schema-" + version + ".json" in schema["$id"]