Hash :
71b7b5ee
Author :
Date :
2025-08-04T18:44:35
Add KHR-GLESEXT test suite * Added rules to build new dEQP test binary to run KHR-GLESEXT tests: angle_deqp_khr_glesext_tests Bug: b/436389014 Change-Id: I53b74605d3c2a9a5f6a8fece17bc3f7656a6772c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6820701 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Amirali Abdolrashidi <abdolrashidi@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
#! /usr/bin/env vpython3
#
# Copyright 2023 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# angle_android_test_runner.py:
# Runs (a subset of) ANGLE tests on Android using android_helper
# instead of chromium test_runner scripts. This script is integrated into
# gn builds via the android_test_runner_script var, which creates wrappers
# (out/<config>/angle_trace_tests) calling into this script
# with additional args like --output-directory=out/<config> etc
import argparse
import json
import logging
import os
import pathlib
import subprocess
import sys
PY_UTILS = str(pathlib.Path(__file__).resolve().parent / 'py_utils')
if PY_UTILS not in sys.path:
os.stat(PY_UTILS) and sys.path.insert(0, PY_UTILS)
import android_helper
import angle_path_util
import angle_test_util
def AddCommonParserArgs(parser):
parser.add_argument(
'--suite',
help='Test suite to run.',
required=True,
choices=[
'angle_end2end_tests',
'angle_perftests',
'angle_trace_tests',
'angle_unittests',
# dEQP - grep \"angle_deqp infra/specs/gn_isolate_map.pyl
'angle_deqp_egl_tests',
'angle_deqp_gles2_tests',
'angle_deqp_gles31_rotate180_tests',
'angle_deqp_gles31_rotate270_tests',
'angle_deqp_gles31_rotate90_tests',
'angle_deqp_gles31_tests',
'angle_deqp_gles3_rotate180_tests',
'angle_deqp_gles3_rotate270_tests',
'angle_deqp_gles3_rotate90_tests',
'angle_deqp_gles3_tests',
'angle_deqp_khr_gles2_tests',
'angle_deqp_khr_gles31_tests',
'angle_deqp_khr_gles32_tests',
'angle_deqp_khr_gles3_tests',
'angle_deqp_khr_glesext_tests',
'angle_deqp_khr_noctx_gles2_tests',
'angle_deqp_khr_noctx_gles32_tests',
'angle_deqp_khr_single_gles32_tests',
])
parser.add_argument('-l', '--log', help='Logging level.', default='info')
parser.add_argument('--list-tests', help='List tests.', action='store_true')
parser.add_argument(
'-f',
'--filter',
'--isolated-script-test-filter',
'--gtest_filter',
type=str,
help='Test filter.')
parser.add_argument(
'--prepare-only',
help='Only prepare traces, but do not actually run them.',
action='store_true')
def RunWithAngleTestRunner(args, extra_args):
angle_test_util.SetupLogging(args.log.upper())
android_helper.Initialize(args.suite)
assert android_helper.IsAndroid()
rc, output, _ = android_helper.RunTests(
args.suite, ['--list-tests', '--verbose'] + extra_args, log_output=False)
if rc != 0:
logging.fatal('Could not find test list from test output:\n%s' % output)
return rc
tests = angle_test_util.GetTestsFromOutput(output)
if not tests:
logging.fatal('Could not find test list from test output:\n%s' % output)
return 1
if args.filter:
tests = angle_test_util.FilterTests(tests, args.filter)
if args.list_tests:
print('\n'.join(['Tests list:'] + tests + ['End tests list.']))
return 0
if args.suite == 'angle_trace_tests':
traces = set(android_helper.GetTraceFromTestName(test) for test in tests)
android_helper.PrepareRestrictedTraces(traces)
if args.prepare_only:
print('Prepared traces: %s' % traces)
return 0
flags = ['--gtest_filter=' + args.filter] if args.filter else []
return android_helper.RunTests(args.suite, flags + extra_args)[0]
def RunWithChromiumTestRunner():
# Import only here to avoid breaking trace bundles and other catapult imports
angle_path_util.AddDepsDirToPath('build/android')
import test_runner
# Workaround from test_runner's __main__
exit_code = test_runner.main()
if exit_code == test_runner.constants.INFRA_EXIT_CODE:
sys.stdout.flush()
sys.stderr.flush()
os._exit(exit_code)
return exit_code
def CheckDeviceScreenState():
screen_state = subprocess.check_output(
[android_helper.FindAdb(), 'shell',
'dumpsys deviceidle | grep mScreen || true']).decode().split()
expected_screen_state = ['mScreenOn=true', 'mScreenLocked=false']
if not set(expected_screen_state).issubset(screen_state):
raise Exception('Unexpected device screen state: %s; expected: %s' %
(screen_state, expected_screen_state))
def main():
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-h', '--help', action='store_true')
parser.add_argument('test_type', choices=['gtest'])
parser.add_argument('--output-directory', required=True)
parser.add_argument('--wrapper-script-args')
parser.add_argument('--runtime-deps-path')
AddCommonParserArgs(parser)
parser.add_argument(
'--angle-test-runner',
help='Use ANGLE test runner instead of Chromium/catapult',
action='store_true')
args, extra_args = parser.parse_known_args()
if not args.help:
CheckDeviceScreenState()
if args.angle_test_runner or args.suite == 'angle_trace_tests':
if args.help:
parser.print_help()
else:
os.chdir(args.output_directory)
return RunWithAngleTestRunner(args, extra_args)
else:
# Chromium runner parses args by itself, including --help
return RunWithChromiumTestRunner()
if __name__ == "__main__":
sys.exit(main())