#!/usr/bin/python3
#
# 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_deqp_bundle.py:
#   Makes a zip bundle allowing to run deqp tests, similarly to mb.py but
#    - trims most of the dependencies
#    - includes run_tests.sh (see below)
#    - lib.unstripped only included if --include-unstripped-libs
#    - does not depend on vpython
#    - just adds files to the zip instead of "isolate remap" with a temp dir
#
#  Example usage:
#    % scripts/angle_deqp_bundle.py out/Android angle_deqp_gles31_rotate90_tests angle_deqp_bundle.zip
#
#    (transfer the zip elsewhere)
#    % unzip angle_deqp_bundle.zip -d angle_deqp_bundle
#    % angle_deqp_bundle/run_tests.sh --list-tests
#    % angle_deqp_bundle/run_tests.sh --gtest_filter='dEQP-GLES31.functional.primitive_bounding_box.triangles.*'

import argparse
import json
import os
import subprocess
import sys
import zipfile

RUN_TESTS_TEMPLATE = r'''#!/bin/bash
cd "$(dirname "$0")"
python3 src/tests/angle_android_test_runner.py gtest --suite={suite} --output-directory={gn_dir} "$@"
'''


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('gn_dir', help='path to GN. (e.g. out/Android)')
    parser.add_argument('suite', help='dEQP suite (e.g. angle_deqp_gles31_rotate90_tests)')
    parser.add_argument('output_zip_file', help='output zip file')
    parser.add_argument(
        '--include-unstripped-libs', action='store_true', help='include lib.unstripped')
    args, _ = parser.parse_known_args()

    gn_dir = os.path.join(os.path.normpath(args.gn_dir), '')
    suite = args.suite
    assert os.path.sep == '/' and gn_dir.endswith('/')
    assert gn_dir[0] not in ('.', '/')  # expecting relative to angle root

    subprocess.check_call([
        'python3', 'tools/mb/mb.py', 'isolate', gn_dir, suite, '-i',
        'infra/config/generated/testing/gn_isolate_map.pyl'
    ])

    with open(os.path.join(args.gn_dir, '%s.isolate' % suite)) as f:
        isolate_file_paths = json.load(f)['variables']['files']

    # Currently not in deps, add manually
    isolate_file_paths.append('../../src/tests/angle_android_test_runner.py')

    skipped_prefixes = [
        'build/',
        'third_party/catapult/',
        'third_party/colorama/',
        'third_party/jdk/',
        'third_party/jinja2/',
        'third_party/logdog/',
        'third_party/r8/',
        'third_party/requests/',
        os.path.join(gn_dir, 'lib.java/'),
        os.path.join(gn_dir, 'obj/'),
    ]

    if not args.include_unstripped_libs:
        skipped_prefixes.append(os.path.join(gn_dir, 'lib.unstripped/'))

    with zipfile.ZipFile(args.output_zip_file, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) as fzip:
        for fn in isolate_file_paths:
            path = os.path.normpath(os.path.join(gn_dir, fn))
            if any(path.startswith(p) for p in skipped_prefixes):
                continue

            fzip.write(path)

        # Create a script directly inside the zip file
        info = zipfile.ZipInfo('run_tests.sh')
        info.external_attr = 0o755 << 16  # unnecessarily obscure way to chmod 755...
        fzip.writestr(info, RUN_TESTS_TEMPLATE.format(gn_dir=gn_dir, suite=suite))

    return 0


if __name__ == '__main__':
    sys.exit(main())
