| #!/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 |
| import os.path |
| |
| from devtoolslib import apptest_dart |
| from devtoolslib import apptest_gtest |
| from devtoolslib import shell_arguments |
| from devtoolslib import shell_config |
| from devtoolslib.utils import disable_output_buffering |
| |
| _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, |
| # Optional override for dart content handler strict mode (on by default). |
| "dart_strict_mode": False, |
| } |
| |
| |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() |
| |
| _CACHE_SERVICE_URL = 'mojo:url_response_disk_cache' |
| _NETWORK_SERVICE_URL = 'mojo:network_service' |
| _DART_STRICT_MODE_ARG = ('--args-for=mojo:dart_content_handler ' |
| '--enable-strict-mode') |
| |
| |
| def main(): |
| disable_output_buffering() |
| parser = argparse.ArgumentParser( |
| formatter_class=argparse.RawDescriptionHelpFormatter, |
| description=_DESCRIPTION) |
| parser.add_argument("test_list_file", type=file, |
| help="a file listing apptests to run") |
| shell_config.add_shell_arguments(parser) |
| |
| script_args, shell_args = parser.parse_known_args() |
| |
| try: |
| config = shell_config.get_shell_config(script_args) |
| shell, common_shell_args = shell_arguments.get_shell(config, shell_args) |
| # Tests must be reproducible, start with empty caches. |
| common_shell_args.append( |
| "--args-for=%s %s" % (_CACHE_SERVICE_URL, "--clear")) |
| common_shell_args.append( |
| "--args-for=%s %s" % (_NETWORK_SERVICE_URL, "--clear")) |
| except shell_config.ShellConfigurationException as e: |
| print e |
| return 1 |
| |
| target_os = "android" if script_args.android else "linux" |
| test_list_globals = { |
| "shell_path": config.shell_path, |
| "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) |
| dart_strict_mode = test_dict.get("dart_strict_mode", True) |
| if dart_strict_mode: |
| shell_args.append(_DART_STRICT_MODE_ARG) |
| |
| _logger.info("Will start: %s" % test_name) |
| print "Running %s...." % test_name, |
| |
| 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()) |