| #Licensed to the Apache Software Foundation (ASF) under one |
| #or more contributor license agreements. See the NOTICE file |
| #distributed with this work for additional information |
| #regarding copyright ownership. The ASF licenses this file |
| #to you under the Apache License, Version 2.0 (the |
| #"License"); you may not use this file except in compliance |
| #with the License. You may obtain a copy of the License at |
| |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| |
| #Unless required by applicable law or agreed to in writing, software |
| #distributed under the License is distributed on an "AS IS" BASIS, |
| #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| #See the License for the specific language governing permissions and |
| #limitations under the License. |
| import unittest, re, sys |
| |
| class BaseTestSuite(): |
| def __init__(self, name, excludes): |
| self.name = name |
| self.excludes = excludes |
| pass |
| |
| def runTests(self): |
| # Create a runner |
| self.runner = unittest.TextTestRunner() |
| |
| # Get all the test-case classes |
| # From module import * |
| mod = __import__(self.name, fromlist=['*']) |
| modItemsList = dir(mod) |
| |
| allsuites = [] |
| |
| # Create all the test suites |
| for modItem in modItemsList: |
| if re.search(r"^test_", modItem): |
| # Yes this is a test class |
| if modItem not in self.excludes: |
| test_class = getattr(mod, modItem) |
| allsuites.append(unittest.makeSuite(test_class)) |
| |
| # Create a master suite to be run. |
| alltests = unittest.TestSuite(tuple(allsuites)) |
| |
| # Run the master test suite. |
| runner = self.runner.run(alltests) |
| if(runner.wasSuccessful()): return 0 |
| printLine( "%s test(s) failed." % runner.failures.__len__()) |
| printLine( "%s test(s) threw errors." % runner.errors.__len__()) |
| return runner.failures.__len__() + runner.errors.__len__() |
| |
| def cleanUp(self): |
| # suite tearDown |
| pass |
| |
| def printLine(str): |
| print >>sys.stderr, str |
| |
| def printSeparator(): |
| str = "" |
| for i in range(0,79): |
| str = str + "*" |
| print >>sys.stderr, "\n", str, "\n" |
| |
| # This class captures all log messages logged by hodRunner and other classes. |
| # It is then used to verify that certain log messages have come. This is one |
| # way to validate that messages printed to the logger are correctly written. |
| class MockLogger: |
| def __init__(self): |
| self.__logLines = {} |
| |
| def info(self, message): |
| self.__logLines[message] = 'info' |
| |
| def critical(self, message): |
| self.__logLines[message] = 'critical' |
| |
| def warn(self, message): |
| self.__logLines[message] = 'warn' |
| |
| def debug(self, message): |
| # don't track debug lines. |
| pass |
| |
| # verify a certain message has been logged at the defined level of severity. |
| def hasMessage(self, message, level): |
| if not self.__logLines.has_key(message): |
| return False |
| return self.__logLines[message] == level |
| |
| # Stub class to test cluster manipulation operations. |
| class MockHadoopCluster: |
| |
| def __init__(self): |
| # store the operations received. |
| self.__operations = {} |
| |
| def delete_job(self, jobid): |
| self.__operations['delete_job'] = [jobid] |
| |
| def is_cluster_deallocated(self, dummy): |
| return False |
| |
| def wasOperationPerformed(self, operation, args): |
| if self.__operations.has_key(operation): |
| actualArgs = self.__operations[operation] |
| for arg in actualArgs: |
| if arg not in args: |
| break |
| else: |
| return True |
| return False |