summaryrefslogtreecommitdiff
path: root/tests/component/rpm/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/component/rpm/__init__.py')
-rw-r--r--tests/component/rpm/__init__.py78
1 files changed, 77 insertions, 1 deletions
diff --git a/tests/component/rpm/__init__.py b/tests/component/rpm/__init__.py
index e84fca9..b5be3e7 100644
--- a/tests/component/rpm/__init__.py
+++ b/tests/component/rpm/__init__.py
@@ -16,15 +16,91 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""Test module for RPM command line tools of the git-buildpackage suite"""
+from nose.tools import nottest
import os
+import shutil
+from xml.dom import minidom
-from tests.component import ComponentTestGitRepository
+from gbp.git import GitRepository, GitRepositoryError
+
+from tests.component import ComponentTestBase, ComponentTestGitRepository
RPM_TEST_DATA_SUBMODULE = os.path.join('tests', 'component', 'rpm', 'data')
RPM_TEST_DATA_DIR = os.path.abspath(RPM_TEST_DATA_SUBMODULE)
+class RepoManifest(object):
+ """Class representing a test repo manifest file"""
+ def __init__(self, filename=None):
+ self._doc = minidom.Document()
+ if filename:
+ self._doc = minidom.parse(filename)
+ if self._doc.firstChild.nodeName != 'gbp-test-manifest':
+ raise Exception('%s is not a test repo manifest' % filename)
+ else:
+ self._doc.appendChild(self._doc.createElement("gbp-test-manifest"))
+
+ def projects_iter(self):
+ """Return an iterator over projects"""
+ for prj_e in self._doc.getElementsByTagName('project'):
+ branches = {}
+ for br_e in prj_e.getElementsByTagName('branch'):
+ rev = br_e.getAttribute('revision')
+ branches[br_e.getAttribute('name')] = rev
+ yield prj_e.getAttribute('name'), branches
+
+
+ def write(self, filename):
+ """Write to file"""
+ with open(filename, 'w') as fileobj:
+ fileobj.write(self._doc.toprettyxml())
+
def setup():
"""Test Module setup"""
ComponentTestGitRepository.check_testdata(RPM_TEST_DATA_SUBMODULE)
+
+class RpmRepoTestBase(ComponentTestBase):
+ """Baseclass for tests run in a Git repository with packaging data"""
+
+ @classmethod
+ def setup_class(cls):
+ """Initializations only made once per test run"""
+ super(RpmRepoTestBase, cls).setup_class()
+ cls.manifest = RepoManifest(os.path.join(RPM_TEST_DATA_DIR,
+ 'test-repo-manifest.xml'))
+ cls.orig_repos = {}
+ for prj, brs in cls.manifest.projects_iter():
+ repo = GitRepository.create(os.path.join(cls._tmproot,
+ '%s.repo' % prj))
+ try:
+ repo.add_remote_repo('origin', RPM_TEST_DATA_DIR, fetch=True)
+ except GitRepositoryError:
+ # Workaround for older git working on submodules initialized
+ # with newer git
+ gitfile = os.path.join(RPM_TEST_DATA_DIR, '.git')
+ if os.path.isfile(gitfile):
+ with open(gitfile) as fobj:
+ link = fobj.readline().replace('gitdir:', '').strip()
+ link_dir = os.path.join(RPM_TEST_DATA_DIR, link)
+ repo.remove_remote_repo('origin')
+ repo.add_remote_repo('origin', link_dir, fetch=True)
+ else:
+ raise
+ # Fetch all remote refs of the orig repo, too
+ repo.fetch('origin', tags=True,
+ refspec='refs/remotes/*:refs/upstream/*')
+ for branch, rev in brs.iteritems():
+ repo.create_branch(branch, rev)
+ repo.force_head('master', hard=True)
+ cls.orig_repos[prj] = repo
+
+ @classmethod
+ @nottest
+ def init_test_repo(cls, pkg_name):
+ """Initialize git repository for testing"""
+ dirname = os.path.basename(cls.orig_repos[pkg_name].path)
+ shutil.copytree(cls.orig_repos[pkg_name].path, dirname)
+ os.chdir(dirname)
+ return GitRepository('.')
+
# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: