#!/usr/bin/python2
#
# Copyright 2019 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.
#
# trigger.py:
#   Helper script for triggering GPU tests on swarming.

import argparse
import os
import subprocess
import sys


def parse_args():
    parser = argparse.ArgumentParser(os.path.basename(sys.argv[0]))
    parser.add_argument('gn_path', help='path to GN. (e.g. out/Release)')
    parser.add_argument('test', help='test name. (e.g. angle_end2end_tests)')
    parser.add_argument('os_dim', help='OS dimension. (e.g. Windows-10)')
    parser.add_argument('gpu_dim', help='GPU dimension. (e.g. intel-hd-630-win10-stable)')
    parser.add_argument('-s', '--shards', default=1, help='number of shards', type=int)
    parser.add_argument('-p', '--pool', default='Chrome-GPU', help='swarming pool')
    return parser.parse_known_args()


def main():
    args, unknown = parse_args()
    path = args.gn_path.replace('\\', '/')
    out_gn_path = '//' + path
    out_file_path = os.path.join(*path.split('/'))

    mb_script_path = os.path.join('tools', 'mb', 'mb.py')
    subprocess.call(['python', mb_script_path, 'isolate', out_gn_path, args.test])

    isolate_script_path = os.path.join('tools', 'swarming_client', 'isolate.py')
    isolate_file = os.path.join(out_file_path, '%s.isolate' % args.test)
    isolated_file = os.path.join(out_file_path, '%s.isolated' % args.test)

    isolate_args = [
        'python', isolate_script_path, 'archive', '-I', 'https://isolateserver.appspot.com', '-i',
        isolate_file, '-s', isolated_file
    ]
    stdout = subprocess.check_output(isolate_args)
    sha = stdout[:40]

    print('Got an isolated SHA of %s' % sha)
    swarming_script_path = os.path.join('tools', 'swarming_client', 'swarming.py')

    swarmings_args = [
        'python', swarming_script_path, 'trigger', '-S', 'chromium-swarm.appspot.com', '-I',
        'isolateserver.appspot.com', '-d', 'os', args.os_dim, '-d', 'pool', args.pool, '-d', 'gpu',
        args.gpu_dim,
        '--shards=%d' % args.shards, '-s', sha
    ]

    if unknown:
        swarmings_args += ["--"] + unknown


    print(' '.join(swarmings_args))
    subprocess.call(swarmings_args)
    return 0


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