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