def RunTests(target_platform, configuration, parallel_num): """Run built tests actually. Args: target_platform: The build target ('Linux', 'Windows', etc.) configuration: build configuration ('Release' or 'Debug') parallel_num: allows specified jobs at once. Raises: RunOrDieError: One or more tests have failed. """ # TODO(nona): move this function to build_tools/test_tools base_path = os.path.join(GetBuildBaseName(target_platform), configuration) options = [] # Specify the log_dir directory. # base_path looks like out_mac/Debug. options.append('--log_dir=%s' % base_path) failed_tests = [] # This is a silly algorithm: it runs *all* tests built in the target # directory. Therefore, if you build multiple tests without # cleaning, the second runtests runs every test. # TODO(mukai): parses gyp files and get the target binaries, if possible. executable_suffix = '' test_function = RunTest if target_platform == 'Windows': executable_suffix = '.exe' elif target_platform == 'iOS': executable_suffix = '.app' test_function = RunTestOnIos parallel_num = 1 test_binaries = glob.glob( os.path.join(base_path, '*_test' + executable_suffix)) # Prepare gtest_report directory. gtest_report_dir = os.path.abspath(os.path.join(base_path, 'gtest_report')) if os.path.exists(gtest_report_dir): # Clear existing gtest reports. RemoveDirectoryRecursively(gtest_report_dir) os.makedirs(gtest_report_dir) failed_tests = [] # Create default test reports in case any test process crashes and cannot # leave test result as a XML report. # TODO(yukawa): Move this template to test_tools/gtest_report.py. xml_template = ( '<?xml version="1.0" encoding="UTF-8"?>\n' ' <testsuite name="%s" tests="1" errors="1">\n' ' <testcase name="No reporting XML">\n' ' <error message="No reporting XML has been generated. ' 'Process crash?" />\n' ' </testcase>\n' '</testsuite>\n') for binary in test_binaries: binary_filename = os.path.basename(binary) xml_path = os.path.join(gtest_report_dir, '%s.xml' % binary_filename) with open(xml_path, 'w') as f: f.write(xml_template % binary_filename) if parallel_num == 1: for binary in test_binaries: logging.info('running %s...', binary) try: test_function(binary, gtest_report_dir, options) except RunOrDieError as e: logging.error(e) failed_tests.append(binary) else: launcher = test_launcher.TestLauncher(gtest_report_dir) for binary in test_binaries: launcher.AddTestCommand([binary] + options) failed_tests = launcher.Execute(parallel_num) if failed_tests: error_text = ColoredText('following tests failed', logging.ERROR) raise RunOrDieError('\n'.join([error_text] + failed_tests))
for binary in test_binaries: binary_filename = os.path.basename(binary) xml_path = os.path.join(gtest_report_dir, '%s.xml' % binary_filename) with open(xml_path, 'w') as f: f.write(xml_template % binary_filename) if parallel_num == 1: for binary in test_binaries: logging.info('running %s...', binary) try: test_function(binary, gtest_report_dir, options) except RunOrDieError, e: logging.error(e) failed_tests.append(binary) else: launcher = test_launcher.TestLauncher(gtest_report_dir) for binary in test_binaries: launcher.AddTestCommand([binary] + options) failed_tests = launcher.Execute(parallel_num) if failed_tests: error_text = ColoredText('following tests failed', logging.ERROR) raise RunOrDieError('\n'.join([error_text] + failed_tests)) def RunTestsOnAndroid(options, build_args): """Run a test suite for the Android version.""" try: emulators = [] serialnumbers = [] if options.android_device: