# 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.joinpath('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')
  )
