Files
autospec/tests/test_specfile.py
William Douglas 356da62750 Enable working with Jinja2 spec templates
Allow autospec to handle building packages that use a
Jinja2 formatted *.spec.template file. Currently only package_name,
package_version, package_release and package_url fields are supported
but others can be added as needed (patches and archives are good next
steps).

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-25 13:06:51 -07:00

458 lines
17 KiB
Python

import unittest
import unittest.mock
import buildreq
import config
import specfiles
import tarball
class TestSpecfileWrite(unittest.TestCase):
@classmethod
def setUpClass(self):
self.specfile = None
self.WRITES = []
def setUp(self):
conf = config.Config('/download/path')
conf.config_opts['dev_requires_extras'] = False
url = "http://www.testpkg.com/testpkg/pkg-1.0.tar.gz"
content = tarball.Content(url, 'pkg', '1.0', [], conf, '/tmp')
conf.content = content
reqs = buildreq.Requirements(url)
self.specfile = specfiles.Specfile(url, '1.0', 'pkg', '2', conf, reqs, content)
def mock_write(string):
self.WRITES.append(string)
self.specfile._write = mock_write
self.specfile._write_strip = mock_write
self.WRITES = []
def test_write_comment_header(self):
"""
test Specfile.write_comment_header with all optional fields
"""
self.specfile.keyid = '1'
self.specfile.email = 'email'
self.specfile.write_comment_header()
expect = ["#\n",
"# This file is auto-generated. DO NOT EDIT\n",
"# Generated by: autospec.py\n",
"# Using build pattern: make\n",
"#\n",
"# Source0 file verified with key 0x1 (email)",
"#"]
# skipping autospec version lines as they change
self.WRITES = self.WRITES[:4] + self.WRITES[6:]
self.assertEqual(expect, self.WRITES)
def test_write_nvr(self):
"""
test Specfile.write_nvr with no urlban set
"""
self.specfile.write_nvr()
expect = ["Name : pkg\n",
"Version : 1.0\n",
"Release : 2\n",
"URL : http://www.testpkg.com/testpkg/pkg-1.0.tar.gz\n",
"Source0 : http://www.testpkg.com/testpkg/pkg-1.0.tar.gz\n"]
self.assertEqual(expect, self.WRITES)
def test_write_sources(self):
"""
test write_sources with all Specfile.sources set.
"""
self.specfile.config.sources["unit"] = ["pkg2.service", "pkg1.service"]
self.specfile.config.sources["archive"] = ["archA", "archD", "archB", "archC"]
self.specfile.config.sources["tmpfile"] = ["tmp1", "tmp2"]
self.specfile.config.sources["gcov"] = ["pkg.gcov"]
self.specfile.write_sources()
expect = ["Source1 : archA\n",
"Source2 : archB\n",
"Source3 : archC\n",
"Source4 : archD\n",
"Source5 : pkg.gcov\n",
"Source6 : pkg1.service\n",
"Source7 : pkg2.service\n",
"Source8 : tmp1\n",
"Source9 : tmp2\n"]
self.assertEqual(expect, self.WRITES)
def test_write_summary(self):
"""
test write_summary with unstripped summary and group strings
"""
self.specfile.default_sum = " This is unstripped summary "
self.specfile.write_summary()
expect = ["Summary : This is unstripped summary\n",
"Group : Development/Tools\n"]
self.assertEqual(expect, self.WRITES)
def test_write_license(self):
"""
test write_license with unsorted list of licenses
"""
self.specfile.licenses = ["MIT", "IJG", "GPL-3.0", "GPL-2.0", "ICU"]
self.specfile.write_license()
expect = ["License : GPL-2.0 GPL-3.0 ICU IJG MIT\n"]
self.assertEqual(expect, self.WRITES)
def test_write_main_subpackage_requires_no_autostart(self):
"""
test write_main_subpackage_requires with autostart package and
Specfile.no_autostart set.
"""
self.specfile.packages["autostart"] = ["autostart"]
self.specfile.packages["bin"] = []
self.specfile.packages["lib"] = ["package.so"]
self.specfile.requirements.requires[None] = set(["pkg1", "pkg2"])
self.specfile.config.config_opts['no_autostart'] = True
self.specfile.write_main_subpackage_requires()
expect = ["Requires: pkg-bin = %{version}-%{release}\n",
"Requires: pkg-lib = %{version}-%{release}\n",
"Requires: pkg1\n",
"Requires: pkg2\n"]
self.assertEqual(expect, self.WRITES)
def test_write_main_subpackage_requires_autostart(self):
"""
test write_main_subpackage_requires with autostart package and
Specfile.no_autostart not set. Also has other ignored packages.
"""
self.specfile.packages["autostart"] = ["autostart"]
self.specfile.packages["bin"] = []
self.specfile.packages["lib"] = ["package.so"]
self.specfile.packages["main"] = ["main/file.py"]
self.specfile.packages["ignore"] = []
self.specfile.packages["dev"] = []
self.specfile.packages["active-units"] = []
self.specfile.requirements.requires[None] = set(["pkg1", "pkg2"])
self.specfile.write_main_subpackage_requires()
expect = ["Requires: pkg-autostart = %{version}-%{release}\n",
"Requires: pkg-bin = %{version}-%{release}\n",
"Requires: pkg-lib = %{version}-%{release}\n",
"Requires: pkg1\n",
"Requires: pkg2\n"]
self.assertEqual(expect, self.WRITES)
def test_write_main_subpackage_requires_empty(self):
"""
test write_main_subpackage_requires with no required subpackages.
"""
self.specfile.write_main_subpackage_requires()
self.assertEqual([], self.WRITES)
def test_write_buildreq(self):
"""
test write_buildreq with unsorted list of build requirements.
"""
self.specfile.requirements.buildreqs = ["python", "ruby", "go"]
self.specfile.write_buildreq()
expect = ["BuildRequires : go\n",
"BuildRequires : python\n",
"BuildRequires : ruby\n"]
self.assertEqual(expect, self.WRITES)
def test_write_buildreq_empty(self):
"""
test write_buildreq with no build requirements.
"""
self.specfile.write_buildreq()
self.assertEqual([], self.WRITES)
def test_write_patch_header(self):
"""
test write_patch_header with list of patches.
"""
self.specfile.config.patches = ["speedup.patch",
"slowdown.patch",
"revert.patch reverts slowdown.patch"]
self.specfile.write_patch_header()
expect = ["Patch1: speedup.patch\n",
"Patch2: slowdown.patch\n",
"Patch3: revert.patch\n"]
self.assertEqual(expect, self.WRITES)
def test_write_patch_header_empty(self):
"""
test write_patch_header with empty patch list.
"""
self.specfile.write_patch_header()
self.assertEqual([], self.WRITES)
def test_write_description(self):
"""
test write_description with unstripped description
"""
self.specfile.default_desc = " This package is for testing only "
self.specfile.write_description()
expect = ["\n%description\nThis package is for testing only\n"]
self.assertEqual(expect, self.WRITES)
def test_write_files_header_base(self):
"""
base test for write_files_header
"""
self.specfile.packages["data"] = ["df1", "df2", "df3"]
self.specfile.packages["ignore"] = ["doesn't matter"]
self.specfile.packages["python"] = ["pyfile1", "pyfile2"]
self.specfile.packages["dev"] = ["dev1", "dev2"]
self.specfile.packages["pack"] = ["packf1"]
self.specfile.requirements.buildreqs = ["pep8", "pycurl"]
self.specfile.write_files_header()
expect = ["\n%package data\n",
"Summary: data components for the pkg package.\n",
"Group: Data\n",
"\n%description data\n",
"data components for the pkg package.\n",
"\n",
"\n%package dev\n",
"Summary: dev components for the pkg package.\n",
"Group: Development\n",
"Requires: pkg-data = %{version}-%{release}\n",
"Provides: pkg-devel = %{version}-%{release}\n",
"Requires: pkg = %{version}-%{release}\n",
"\n%description dev\n",
"dev components for the pkg package.\n",
"\n",
"\n%package pack\n",
"Summary: pack components for the pkg package.\n",
"Group: Default\n",
"\n%description pack\n",
"pack components for the pkg package.\n",
"\n",
"\n%package python\n",
"Summary: python components for the pkg package.\n",
"Group: Default\n",
"\n%description python\n",
"python components for the pkg package.\n",
"\n"]
self.assertEqual(expect, self.WRITES)
def test_write_files_header_custom_extra_requires(self):
"""
test write_files_header with custom extras requires.
"""
self.specfile.packages["data"] = ["file1"]
self.specfile.packages["foobar-extras"] = ["file2"]
self.specfile.file_maps = { 'foobar-extras': { 'requires': ["data"] }}
self.specfile.write_files_header()
expect = ["\n%package data\n",
"Summary: data components for the pkg package.\n",
"Group: Data\n",
"\n%description data\n",
"data components for the pkg package.\n",
"\n",
"\n%package foobar-extras\n",
"Summary: foobar-extras components for the pkg package.\n",
"Group: Default\n",
"Requires: pkg-data = %{version}-%{release}\n",
"\n%description foobar-extras\n",
"foobar-extras components for the pkg package.\n",
"\n"]
self.assertEqual(expect, self.WRITES)
def test_write_files_header_python_name(self):
"""
test write_files_header with uppercase letter in Specfile.name, causing
a Provides line to be written.
"""
self.specfile.name = 'Pkg'
self.specfile.packages["python"] = ["pyfile1", "pyfile2"]
self.specfile.write_files_header()
expect = ["\n%package python\n",
"Summary: python components for the Pkg package.\n",
"Group: Default\n",
"Provides: pkg-python\n",
"\n%description python\n",
"python components for the Pkg package.\n",
"\n"]
self.assertEqual(expect, self.WRITES)
def test_write_files_header_bare(self):
"""
test write_files_header with no packages
"""
self.specfile.write_files_header()
self.assertEqual([], self.WRITES)
def test_write_buildpattern(self):
"""
test write_buildpattern
"""
# Should be doable but probably worth waiting for specfile template rework
pass
def test_write_scriplets_base(self):
"""
test write_scriplets base test
"""
def mock_read_conf_file(name):
prefix = "pre" if "pre" in name else "post"
return ["{}-script line 1\n".format(prefix),
"{}-script line 2\n".format(prefix),
"{}-script line 3\n".format(prefix)]
class MockSpecfile(object):
@staticmethod
def writelines(stringlist):
self.WRITES.extend(stringlist)
self.specfile.config.read_conf_file = mock_read_conf_file
self.specfile.specfile = MockSpecfile()
self.specfile.packages["ruby"] = ["rubyfile1"]
self.specfile.packages["ignore"] = ["ignorefile1", "ignorefile2"]
self.specfile.write_scriplets()
expect = ["\n%post ruby\n",
"post-script line 1\n\n",
"post-script line 2\n\n",
"post-script line 3\n\n",
"\n%pre ruby\n",
"pre-script line 1\n\n",
"pre-script line 2\n\n",
"pre-script line 3\n\n"]
self.assertEqual(expect, self.WRITES)
def test_write_scriplets_pre_only(self):
"""
test write_scriplets with only pre-scripts present.
"""
def mock_read_conf_file(name):
if "pre" in name:
return ["pre-script line 1\n",
"pre-script line 2\n",
"pre-script line 3\n"]
else:
return []
class MockSpecfile(object):
@staticmethod
def writelines(stringlist):
self.WRITES.extend(stringlist)
self.specfile.config.read_conf_file = mock_read_conf_file
self.specfile.specfile = MockSpecfile()
self.specfile.packages["ruby"] = ["rubyfile1"]
self.specfile.packages["ignore"] = ["ignorefile1", "ignorefile2"]
self.specfile.write_scriplets()
expect = ["\n%pre ruby\n",
"pre-script line 1\n\n",
"pre-script line 2\n\n",
"pre-script line 3\n\n"]
self.assertEqual(expect, self.WRITES)
def test_write_scriplets_bare(self):
"""
test write_scriplets with no scripts present.
"""
def mock_read_conf_file(name):
return []
class MockSpecfile(object):
@staticmethod
def writelines(stringlist):
self.WRITES.extend(stringlist)
self.specfile.config.read_conf_file = mock_read_conf_file
self.specfile.specfile = MockSpecfile()
self.specfile.packages["ruby"] = ["rubyfile1"]
self.specfile.packages["ignore"] = ["ignorefile1", "ignorefile2"]
self.specfile.write_scriplets()
self.assertEqual([], self.WRITES)
def test_write_files_base(self):
"""
test write_files base test.
"""
self.specfile.packages["main"] = ["mainfile1", "/mainfile2", "/mainfile3",
"/mainfile 4", "mainfile\t5", "%foo /mainfile6", "%bar /mainfile 7"]
self.specfile.packages["ignore"] = ["ignorepkg"]
self.specfile.packages["other"] = ["other2", "other1"]
self.specfile.write_files()
# Note the special sorting
expect = ["\n%files\n",
"%defattr(-,root,root,-)\n",
'%bar "/mainfile 7"\n',
"%foo /mainfile6\n",
'"/mainfile 4"\n',
"/mainfile2\n",
"/mainfile3\n",
'"mainfile\t5"\n',
"mainfile1\n",
"\n%files other\n",
"%defattr(-,root,root,-)\n",
"other1\n",
"other2\n"]
self.assertEqual(expect, self.WRITES)
def test_write_files_empty(self):
"""
test write_files with empty package list.
"""
self.specfile.write_files()
expect = ["\n%files\n",
"%defattr(-,root,root,-)\n"]
self.assertEqual(expect, self.WRITES)
def test_write_lang_files_base(self):
"""
write_lang_files base test
"""
self.specfile.locales = ["pkg1", "pkg2"]
self.specfile.write_lang_files()
expect = ["\n%files locales",
" -f pkg1.lang",
" -f pkg2.lang",
"\n%defattr(-,root,root,-)\n\n"]
self.assertEqual(expect, self.WRITES)
def test_write_lang_files_empty(self):
"""
test write_lang_files with empty lang list
"""
self.specfile.write_lang_files()
self.assertEqual([], self.WRITES)
def test_write_service_restart(self):
"""
Validate that service_restart configuration is written to the spec file
correctly.
"""
self.specfile.config.service_restart = [
"/usr/lib/systemd/system/foo.service",
"/usr/lib/systemd/system/bar.service",
]
self.specfile.write_service_restart()
expect = [
"## service_restart content",
"mkdir -p %{buildroot}/usr/share/clr-service-restart",
"ln -s /usr/lib/systemd/system/foo.service %{buildroot}/usr/share/clr-service-restart/foo.service",
"ln -s /usr/lib/systemd/system/bar.service %{buildroot}/usr/share/clr-service-restart/bar.service",
"## service_restart end",
]
self.assertEqual(expect, self.WRITES)
def test_write_exclude_deletes(self):
"""
Validate that excludes configuration is written to the spec file correctly.
"""
self.specfile.excludes = [
"/usr/bin/bar",
"/usr/bin/foo",
]
self.specfile.write_exclude_deletes()
expect = [
"## Remove excluded files",
"rm -f %{buildroot}*/usr/bin/bar",
"rm -f %{buildroot}*/usr/bin/foo",
]
self.assertEqual(expect, self.WRITES)
if __name__ == '__main__':
unittest.main()