mirror of https://github.com/apache/kafka.git
				
				
				
			
		
			
	
	
		
			165 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
		
		
			
		
	
	
			165 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
|  | #!/usr/bin/evn python | ||
|  | 
 | ||
|  | # =================================== | ||
|  | # system_test_runner.py | ||
|  | # =================================== | ||
|  | 
 | ||
|  | from system_test_env import SystemTestEnv | ||
|  | from utils import system_test_utils | ||
|  | 
 | ||
|  | import logging | ||
|  | import os | ||
|  | import sys | ||
|  | 
 | ||
|  | 
 | ||
|  | # ==================================================================== | ||
|  | # Two logging formats are defined in system_test/system_test_runner.py | ||
|  | # ==================================================================== | ||
|  | 
 | ||
|  | # 1. "namedLogger" is defined to log message in this format: | ||
|  | #    "%(asctime)s - %(levelname)s - %(message)s %(name_of_class)s" | ||
|  | #  | ||
|  | # usage: to log message and showing the class name of the message | ||
|  | 
 | ||
|  | namedLogger = logging.getLogger("namedLogger") | ||
|  | namedLogger.setLevel(logging.INFO) | ||
|  | #namedLogger.setLevel(logging.DEBUG) | ||
|  | namedConsoleHandler = logging.StreamHandler() | ||
|  | namedConsoleHandler.setLevel(logging.DEBUG) | ||
|  | namedFormatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s %(name_of_class)s") | ||
|  | namedConsoleHandler.setFormatter(namedFormatter) | ||
|  | namedLogger.addHandler(namedConsoleHandler) | ||
|  | 
 | ||
|  | # 2. "anonymousLogger" is defined to log message in this format: | ||
|  | #    "%(asctime)s - %(levelname)s - %(message)s" | ||
|  | #  | ||
|  | # usage: to log message without showing class name and it's appropriate | ||
|  | #        for logging generic message such as "sleeping for 5 seconds" | ||
|  | 
 | ||
|  | anonymousLogger = logging.getLogger("anonymousLogger") | ||
|  | anonymousLogger.setLevel(logging.INFO) | ||
|  | #anonymousLogger.setLevel(logging.DEBUG) | ||
|  | anonymousConsoleHandler = logging.StreamHandler() | ||
|  | anonymousConsoleHandler.setLevel(logging.DEBUG) | ||
|  | anonymousFormatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") | ||
|  | anonymousConsoleHandler.setFormatter(anonymousFormatter) | ||
|  | anonymousLogger.addHandler(anonymousConsoleHandler) | ||
|  | 
 | ||
|  | d = {'name_of_class': '(system_test_runner)'} | ||
|  | 
 | ||
|  | def main(): | ||
|  | 
 | ||
|  |     print | ||
|  |     print | ||
|  |     print | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     anonymousLogger.info("        System Regression Test Framework") | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     print | ||
|  |     print | ||
|  | 
 | ||
|  |     testSuiteClassDictList = [] | ||
|  | 
 | ||
|  |     # SystemTestEnv is a class to provide all environement settings for this session | ||
|  |     # such as the SYSTEM_TEST_BASE_DIR, SYSTEM_TEST_UTIL_DIR, ... | ||
|  |     systemTestEnv = SystemTestEnv() | ||
|  | 
 | ||
|  |     # sanity check on remote hosts to make sure: | ||
|  |     # - all directories (eg. java_home) specified in cluster_config.json exists in all hosts | ||
|  |     # - no conflicting running processes in remote hosts | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     anonymousLogger.info("setting up remote hosts ...") | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     if not system_test_utils.setup_remote_hosts(systemTestEnv): | ||
|  |         namedLogger.error("Remote hosts sanity check failed. Aborting test ...", extra=d) | ||
|  |         print | ||
|  |         sys.exit(1) | ||
|  |     print | ||
|  | 
 | ||
|  |     # get all defined names within a module:  | ||
|  |     definedItemList = dir(SystemTestEnv) | ||
|  |     anonymousLogger.debug("=================================================") | ||
|  |     anonymousLogger.debug("SystemTestEnv keys:") | ||
|  |     for item in definedItemList: | ||
|  |         anonymousLogger.debug("    " + item) | ||
|  |     anonymousLogger.debug("=================================================") | ||
|  | 
 | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     anonymousLogger.info("looking up test suites ...") | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     # find all test suites in SYSTEM_TEST_BASE_DIR | ||
