# Copyright 2017 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 calmbench results.


import calendar


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


def FindFile(api, suffix):
  with api.context(cwd=api.path['start_dir']):
    results = api.file.glob_paths(
        'find %s results' % suffix,
        api.path['start_dir'],
        '*.%s' % suffix,
        test_data=['bench_modified_master.%s' % suffix])
  if len(results) != 1:  # pragma: nocover
    raise Exception('Unable to find the %s file!' % suffix)
  return results[0]


def RunSteps(api):
  api.core.setup()

  builder_name = api.properties['buildername']

  now = api.time.utcnow()

  json_src = FindFile(api, "json")
  csv_src = FindFile(api, "csv")

  ts = int(calendar.timegm(now.utctimetuple()))
  basename = "bench_modified_master_%s_%d" % (api.vars.got_revision, ts)

  gs_path = '/'.join((
      'calmbench-v1', str(now.year).zfill(4),
      str(now.month).zfill(2), str(now.day).zfill(2), str(now.hour).zfill(2),
      builder_name))

  issue = api.properties.get('patch_issue')
  patchset = api.properties.get('patch_set')
  if issue and patchset:
    gs_path = '/'.join(('trybot', gs_path, str(issue), str(patchset)))

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

  json_dst = dst + ".json"
  csv_dst = dst + ".csv"

  api.step(
      'upload json',
      cmd=['gsutil', 'cp', '-z', 'json', json_src, json_dst],
      infra_step=True)
  api.step(
      'upload csv',
      cmd=['gsutil', 'cp', '-z', 'csv', csv_src, csv_dst],
      infra_step=True)


def GenTests(api):
  builder = 'Calmbench-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All'
  yield (
    api.test('normal_bot') +
    api.properties(buildername=builder,
                   repository='https://skia.googlesource.com/skia.git',
                   gs_bucket='skia-calmbench',
                   swarm_out_dir='[SWARM_OUT_DIR]',
                   revision='abc123',
                   path_config='kitchen')
  )

  yield (
    api.test('trybot') +
    api.properties(buildername=builder,
                   repository='https://skia.googlesource.com/skia.git',
                   gs_bucket='skia-calmbench',
                   swarm_out_dir='[SWARM_OUT_DIR]',
                   revision='abc123',
                   path_config='kitchen',
                   patch_storage='gerrit') +
    api.properties.tryserver(
        buildername=builder,
        gerrit_project='skia',
        gerrit_url='https://skia-review.googlesource.com/',
    )
  )
