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()
 | |
| 
 | |
| 
 |