- 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.
192 lines
6.5 KiB
Python
192 lines
6.5 KiB
Python
import os
|
|
import tempfile
|
|
import shutil
|
|
|
|
import pytest
|
|
from unittest import mock
|
|
from unittest.mock import MagicMock
|
|
|
|
from templated_dictionary import TemplatedDictionary
|
|
from mockbuild.config import setup_default_config_opts
|
|
from mockbuild.constants import PKGPYTHONDIR
|
|
from mockbuild.buildroot import Buildroot
|
|
from mockbuild.package_manager import _PackageManager
|
|
|
|
|
|
class TestPackageManager:
|
|
|
|
def setup_method(self, method):
|
|
self.workdir = tempfile.mkdtemp(prefix='mock-test')
|
|
|
|
testdir = os.path.dirname(os.path.realpath(__file__))
|
|
plugindir = os.path.join(testdir, '..', 'py', 'mockbuild')
|
|
plugindir = os.path.realpath(plugindir)
|
|
PKGPYTHONDIR = plugindir
|
|
|
|
self.config_opts = setup_default_config_opts()
|
|
self.config_opts['root'] = 'distro-version-arch'
|
|
self.config_opts['basedir'] = self.workdir
|
|
self.config_opts["resultdir"] = "{{basedir}}/{{root}}/result"
|
|
self.config_opts['chroothome'] = '/builddir'
|
|
self.config_opts['chrootgid'] = '135'
|
|
self.config_opts['package_manager'] = 'dnf'
|
|
self.config_opts['releasever'] = '1'
|
|
self.config_opts['target_arch'] = 'fakearch'
|
|
self.config_opts['dnf_vars'] = {'test': 'testval'}
|
|
|
|
with mock.patch('mockbuild.buildroot.package_manager'):
|
|
with mock.patch('mockbuild.util.cmpKernelVer') as kv:
|
|
kv.return_value = True
|
|
self.bootstrap_buildroot = Buildroot(
|
|
self.config_opts.copy(),
|
|
None, # state
|
|
MagicMock(), # state
|
|
MagicMock(), # plugins
|
|
None, # bootstrap_buildroot
|
|
True, # is_bootstrap
|
|
)
|
|
|
|
self.buildroot = Buildroot(
|
|
self.config_opts,
|
|
None, # uidManager
|
|
MagicMock(), # state
|
|
MagicMock(), # plugins
|
|
self.bootstrap_buildroot,
|
|
False, # is_bootstrap
|
|
)
|
|
|
|
self.package_manager = _PackageManager(
|
|
self.buildroot.config,
|
|
self.buildroot,
|
|
self.buildroot.plugins,
|
|
self.bootstrap_buildroot,
|
|
)
|
|
|
|
self.package_manager_bootstrap = _PackageManager(
|
|
self.bootstrap_buildroot.config,
|
|
self.bootstrap_buildroot,
|
|
self.bootstrap_buildroot.plugins,
|
|
self.buildroot.plugins,
|
|
)
|
|
|
|
def teardown_method(self, method):
|
|
shutil.rmtree(self.workdir)
|
|
|
|
def get_user_bind_mounts_from_config(self, config):
|
|
pm = self.package_manager_bootstrap
|
|
pm.pkg_manager_config = config
|
|
pm.initialize_config()
|
|
pm._bind_mount_repos_to_bootstrap()
|
|
return self.bootstrap_buildroot.mounts.managed_mounts
|
|
|
|
def test_absolute_path_name_in_baseurl(self):
|
|
repo_directory = os.path.join(self.workdir, 'repo')
|
|
os.mkdir(repo_directory)
|
|
config = """
|
|
[main]
|
|
something = 1
|
|
|
|
[external]
|
|
baseurl = http://exmaple.com/test/
|
|
|
|
[external-urlencoded]
|
|
baseurl = http://example.com/results/%40fedora-llvm-team/
|
|
|
|
[fedora]
|
|
baseurl = {}
|
|
""".format(repo_directory)
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
assert len(mounts) == 1
|
|
assert mounts[0].srcpath == repo_directory
|
|
assert mounts[0].bindpath.startswith(self.workdir)
|
|
assert mounts[0].bindpath.endswith(repo_directory)
|
|
|
|
def test_file_colon_slash_path_name_in_baseurl(self):
|
|
repo_directory = os.path.join(self.workdir, 'repo')
|
|
os.mkdir(repo_directory)
|
|
config = """
|
|
[main]
|
|
something = 1
|
|
|
|
[fedora]
|
|
baseurl = file://{}
|
|
""".format(repo_directory)
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
assert len(mounts) == 1
|
|
assert mounts[0].srcpath == repo_directory
|
|
assert mounts[0].bindpath.startswith(self.workdir)
|
|
assert mounts[0].bindpath.endswith(repo_directory)
|
|
|
|
def test_dir_doesnt_exist(self):
|
|
repo_directory = os.path.join(self.workdir, 'repo')
|
|
config = """
|
|
[main]
|
|
something = 1
|
|
|
|
[fedora]
|
|
baseurl = file://{}
|
|
""".format(repo_directory)
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
assert len(mounts) == 0
|
|
|
|
@pytest.mark.parametrize('option', ['metalink', 'mirrorlist'])
|
|
@pytest.mark.parametrize('exists', [True, False])
|
|
def test_local_metalink_mirrorlist(self, option, exists):
|
|
repo_directory = os.path.join(self.workdir, 'repo')
|
|
os.mkdir(repo_directory)
|
|
path = os.path.join(repo_directory, 'testfile')
|
|
|
|
if exists:
|
|
with open(path, 'w') as f:
|
|
f.write("line\n")
|
|
|
|
config = """
|
|
[main]
|
|
metalink = file://{}
|
|
""".format(path)
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
|
|
if not exists:
|
|
assert len(mounts) == 0
|
|
return
|
|
|
|
assert len(mounts) == 1
|
|
assert mounts[0].srcpath == path
|
|
assert mounts[0].bindpath.startswith(self.workdir)
|
|
assert mounts[0].bindpath.endswith(path)
|
|
|
|
def test_bindmount_baseurl_list_with_dupes(self):
|
|
for repo in ['alt1', 'alt2', 'alt3']:
|
|
repo_directory = os.path.join(self.workdir, repo)
|
|
os.mkdir(repo_directory)
|
|
|
|
config = (
|
|
"[main]\n"
|
|
"baseurl = file://{0}/alt2, {0}/alt1\n"
|
|
" file://{0}/alt3\n"
|
|
" file://{0}/alt2\n" # 2nd time
|
|
).format(self.workdir)
|
|
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
assert len(mounts) == 3
|
|
assert {x.srcpath for x in mounts} == set([
|
|
os.path.join(self.workdir, 'alt1'),
|
|
os.path.join(self.workdir, 'alt2'),
|
|
os.path.join(self.workdir, 'alt3'),
|
|
])
|
|
|
|
def test_bindmount_expand_vars(self):
|
|
repo_directory = os.path.join(self.workdir,
|
|
self.config_opts['target_arch'],
|
|
self.config_opts['releasever'],
|
|
self.config_opts['dnf_vars']['test'])
|
|
os.makedirs(repo_directory)
|
|
config = (
|
|
"[main]\n"
|
|
"baseurl = file://{0}/$basearch/${{releasever}}/$test\n"
|
|
).format(self.workdir)
|
|
|
|
mounts = self.get_user_bind_mounts_from_config(config)
|
|
assert len(mounts) == 1
|
|
mount = mounts[0]
|
|
assert mount.srcpath == repo_directory
|