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


# Recipe for uploading buildstats results to Perf.


DEPS = [
  'recipe_engine/context',
  'recipe_engine/file',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/step',
  'recipe_engine/time',
  'vars',
]


def RunSteps(api):
  # Upload the buildstats results.
  api.vars.setup()

  now = api.time.utcnow()
  src_path = api.path['start_dir'].join('perf')
  with api.context(cwd=src_path):
    results = api.file.glob_paths(
        'find results',
        src_path,
        '*.json',
        test_data=['buildstats_abc123.json', 'buildstats_def.json'])
  if not len(results):  # pragma: nocover
    raise Exception('Unable to find buildstats JSON file!')

  for src in results:
    basename = api.path.basename(src)
    basename = api.properties['revision'] + '_' + basename
    gs_path = '/'.join((
        'buildstats-json-v1', str(now.year).zfill(4),
        str(now.month).zfill(2), str(now.day).zfill(2), str(now.hour).zfill(2),
        api.vars.builder_name))

    if api.vars.is_trybot:
      gs_path = '/'.join(('trybot', gs_path,
                          str(api.vars.issue), str(api.vars.patchset)))

    dst = '/'.join((
        'gs://%s' % api.properties['gs_bucket'], gs_path, basename))

    api.step(
        'upload %s' % src,
        cmd=['gsutil', 'cp', '-z', 'json', src, dst],
        infra_step=True)


def GenTests(api):
  builder = 'BuildStats-Debian10-EMCC-wasm-Release-PathKit'
  yield (
    api.test('normal_bot') +
    api.properties(buildername=builder,
                   gs_bucket='skia-perf',
                   revision='abc123',
                   path_config='kitchen')
  )

  yield (
    api.test('trybot') +
    api.properties.tryserver(
        gerrit_project='skia',
        gerrit_url='https://skia-review.googlesource.com/',
    ) +
    api.properties(buildername=builder,
                   gs_bucket='skia-perf',
                   revision='abc123',
                   path_config='kitchen')
  )
