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

DEPS = [
  'chromium',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/properties',
]


def RunSteps(api):
  api.chromium.set_config(
      api.properties.get('chromium_config', 'chromium'),
      TARGET_PLATFORM=api.properties.get('target_platform', 'linux'))

  for config in api.properties.get('chromium_apply_config', []):
    api.chromium.apply_config(config)

  api.chromium.c.runtest_py.src_side = True

  kwargs = {}
  if api.properties.get('annotate'):
    kwargs.update({
        'annotate': api.properties.get(
            'annotate',
            api.chromium.get_annotate_by_test_name('base_unittests')),
        'args': [api.chromium.test_launcher_filter('AtExit*')],
        'test_launcher_summary_output': api.json.output(),
    })
  else:
    kwargs.update({
        'chartjson_file': True,
    })

  api.chromium.runtest(
      'base_unittests',
      python_mode=api.properties.get('python_mode', False),
      point_id=123456,
      revision='some_sha',
      test_type='base_unittests',
      results_url='https://example/url',
      perf_dashboard_id='test_perf_dashboard_id',
      perf_id='test_perf_id',
      perf_config={'a_default_rev': 'some_sha'},
      tee_stdout_file=api.path['tmp_base'].join('stdout.log'),
      **kwargs)


def GenTests(api):
  yield (
      api.test('basic') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id')
  )

  yield (
      api.test('android') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          target_platform='android')
  )

  yield (
      api.test('win') +
      api.platform('win', 64) +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          target_platform='win')
  )

  yield (
      api.test('annotate') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          annotate='gtest')
  )

  yield (
      api.test('python_mode') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          python_mode=True)
  )

  yield (
      api.test('memcheck') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          chromium_apply_config=['memcheck'])
  )

  yield (
      api.test('tsan') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          chromium_config='chromium_clang',
          chromium_apply_config=['tsan2'])
  )

  yield (
      api.test('msan') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          chromium_config='chromium_msan')
  )

  yield (
      api.test('lsan') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          chromium_config='chromium_clang',
          chromium_apply_config=['lsan'])
  )

  yield (
      api.test('asan') +
      api.properties(
          buildername='test_buildername',
          buildnumber=123,
          bot_id='test_bot_id',
          chromium_apply_config=['chromium_win_asan'])
  )
