From 5e6f16303f7e4c31e361d95b8cce7b0bc0a4a737 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Wed, 31 Oct 2012 17:27:58 +0200 Subject: tests.testutils: baseclass for testing commandline tools Introduce a new baseclass to be utilized in testing the git-buildpackage command line tools. Signed-off-by: Markus Lehtonen --- tests/testutils.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'tests') diff --git a/tests/testutils.py b/tests/testutils.py index d093e77..04a13cd 100644 --- a/tests/testutils.py +++ b/tests/testutils.py @@ -2,7 +2,9 @@ import os import shutil +import tempfile import unittest +from StringIO import StringIO import gbp.log import gbp.deb.git @@ -43,3 +45,86 @@ class DebianGitTestRepo(unittest.TestCase): content == None or f.write(content) self.repo.add_files(name, force=True) self.repo.commit_files(path, msg or "added %s" % name) + + +class ComponentTestBase(object): + """Base class for testing cmdline tools of git-buildpackage""" + + @classmethod + def setup_class(cls): + """Test class case setup""" + # Don't let git see that we're (possibly) under a git directory + cls.orig_env = os.environ.copy() + os.environ['GIT_CEILING_DIRECTORIES'] = os.getcwd() + + @classmethod + def teardown_class(cls): + """Test class case teardown""" + # Return original environment + os.environ = cls.orig_env + + def __init__(self): + """Object initialization""" + self._orig_dir = None + self._tmpdir = None + self._log = None + self._loghandler = None + + def setup(self): + """Test case setup""" + # Change to a temporary directory + self._orig_dir = os.getcwd() + self._tmpdir = tempfile.mkdtemp(prefix='gbp_%s_' % __name__, dir='.') + os.chdir(self._tmpdir) + + self._capture_log(True) + + def teardown(self): + """Test case teardown""" + # Restore original working dir + os.chdir(self._orig_dir) + shutil.rmtree(self._tmpdir) + + self._capture_log(False) + + @classmethod + def _check_repo_state(cls, repo, current_branch, branches): + """Check that repository is clean and given branches exist""" + branch = repo.branch + assert branch == current_branch + assert repo.is_clean() + assert set(repo.get_local_branches()) == set(branches) + + def _capture_log(self, capture=True): + """ Capture log""" + if capture and self._log is None: + self._log = StringIO() + self._loghandler = gbp.log.GbpStreamHandler(self._log, False) + self._loghandler.addFilter(gbp.log.GbpFilter([gbp.log.WARNING, + gbp.log.ERROR])) + gbp.log.LOGGER.addHandler(self._loghandler) + elif self._log is not None: + gbp.log.LOGGER.removeHandler(self._loghandler) + self._loghandler = None + self._log.close() + self._log = None + + def _get_log(self): + """Get the captured log output""" + self._log.seek(0) + return self._log.readlines() + + def _check_log(self, linenum, string): + """Check that the specified line on log matches expectations""" + if self._log is None: + assert False, "BUG in unittests: no log captured!" + output = self._get_log()[linenum].strip() + assert output.startswith(string), ("Expected: '%s...' Got: '%s'" % + (string, output)) + + def _clear_log(self): + """Clear the mock strerr""" + if self._log is not None: + self._log.seek(0) + self._log.truncate() + -- cgit v1.2.3