From dba1c01cb53a3318ab006365ba53d51c47390df0 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 10 May 2012 16:52:17 +0530 Subject: [PATCH] rename the nose test executor --- tools/marvin/marvin/NoseTestExecuteEngine.py | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 tools/marvin/marvin/NoseTestExecuteEngine.py diff --git a/tools/marvin/marvin/NoseTestExecuteEngine.py b/tools/marvin/marvin/NoseTestExecuteEngine.py new file mode 100644 index 00000000000..1dda2d87cc4 --- /dev/null +++ b/tools/marvin/marvin/NoseTestExecuteEngine.py @@ -0,0 +1,83 @@ +from functools import partial +import unittest +import nose +import nose.config +import nose.core +import os +import sys +import logging +from cloudstackTestCase import cloudstackTestCase +from nose.suite import ContextSuite, ContextSuiteFactory + +class CloudStackTestSelector(nose.selector.Selector): + """ + custom test selector for cloudstackTestCase + """ + + def wantClass(self, cls): + if issubclass(cls, cloudstackTestCase): + return nose.selector.Selector.wantClass(self, cls) + +def testCaseLogger(message, logger=None): + if logger is not None: + logger.debug(message) + +class NoseTestExecuteEngine(object): + def __init__(self, testclient=None, workingdir=None, clientLog=None, resultLog=None): + self.testclient = testclient + self.logformat = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s") + self.suite = [] + realPath = os.path.abspath(workingdir) + + if clientLog is not None: + self.logfile = clientLog + self.logger = logging.getLogger("NoseTestExecuteEngine") + fh = logging.FileHandler(self.logfile) + fh.setFormatter(self.logformat) + self.logger.addHandler(fh) + self.logger.setLevel(logging.DEBUG) + if resultLog is not None: + ch = logging.StreamHandler() + ch.setLevel(logging.ERROR) + ch.setFormatter(self.logformat) + self.logger.addHandler(ch) + fp = open(resultLog, "w") + self.testResultLogFile = fp + else: + self.testResultLogFile = sys.stdout + + if workingdir is not None and os.path.exists(realPath + '/' + '__init__.py'): + self.loader = nose.loader.TestLoader() + [self.suite.append(test) for test in self.loader.discover(workingdir, "test*.py")] + for test in self.suite: + self.injectTestCase(test) + print self.suite[0].countTestCases() + else: + print "Single module test runs unsupported using Nose" + raise + + self.runner = nose.core.TextTestRunner(stream=self.testResultLogFile, descriptions=1, verbosity=2, config=None) + + def runTests(self): + #testProgram = nose.core.TestProgram(argv=["--process-timeout=3600"], testRunner = self.runner, testLoader = self.loader) + testProgram = nose.core.TestProgram(argv=["--process-timeout=3600"], testRunner = self.runner, suite = self.suite) + testProgram.runTests() + + def injectTestCase(self, testSuites): + for test in testSuites: + if isinstance(test, unittest.BaseTestSuite): + self.injectTestCase(test) + else: + #logger bears the name of the test class + testcaselogger = logging.getLogger("testclient.testcase.%s"%test.__class__.__name__) + fh = logging.FileHandler(self.logfile) + fh.setFormatter(self.logformat) + testcaselogger.addHandler(fh) + testcaselogger.setLevel(logging.DEBUG) + + #inject testclient and logger into each unittest + setattr(test, "testClient", self.testclient) + setattr(test, "debug", partial(testCaseLogger, logger=testcaselogger)) + setattr(test.__class__, "clstestclient", self.testclient) + if hasattr(test, "UserName"): + self.testclient.createNewApiClient(test.UserName, test.DomainName, test.AcctType)