# Copyright 2015 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 = [
  'depot_tools/bot_update',
  'depot_tools/gclient',
  'goma',
  'recipe_engine/context',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/python',
  'recipe_engine/runtime',
  'recipe_engine/step',
]


def RunSteps(api):
  api.gclient.set_config('wasm_llvm')
  api.gclient.apply_config('depot_tools')
  if api.runtime.is_luci:
    checkout_root = api.path['builder_cache']
  else:
    # TODO(sergiyb): Remove this branch after migrating to LUCI.
    checkout_root = api.path['start_dir']
  with api.context(cwd=checkout_root):
    result = api.bot_update.ensure_checkout()
  got_revision = result.presentation.properties['got_waterfall_revision']
  goma_dir = api.goma.ensure_goma()
  env = {
      'BUILDBOT_MASTERNAME': api.properties['mastername'],
      'BUILDBOT_BUILDERNAME': api.properties['buildername'],
      'BUILDBOT_REVISION': api.properties['revision'],
      'BUILDBOT_GOT_WATERFALL_REVISION': got_revision,
      'GOMA_DIR': goma_dir,
  }

  api.goma.start()
  exit_status = -1
  try:
    depot_tools_path = checkout_root.join('depot_tools')
    with api.context(cwd=api.path['checkout'], env=env,
                     env_suffixes={'PATH': [depot_tools_path]}):
      api.python('annotated steps',
                 api.path['checkout'].join('src', 'build.py'),
                 allow_subannotations=True)
    exit_status = 0
  except api.step.StepFailure as e:
    exit_status = e.retcode
    raise e
  finally:
    api.goma.stop(build_exit_status=exit_status)


def GenTests(api):
  yield (
    api.test('linux') +
    api.properties(
      mastername = 'client.wasm.llvm',
      buildername = 'linux',
      bot_id = 'TestBot',
      revision = 'abcd',
    ))

  yield (
    api.test('linux_fail') +
    api.properties(
      mastername = 'client.wasm.llvm',
      buildername = 'linux',
      bot_id = 'TestBot',
      revision = 'abcd',
    ) + api.step_data('annotated steps', retcode=1))

  yield (
    api.test('luci') +
    api.properties(
      mastername = 'client.wasm.llvm',
      buildername = 'linux',
      bot_id = 'TestBot',
      revision = 'abcd',
      path_config='kitchen',
    ) +
    api.runtime(is_luci=True, is_experimental=False)
  )
