| #!/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 | 
 | from devtoolslib import shell_config | 
 |  | 
 | _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(): | 
 |   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 = {"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, | 
 |     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()) |