#!/usr/bin/env python # Copyright 2020 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. """Runs an isolated non-Telemetry ANGLE test. The main contract is that the caller passes the arguments: --isolated-script-test-output=[FILENAME] json is written to that file in the format: https://chromium.googlesource.com/chromium/src/+/master/docs/testing/json_test_results_format.md Optional argument: --isolated-script-test-filter=[TEST_NAMES] is a double-colon-separated ("::") list of test names, to run just that subset of tests. This list is parsed by this harness and sent down via the --gtest_filter argument. This script is intended to be the base command invoked by the isolate, followed by a subsequent non-python executable. For a similar script see run_performance_test.py. """ import argparse import json import os import shutil import sys import tempfile import traceback # Add //src/testing into sys.path for importing xvfb and test_env, and # //src/testing/scripts for importing common. d = os.path.dirname THIS_DIR = d(os.path.abspath(__file__)) ANGLE_SRC_DIR = d(THIS_DIR) sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'testing')) sys.path.insert(0, os.path.join(ANGLE_SRC_DIR, 'testing', 'scripts')) CHROMIUM_SRC_DIR = d(d(ANGLE_SRC_DIR)) sys.path.insert(0, os.path.join(CHROMIUM_SRC_DIR, 'testing')) sys.path.insert(0, os.path.join(CHROMIUM_SRC_DIR, 'testing', 'scripts')) import common import xvfb import test_env # Unfortunately we need to copy these variables from # //src/testing/scripts/test_env.py. Importing it and using its # get_sandbox_env breaks test runs on Linux (it seems to unset DISPLAY). CHROME_SANDBOX_ENV = 'CHROME_DEVEL_SANDBOX' CHROME_SANDBOX_PATH = '/opt/chromium/chrome_sandbox' def IsWindows(): return sys.platform == 'cygwin' or sys.platform.startswith('win') def main(): parser = argparse.ArgumentParser() parser.add_argument('executable', help='Test executable.') parser.add_argument('--isolated-script-test-output', type=str) parser.add_argument('--isolated-script-test-filter', type=str) parser.add_argument('--xvfb', help='Start xvfb.', action='store_true') # Kept for compatiblity. # TODO(jmadill): Remove when removed from the recipes. http://crbug.com/954415 parser.add_argument('--isolated-script-test-perf-output', type=str) args, extra_flags = parser.parse_known_args() env = os.environ.copy() if 'GTEST_TOTAL_SHARDS' in env: extra_flags += ['--shard-count=' + env['GTEST_TOTAL_SHARDS']] env.pop('GTEST_TOTAL_SHARDS') if 'GTEST_SHARD_INDEX' in env: extra_flags += ['--shard-index=' + env['GTEST_SHARD_INDEX']] env.pop('GTEST_SHARD_INDEX') if 'ISOLATED_OUTDIR' in env: extra_flags += ['--isolated-outdir=' + env['ISOLATED_OUTDIR']] env.pop('ISOLATED_OUTDIR') # Assume we want to set up the sandbox environment variables all the # time; doing so is harmless on non-Linux platforms and is needed # all the time on Linux. env[CHROME_SANDBOX_ENV] = CHROME_SANDBOX_PATH rc = 0 try: # Consider adding stdio control flags. if args.isolated_script_test_output: extra_flags.append('--isolated-script-test-output=%s' % args.isolated_script_test_output) if args.isolated_script_test_filter: filter_list = common.extract_filter_list(args.isolated_script_test_filter) extra_flags.append('--gtest_filter=' + ':'.join(filter_list)) if IsWindows(): args.executable = '.\\%s.exe' % args.executable else: args.executable = './%s' % args.executable with common.temporary_file() as tempfile_path: env['CHROME_HEADLESS'] = '1' cmd = [args.executable] + extra_flags if args.xvfb: rc = xvfb.run_executable(cmd, env, stdoutfile=tempfile_path) else: rc = test_env.run_command_with_output(cmd, env=env, stdoutfile=tempfile_path) except Exception: traceback.print_exc() rc = 1 return rc # This is not really a "script test" so does not need to manually add # any additional compile targets. def main_compile_targets(args): json.dump([], args.output) if __name__ == '__main__': # Conform minimally to the protocol defined by ScriptTest. if 'compile_targets' in sys.argv: funcs = { 'run': None, 'compile_targets': main_compile_targets, } sys.exit(common.run_script(sys.argv[1:], funcs)) sys.exit(main())