# 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 module for Skia Swarming calmbench.

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

def RunSteps(api):
  api.core.setup()
  api.flavor.install(skps=True, svgs=True)
  with api.context(cwd=api.vars.skia_dir):
    extra_arg = '--svgs %s --skps %s' % (api.flavor.device_dirs.svg_dir,
                                         api.flavor.device_dirs.skp_dir)

    # measuring multi-picture-draw in our multi-threaded CPU test is inaccurate
    if api.vars.builder_cfg.get('cpu_or_gpu') == 'CPU':
      extra_arg += ' --mpd false'
      config = "8888"
    else:
      config = "gl"

    command = [
        'python',
        api.vars.skia_dir.join('tools', 'calmbench', 'ab.py'),
        api.vars.swarming_out_dir,
        'modified', 'master',
        api.path['start_dir'].join("out", api.vars.configuration, 'nanobench'),
        api.path['start_dir'].join("ParentRevision", "out",
                                   api.vars.configuration, 'nanobench'),
        extra_arg, extra_arg,
        2,          # reps
        "false",    # skipbase
        config,
        -1,         # threads; let ab.py decide the threads
        "false",    # noinit
        "--githash", api.vars.got_revision,
        "--concise"
    ]

    keys_blacklist = ['configuration', 'role', 'test_filter']
    command.append('--keys')
    for k in sorted(api.vars.builder_cfg.keys()):
      if not k in keys_blacklist:
        command.extend([k, api.vars.builder_cfg[k]])

    api.run(api.step, 'Run calmbench', cmd=command)
  api.run.check_failure()

def GenTests(api):
  builders = [
    "Calmbench-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All",
    "Calmbench-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Release-All",
  ]

  for builder in builders:
    test = (
      api.test(builder) +
      api.properties(buildername=builder,
                     repository='https://skia.googlesource.com/skia.git',
                     revision='abc123',
                     path_config='kitchen',
                     swarm_out_dir='[SWARM_OUT_DIR]') +
      api.path.exists(
          api.path['start_dir'].join('skia'),
          api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
                                     'svg', 'VERSION'),
          api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
                                     'skp', 'VERSION'),
      )
    )

    yield test
