summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2012-10-31 17:27:58 +0200
committerGuido Günther <agx@sigxcpu.org>2013-01-16 07:43:38 +0100
commit5e6f16303f7e4c31e361d95b8cce7b0bc0a4a737 (patch)
tree1ed3e36039d8066f8c1f7b72ca00aec87521321b
parent9c80f1456448c140791f4ad45766d5939221aa2e (diff)
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 <markus.lehtonen@linux.intel.com>
-rw-r--r--tests/testutils.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/testutils.py b/tests/testutils.py
index d093e778..04a13cd2 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()
+