blob: 98f252253d98fd70df4573c7da08a6fdbfd2d5c8 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2014 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.
"""A test runner for gtest application tests."""
import argparse
import ast
import logging
import sys
_logging = logging.getLogger()
from mopy import android
from mopy import gtest
from mopy.background_app_group import BackgroundAppGroup
from mopy.config import Config
from mopy.gn import ConfigForGNArgs, ParseGNConfig
from mopy.paths import Paths
def main():
logging.basicConfig()
# Uncomment to debug:
#_logging.setLevel(logging.DEBUG)
parser = argparse.ArgumentParser(description='A test runner for gtest '
'application tests.')
parser.add_argument('apptest_list_file', type=file,
help='A file listing apptests to run.')
parser.add_argument('build_dir', type=str,
help='The build output directory.')
args = parser.parse_args()
config = ConfigForGNArgs(ParseGNConfig(args.build_dir))
# TODO(msw) Remove this DEBUG logging before closing http://crbug.com/460621
if config.target_os == Config.OS_ANDROID:
_logging.setLevel(logging.DEBUG)
execution_globals = {
"config": config,
}
exec args.apptest_list_file in execution_globals
apptest_list = execution_globals["tests"]
_logging.debug("Test list: %s" % apptest_list)
android_origin_argument = None
if config.target_os == Config.OS_ANDROID:
android_origin_argument = android.PrepareShellRun(config)
gtest.set_color()
mojo_paths = Paths(config)
exit_code = 0
for apptest_dict in apptest_list:
apptest = apptest_dict["test"]
test_args = apptest_dict.get("test-args", [])
shell_args = apptest_dict.get("shell-args", [])
if android_origin_argument:
shell_args.append(android_origin_argument)
launched_services = apptest_dict.get("launched-services", [])
print "Running " + apptest + "...",
sys.stdout.flush()
# List the apptest fixtures so they can be run independently for isolation.
# TODO(msw): Run some apptests without fixture isolation?
fixtures = gtest.get_fixtures(config, shell_args, apptest)
if not fixtures:
print "Failed with no tests found."
exit_code = 1
continue
if any(not mojo_paths.IsValidAppUrl(url) for url in launched_services):
print "Failed with malformed launched-services: %r" % launched_services
exit_code = 1
continue
apptest_result = "Succeeded"
for fixture in fixtures:
apptest_args = test_args + ["--gtest_filter=%s" % fixture]
if launched_services:
success = RunApptestInLauncher(config, mojo_paths, apptest,
apptest_args, shell_args,
launched_services)
else:
success = RunApptestInShell(config, apptest, apptest_args, shell_args)
if not success:
apptest_result = "Failed test(s) in %r" % apptest_dict
exit_code = 1
print apptest_result
return exit_code
def RunApptestInShell(config, application, application_args, shell_args):
return gtest.run_test(config, shell_args, {application: application_args})
def RunApptestInLauncher(config, mojo_paths, application, application_args,
shell_args, launched_services):
with BackgroundAppGroup(
mojo_paths, launched_services,
gtest.build_shell_arguments(shell_args)) as apps:
launcher_args = [
'--shell-path=' + apps.socket_path,
'--app-url=' + application,
'--app-path=' + mojo_paths.FileFromUrl(application),
'--app-args=' + " ".join(application_args)]
return gtest.run_test(config, launcher_args, run_launcher=True)
if __name__ == '__main__':
sys.exit(main())