#!/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

_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 = {
    "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,
    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())
