xref: /aosp_15_r20/external/angle/scripts/angle_deqp_bundle.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/python3
2*8975f5c5SAndroid Build Coastguard Worker#
3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2023 The ANGLE Project Authors. All rights reserved.
4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker#
7*8975f5c5SAndroid Build Coastguard Worker# angle_deqp_bundle.py:
8*8975f5c5SAndroid Build Coastguard Worker#   Makes a zip bundle allowing to run deqp tests, similarly to mb.py but
9*8975f5c5SAndroid Build Coastguard Worker#    - trims most of the dependencies
10*8975f5c5SAndroid Build Coastguard Worker#    - includes run_tests.sh (see below)
11*8975f5c5SAndroid Build Coastguard Worker#    - lib.unstripped only included if --include-unstripped-libs
12*8975f5c5SAndroid Build Coastguard Worker#    - does not depend on vpython
13*8975f5c5SAndroid Build Coastguard Worker#    - just adds files to the zip instead of "isolate remap" with a temp dir
14*8975f5c5SAndroid Build Coastguard Worker#
15*8975f5c5SAndroid Build Coastguard Worker#  Example usage:
16*8975f5c5SAndroid Build Coastguard Worker#    % scripts/angle_deqp_bundle.py out/Android angle_deqp_gles31_rotate90_tests angle_deqp_bundle.zip
17*8975f5c5SAndroid Build Coastguard Worker#
18*8975f5c5SAndroid Build Coastguard Worker#    (transfer the zip elsewhere)
19*8975f5c5SAndroid Build Coastguard Worker#    % unzip angle_deqp_bundle.zip -d angle_deqp_bundle
20*8975f5c5SAndroid Build Coastguard Worker#    % angle_deqp_bundle/run_tests.sh --list-tests
21*8975f5c5SAndroid Build Coastguard Worker#    % angle_deqp_bundle/run_tests.sh --gtest_filter='dEQP-GLES31.functional.primitive_bounding_box.triangles.*'
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Workerimport argparse
24*8975f5c5SAndroid Build Coastguard Workerimport json
25*8975f5c5SAndroid Build Coastguard Workerimport os
26*8975f5c5SAndroid Build Coastguard Workerimport subprocess
27*8975f5c5SAndroid Build Coastguard Workerimport sys
28*8975f5c5SAndroid Build Coastguard Workerimport zipfile
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard WorkerRUN_TESTS_TEMPLATE = r'''#!/bin/bash
31*8975f5c5SAndroid Build Coastguard Workercd "$(dirname "$0")"
32*8975f5c5SAndroid Build Coastguard Workerpython3 src/tests/angle_android_test_runner.py gtest --suite={suite} --output-directory={gn_dir} "$@"
33*8975f5c5SAndroid Build Coastguard Worker'''
34*8975f5c5SAndroid Build Coastguard Worker
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Workerdef main():
37*8975f5c5SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser()
38*8975f5c5SAndroid Build Coastguard Worker    parser.add_argument('gn_dir', help='path to GN. (e.g. out/Android)')
39*8975f5c5SAndroid Build Coastguard Worker    parser.add_argument('suite', help='dEQP suite (e.g. angle_deqp_gles31_rotate90_tests)')
40*8975f5c5SAndroid Build Coastguard Worker    parser.add_argument('output_zip_file', help='output zip file')
41*8975f5c5SAndroid Build Coastguard Worker    parser.add_argument(
42*8975f5c5SAndroid Build Coastguard Worker        '--include-unstripped-libs', action='store_true', help='include lib.unstripped')
43*8975f5c5SAndroid Build Coastguard Worker    args, _ = parser.parse_known_args()
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker    gn_dir = os.path.join(os.path.normpath(args.gn_dir), '')
46*8975f5c5SAndroid Build Coastguard Worker    suite = args.suite
47*8975f5c5SAndroid Build Coastguard Worker    assert os.path.sep == '/' and gn_dir.endswith('/')
48*8975f5c5SAndroid Build Coastguard Worker    assert gn_dir[0] not in ('.', '/')  # expecting relative to angle root
49*8975f5c5SAndroid Build Coastguard Worker
50*8975f5c5SAndroid Build Coastguard Worker    subprocess.check_call([
51*8975f5c5SAndroid Build Coastguard Worker        'python3', 'tools/mb/mb.py', 'isolate', gn_dir, suite, '-i',
52*8975f5c5SAndroid Build Coastguard Worker        'infra/specs/gn_isolate_map.pyl'
53*8975f5c5SAndroid Build Coastguard Worker    ])
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker    with open(os.path.join(args.gn_dir, '%s.isolate' % suite)) as f:
56*8975f5c5SAndroid Build Coastguard Worker        isolate_file_paths = json.load(f)['variables']['files']
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker    # Currently not in deps, add manually
59*8975f5c5SAndroid Build Coastguard Worker    isolate_file_paths.append('../../src/tests/angle_android_test_runner.py')
60*8975f5c5SAndroid Build Coastguard Worker
61*8975f5c5SAndroid Build Coastguard Worker    skipped_prefixes = [
62*8975f5c5SAndroid Build Coastguard Worker        'build/',
63*8975f5c5SAndroid Build Coastguard Worker        'third_party/catapult/',
64*8975f5c5SAndroid Build Coastguard Worker        'third_party/colorama/',
65*8975f5c5SAndroid Build Coastguard Worker        'third_party/jdk/',
66*8975f5c5SAndroid Build Coastguard Worker        'third_party/jinja2/',
67*8975f5c5SAndroid Build Coastguard Worker        'third_party/logdog/',
68*8975f5c5SAndroid Build Coastguard Worker        'third_party/r8/',
69*8975f5c5SAndroid Build Coastguard Worker        'third_party/requests/',
70*8975f5c5SAndroid Build Coastguard Worker        os.path.join(gn_dir, 'lib.java/'),
71*8975f5c5SAndroid Build Coastguard Worker        os.path.join(gn_dir, 'obj/'),
72*8975f5c5SAndroid Build Coastguard Worker    ]
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker    if not args.include_unstripped_libs:
75*8975f5c5SAndroid Build Coastguard Worker        skipped_prefixes.append(os.path.join(gn_dir, 'lib.unstripped/'))
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker    with zipfile.ZipFile(args.output_zip_file, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) as fzip:
78*8975f5c5SAndroid Build Coastguard Worker        for fn in isolate_file_paths:
79*8975f5c5SAndroid Build Coastguard Worker            path = os.path.normpath(os.path.join(gn_dir, fn))
80*8975f5c5SAndroid Build Coastguard Worker            if any(path.startswith(p) for p in skipped_prefixes):
81*8975f5c5SAndroid Build Coastguard Worker                continue
82*8975f5c5SAndroid Build Coastguard Worker
83*8975f5c5SAndroid Build Coastguard Worker            fzip.write(path)
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker        # Create a script directly inside the zip file
86*8975f5c5SAndroid Build Coastguard Worker        info = zipfile.ZipInfo('run_tests.sh')
87*8975f5c5SAndroid Build Coastguard Worker        info.external_attr = 0o755 << 16  # unnecessarily obscure way to chmod 755...
88*8975f5c5SAndroid Build Coastguard Worker        fzip.writestr(info, RUN_TESTS_TEMPLATE.format(gn_dir=gn_dir, suite=suite))
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker    return 0
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
94*8975f5c5SAndroid Build Coastguard Worker    sys.exit(main())
95