#!/usr/bin/env python # Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Test runner for Mojo application tests. TODO(vtl|msw): Add a way of specifying data dependencies. """ import argparse import logging import sys from devtoolslib import apptest_dart from devtoolslib import apptest_gtest from devtoolslib import shell_arguments _DESCRIPTION = """Runner for Mojo application tests. |test_list_file| has to be a valid Python program that sets a |tests| global variable, containing entries of the following form: { # Required URL for apptest. "test": "mojo:test_app_url", # Optional display name (otherwise the entry for "test" above is used). "name": "mojo:test_app_url (more details)", # Optional test type. Valid values: # * "gtest" (default) # * "gtest_isolated": like "gtest", but run with fixture isolation, # i.e., each test in a fresh mojo_shell # * "dart" "type": "gtest", # Optional arguments to be passed to the apptest. "test-args": ["--an_arg", "another_arg"], # Optional shell arguments. "shell-args": ["--some-flag-for-the-shell", "--another-flag"], # Optional timeout in seconds, 60 by default. "timeout": 120, } |test_list_file| may reference the |target_os| global that will be any of ['android', 'linux'], indicating the system on which the tests are to be run. Any arguments not recognized by the script will be passed on as shell arguments. """ _logger = logging.getLogger() def main(): parser = argparse.ArgumentParser( formatter_class=argparse.RawDescriptionHelpFormatter, description=_DESCRIPTION) parser.add_argument("test_list_file", type=file, help="a file listing apptests to run") # Common shell configuration arguments. shell_arguments.add_shell_arguments(parser) script_args, common_shell_args = parser.parse_known_args() try: shell, common_shell_args = shell_arguments.configure_shell( script_args, common_shell_args) except shell_arguments.ShellConfigurationException as e: print e return 1 target_os = "android" if script_args.android else "linux" test_list_globals = {"target_os": target_os} exec script_args.test_list_file in test_list_globals test_list = test_list_globals["tests"] succeeded = True for test_dict in test_list: test = test_dict["test"] test_name = test_dict.get("name", test) test_type = test_dict.get("type", "gtest") test_args = test_dict.get("test-args", []) shell_args = test_dict.get("shell-args", []) + common_shell_args timeout = test_dict.get("timeout", 60) _logger.info("Will start: %s" % test_name) print "Running %s...." % test_name, sys.stdout.flush() if test_type == "dart": apptest_result = apptest_dart.run_dart_apptest(shell, shell_args, test, test_args, timeout) elif test_type == "gtest": apptest_result = apptest_gtest.run_gtest_apptest(shell, shell_args, test, test_args, timeout, False) elif test_type == "gtest_isolated": apptest_result = apptest_gtest.run_gtest_apptest(shell, shell_args, test, test_args, timeout, True) else: apptest_result = False print "Unrecognized test type in %r" % test_dict print "Succeeded" if apptest_result else "Failed" _logger.info("Completed: %s" % test_name) if not apptest_result: succeeded = False return 0 if succeeded else 1 if __name__ == '__main__': sys.exit(main())