# Copyright 2019 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.


DEPS = [
  'recipe_engine/context',
  'recipe_engine/file',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/raw_io',
  'recipe_engine/step',
  'run',
  'vars',
]


def RunSteps(api):
  api.vars.setup()
  if not api.vars.is_trybot:
    raise Exception('%s can only be run as a trybot.' % api.vars.builder_name)

  infrabots_dir = api.path['start_dir'].join('skia', 'infra', 'bots')
  trigger_wait_g3_script = infrabots_dir.join('g3_compile',
                                              'trigger_wait_g3_task.py')

  output_dir = api.path.mkdtemp('g3_try')
  output_file = output_dir.join('output_file')
  # Trigger a compile task and wait for it to complete.
  cmd = ['python', trigger_wait_g3_script,
         '--issue', api.vars.issue,
         '--patchset', api.vars.patchset,
         '--output_file', output_file,
         '--builder_name', api.vars.builder_name,
        ]
  try:
    with api.context(cwd=api.path['start_dir'].join('skia')):
      api.run(api.step, 'Trigger and wait for g3 compile task', cmd=cmd)
  except api.step.StepFailure as e:
    # Add CL link if it exists in the output_file.
    task_json = api.file.read_json(
        'Read task json', output_file, test_data={'cl': 12345})
    if task_json.get('cl'):
      api.step.active_result.presentation.links['CL link'] = (
          'http://cl/%d' % task_json['cl'])
    raise e


def GenTests(api):
  yield(
    api.test('g3_compile_trybot') +
    api.properties.tryserver(
          gerrit_project='skia',
          gerrit_url='https://skia-review.googlesource.com/',
    ) +
    api.properties(
        buildername='Build-Debian10-Clang-TAP-Presubmit-G3_Framework',
        path_config='kitchen',
        swarm_out_dir='[SWARM_OUT_DIR]',
        repository='https://skia.googlesource.com/skia.git',
        revision='abc123',
    )
  )

  yield(
    api.test('g3_compile_trybot_failure') +
    api.properties.tryserver(
          gerrit_project='skia',
          gerrit_url='https://skia-review.googlesource.com/',
    ) +
    api.properties(
        buildername='Build-Debian10-Clang-TAP-Presubmit-G3_Framework',
        path_config='kitchen',
        swarm_out_dir='[SWARM_OUT_DIR]',
        repository='https://skia.googlesource.com/skia.git',
        revision='abc123',
    ) +
    api.step_data('Trigger and wait for g3 compile task', retcode=1)
  )

  yield(
    api.test('g3_compile_nontrybot') +
    api.properties(
        buildername='Build-Debian10-Clang-TAP-Presubmit-G3_Framework',
        path_config='kitchen',
        swarm_out_dir='[SWARM_OUT_DIR]',
        repository='https://skia.googlesource.com/skia.git',
        revision='abc123',
    ) +
    api.expect_exception('Exception')
  )