|  |     for dirName in os.listdir(systemTestEnv.SYSTEM_TEST_BASE_DIR): | ||
|  | 
 | ||
|  |         # make sure this is a valid testsuite directory | ||
|  |         if os.path.isdir(dirName) and dirName.endswith(systemTestEnv.SYSTEM_TEST_SUITE_SUFFIX): | ||
|  |              | ||
|  |             namedLogger.info("found a testsuite : " + dirName, extra=d) | ||
|  |             testModulePathName = os.path.abspath(systemTestEnv.SYSTEM_TEST_BASE_DIR + "/" + dirName) | ||
|  | 
 | ||
|  |             # go through all test modules file in this testsuite | ||
|  |             for moduleFileName in os.listdir(testModulePathName): | ||
|  | 
 | ||
|  |                 # make sure it is a valid test module | ||
|  |                 if moduleFileName.endswith(systemTestEnv.SYSTEM_TEST_MODULE_EXT) \ | ||
|  |                    and not moduleFileName.startswith("__"): | ||
|  | 
 | ||
|  |                     # found a test module file | ||
|  |                     namedLogger.info("found a test module file : " + moduleFileName, extra=d)  | ||
|  | 
 | ||
|  |                     testModuleClassName = system_test_utils.sys_call("grep ^class " + testModulePathName + "/" + \ | ||
|  |                                           moduleFileName + " | sed 's/^class //g' | sed 's/(.*):.*//g'") | ||
|  |                     testModuleClassName = testModuleClassName.rstrip('\n') | ||
|  | 
 | ||
|  |                     # collect the test suite class data | ||
|  |                     testSuiteClassDict           = {} | ||
|  |                     testSuiteClassDict["suite"]  = dirName | ||
|  |                     extLenToRemove               = systemTestEnv.SYSTEM_TEST_MODULE_EXT.__len__() * -1  | ||
|  |                     testSuiteClassDict["module"] = moduleFileName[:extLenToRemove] | ||
|  |                     testSuiteClassDict["class"]  = testModuleClassName | ||
|  |                     testSuiteClassDictList.append(testSuiteClassDict) | ||
|  | 
 | ||
|  |     # loop through testSuiteClassDictList and start the test class one by one | ||
|  |     for testSuiteClassDict in testSuiteClassDictList: | ||
|  | 
 | ||
|  |         suiteName  = testSuiteClassDict["suite"] | ||
|  |         moduleName = testSuiteClassDict["module"] | ||
|  |         className  = testSuiteClassDict["class"] | ||
|  | 
 | ||
|  |         # add testsuite directory to sys.path such that the module can be loaded | ||
|  |         sys.path.append(systemTestEnv.SYSTEM_TEST_BASE_DIR + "/" + suiteName) | ||
|  | 
 | ||
|  |         anonymousLogger.info("=================================================") | ||
|  |         anonymousLogger.info("Running Test for : ") | ||
|  |         anonymousLogger.info("    suite  : " + suiteName) | ||
|  |         anonymousLogger.info("    module : " + moduleName) | ||
|  |         anonymousLogger.info("    class  : " + className) | ||
|  |         anonymousLogger.info("=================================================") | ||
|  | 
 | ||
|  |         # dynamically loading a module and starting the test class | ||
|  |         mod      = __import__(moduleName) | ||
|  |         theClass = getattr(mod, className) | ||
|  |         instance = theClass(systemTestEnv) | ||
|  |         instance.runTest() | ||
|  | 
 | ||
|  |     print | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     anonymousLogger.info("                 TEST REPORTS") | ||
|  |     anonymousLogger.info("=================================================") | ||
|  |     for systemTestResult in systemTestEnv.systemTestResultsList: | ||
|  |         for key,val in systemTestResult.items(): | ||
|  |             if key == "validation_status": | ||
|  |                 anonymousLogger.info(key + " : ") | ||
|  |                 for validation, status in val.items(): | ||
|  |                      anonymousLogger.info("    " + validation + " : " + status) | ||
|  |             else: | ||
|  |                 anonymousLogger.info(key + " : " + val) | ||
|  |         print | ||
|  | 
 | ||
|  | # ========================= | ||
|  | # main entry point | ||
|  | # ========================= | ||
|  | 
 | ||
|  | main() | ||
|  | 
 | ||
|  | 
 |