X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/c9c4f19e7f0799ce7313f117b7436eb22cf27723..31ff02477d8d0bea8d8d125d4c116a146c8cbb21:/test/testutils.py?ds=sidebyside diff --git a/test/testutils.py b/test/testutils.py index 3eba211..fd95c76 100644 --- a/test/testutils.py +++ b/test/testutils.py @@ -21,16 +21,133 @@ """Utilities for unit testing""" +import os +import sys +import stat +import tempfile import unittest +import logging + +from ganeti import utils + + +def GetSourceDir(): + return os.environ.get("TOP_SRCDIR", ".") + + +class GanetiTestProgram(unittest.TestProgram): + def runTests(self): + """ + + """ + logging.basicConfig(filename=os.devnull) + + sys.stderr.write("Running %s\n" % self.progName) + sys.stderr.flush() + + return unittest.TestProgram.runTests(self) class GanetiTestCase(unittest.TestCase): - def assertFileContent(self, file_name, content): - """Checks the content of a file. + """Helper class for unittesting. + + This class defines a few utility functions that help in building + unittests. Child classes must call the parent setup and cleanup. + + """ + def setUp(self): + self._temp_files = [] + + def tearDown(self): + while self._temp_files: + try: + utils.RemoveFile(self._temp_files.pop()) + except EnvironmentError, err: + pass + + def assertFileContent(self, file_name, expected_content): + """Checks that the content of a file is what we expect. + + @type file_name: str + @param file_name: the file whose contents we should check + @type expected_content: str + @param expected_content: the content we expect + + """ + actual_content = utils.ReadFile(file_name) + self.assertEqual(actual_content, expected_content) + + def assertFileMode(self, file_name, expected_mode): + """Checks that the mode of a file is what we expect. + + @type file_name: str + @param file_name: the file whose contents we should check + @type expected_mode: int + @param expected_mode: the mode we expect """ - handle = open(file_name, 'r') - try: - self.assertEqual(handle.read(), content) - finally: - handle.close() + st = os.stat(file_name) + actual_mode = stat.S_IMODE(st.st_mode) + self.assertEqual(actual_mode, expected_mode) + + def assertEqualValues(self, first, second, msg=None): + """Compares two values whether they're equal. + + Tuples are automatically converted to lists before comparing. + + """ + return self.assertEqual(UnifyValueType(first), + UnifyValueType(second), + msg=msg) + + @staticmethod + def _TestDataFilename(name): + """Returns the filename of a given test data file. + + @type name: str + @param name: the 'base' of the file name, as present in + the test/data directory + @rtype: str + @return: the full path to the filename, such that it can + be used in 'make distcheck' rules + + """ + return "%s/test/data/%s" % (GetSourceDir(), name) + + @classmethod + def _ReadTestData(cls, name): + """Returns the contents of a test data file. + + This is just a very simple wrapper over utils.ReadFile with the + proper test file name. + + """ + return utils.ReadFile(cls._TestDataFilename(name)) + + def _CreateTempFile(self): + """Creates a temporary file and adds it to the internal cleanup list. + + This method simplifies the creation and cleanup of temporary files + during tests. + + """ + fh, fname = tempfile.mkstemp(prefix="ganeti-test", suffix=".tmp") + os.close(fh) + self._temp_files.append(fname) + return fname + + +def UnifyValueType(data): + """Converts all tuples into lists. + + This is useful for unittests where an external library doesn't keep types. + + """ + if isinstance(data, (tuple, list)): + return [UnifyValueType(i) for i in data] + + elif isinstance(data, dict): + return dict([(UnifyValueType(key), UnifyValueType(value)) + for (key, value) in data.iteritems()]) + + return data