# 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.

"""Apptest is a Mojo application that interacts with another Mojo application
and verifies assumptions about behavior of the app being tested.
"""

import logging
import time


_logger = logging.getLogger()


def _build_shell_arguments(shell_args, apptest_url, apptest_args):
  """Builds the list of arguments for the shell.

  Args:
    shell_args: List of arguments for the shell run.
    apptest_url: Url of the apptest app to run.
    apptest_args: Parameters to be passed to the apptest app.

  Returns:
    Single list of shell arguments.
  """
  result = list(shell_args)
  if apptest_args:
    result.append("--args-for=%s %s" % (apptest_url, " ".join(apptest_args)))
  result.append(apptest_url)
  return result


def run_apptest(shell, shell_args, apptest_url, apptest_args, timeout,
                output_test):
  """Runs shell with the given arguments, retrieves the output and applies
  |output_test| to determine if the run was successful.

  Args:
    shell: Wrapper around concrete Mojo shell, implementing devtools Shell
        interface.
    shell_args: List of arguments for the shell run.
    apptest_url: Url of the apptest app to run.
    apptest_args: Parameters to be passed to the apptest app.
    output_test: Function accepting the shell output and returning True iff
        the output indicates a successful run.

  Returns:
    True iff the test succeeded, False otherwise.
  """
  arguments = _build_shell_arguments(shell_args, apptest_url, apptest_args)
  command_line = "mojo_shell " + " ".join(["%r" % x for x in arguments])

  _logger.debug("Starting: " + command_line)
  start_time = time.time()
  (exit_code, output, did_time_out) = shell.run_and_get_output(arguments,
                                                               timeout)
  run_time = time.time() - start_time
  _logger.debug("Completed: " + command_line)

  # Only log if it took more than 3 second.
  if run_time >= 3:
    _logger.info("Test took %.3f seconds: %s" % (run_time, command_line))

  if exit_code or did_time_out or not output_test(output):
    print 'Failed test: %r' % command_line
    if exit_code:
      print '  due to shell exit code %d' % exit_code
    elif did_time_out:
      print '  due to exceeded timeout of %fs' % timeout
    else:
      print '  due to test results'
    print 72 * '-'
    print output
    print 72 * '-'
    return False
  return True
