commit 1a2914140c84fc21e5bc3e3bed39cb2e7e3ea5ef
Author: Michael Simacek <msimacek(a)redhat.com>
Date: Wed Nov 6 16:37:54 2013 +0100
[tests] add support for running macros in rpmbuild environment
test/test_rpmbuild.py | 159 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 159 insertions(+), 0 deletions(-)
---
diff --git a/test/test_rpmbuild.py b/test/test_rpmbuild.py
new file mode 100644
index 0000000..f2405d1
--- /dev/null
+++ b/test/test_rpmbuild.py
@@ -0,0 +1,159 @@
+import os
+import re
+import subprocess
+import shutil
+
+from textwrap import dedent
+
+from test_common import DIRPATH
+
+class Package(object):
+ """Represents single RPM package that should be built.
+
+ It creates a temporary specfile that is used to build the package using
+ rpmbuild. Every output goes to directory 'rpmbuild' (will be created) in
+ current working directory. RPM macros in javapackages/etc are processed to
+ override default lookup for our srcipts in order to test the current
+ version and not the system-wide javapackages-tools
+
+ """
+ def __init__(self, name):
+ self.__name = name
+ self.__sources = {}
+ self.__prep = ''
+ self.__build = ''
+
+ def add_source(self, sourcepath, newname=None):
+ """Add source file to a package
+
+ File will be copied into 'rpmbuild/SOURCES' and 'rpmbuild/BUILD'
by
+ default. Path can be absolute or relative to test directory.
+
+ Keyword arguments:
+ newname -- name for source file. If None, sourcepath's basename will be
+ used.
+
+ """
+ if not os.path.isabs(sourcepath):
+ sourcepath = os.path.join(DIRPATH, sourcepath)
+ if not newname:
+ newname = os.path.basename(sourcepath)
+ self.__sources[sourcepath] = newname
+ return os.path.join('rpmbuild', 'BUILD', self.__name +
'-1', newname)
+
+ def append_to_prep(self, to_append):
+ """Appends given string to %prep section of
spec."""
+ self.__prep += to_append + '\n'
+
+ def append_to_build(self, to_append):
+ """Appends given string to %build section of
spec."""
+ self.__build += to_append + '\n'
+
+ def run_prep(self):
+ """Runs rpmbuild -bp (doing only prep phase) with current
settings."""
+ self.__prepare_all()
+ return self.__invoke_rpmbuild(['-bp'])
+
+ def run_build(self):
+ """Runs rpmbuild -bb (stop after build phase) with current
settings."""
+ self.__prepare_all()
+ return self.__invoke_rpmbuild(['-bb'])
+
+ def __invoke_rpmbuild(self, args):
+ env = dict(os.environ)
+ env['HOME'] = os.getcwd()
+ outfile = open("tmpout", 'w')
+ errfile = open("tmperr", 'w')
+ topdir = '--define=_topdir {cwd}/rpmbuild'.format(cwd=os.getcwd())
+ proc = subprocess.Popen(['rpmbuild', topdir,
+ os.path.join('rpmbuild', 'SPECS',
+ self.__name + '.spec')]
+ + args, shell=False, env=env,
+ stdout=outfile, stderr=errfile)
+ ret = proc.wait()
+ outfile = open("tmpout", 'r+')
+ errfile = open("tmperr", 'r+')
+ out = outfile.read()
+ err = errfile.read()
+ os.remove('tmpout')
+ os.remove('tmperr')
+ return (out, err, ret)
+
+ def __prepare_all(self):
+ try:
+ os.mkdir('rpmbuild')
+ os.mkdir('rpmbuild/SOURCES')
+ os.mkdir('rpmbuild/SPECS')
+ os.mkdir('rpmbuild/RPMS')
+ os.mkdir('rpmbuild/SRPMS')
+ os.mkdir('rpmbuild/BUILD')
+ os.mkdir('rpmbuild/BUILDROOT')
+ except OSError:
+ pass
+ _prepare_macros()
+ self.__prepare_spec()
+ try:
+ self.__prepare_sources()
+ except IOError:
+ pass
+
+ def __prepare_spec(self):
+ header = dedent("""\
+ Name: {name}
+ Version: 1
+ Release: 1%{{?dist}}
+ Summary: test
+ License: GPL
+ URL:
www.example.com
+ """.format(name=self.__name))
+ for index, filename in enumerate(self.__sources.values() or []):
+ header += 'Source{index}: {filename}\n'.format(filename=filename,
+ index=index)
+
+ header += dedent("""\
+ %description
+ This is just a test.
+ """)
+
+ prep_section = dedent("""\
+ %prep
+ mkdir %{name}-%{version}
+ cd %{name}-%{version}
+ """)
+ for i in range(len(self.__sources)):
+ prep_section += 'cp -p %SOURCE{index} .\n'.format(index=i)
+ prep_section += self.__prep
+
+ build_section = dedent("""\
+ %build
+
+ """)
+
+ specpath = os.path.join('rpmbuild', 'SPECS', self.__name +
'.spec')
+ with open(specpath, 'w') as specfile:
+ specfile.write(header)
+ specfile.write(prep_section)
+ specfile.write(build_section)
+
+ def __prepare_sources(self):
+ destpath = os.path.join('rpmbuild', 'SOURCES')
+ for sourcepath, targetname in self.__sources.iteritems():
+ shutil.copy(sourcepath, os.path.join(destpath, targetname))
+
+def _prepare_macros():
+ etcpath = os.path.join(DIRPATH, '..', 'etc')
+ java_utils = os.path.abspath(os.path.join(DIRPATH, '..',
'java-utils'))
+
+ with open('.rpmmacros', 'w') as rpmmacros:
+ for filepath in os.listdir(etcpath):
+ if filepath.startswith('macros'):
+ with open(os.path.join(etcpath, filepath), 'r') as macrofile:
+ for line in macrofile:
+ if '/usr/share/java-utils' in line:
+ rpmmacros.write(re.sub(r'/usr/share/java-utils',
+ java_utils, line))
+ elif '%{javadir}-utils' in line:
+ rpmmacros.write(re.sub(r'%\{javadir\}-utils',
+ java_utils, line))
+ else:
+ rpmmacros.write(line)