# Copyright 2013 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 = [
  'adb',
  'amp',
  'bisect_tester',
  'bot_update',
  'chromium',
  'chromium_android',
  'chromium_tests',
  'commit_position',
  'file',
  'isolate',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/properties',
  'recipe_engine/python',
  'recipe_engine/raw_io',
  'recipe_engine/step',
  'swarming',
  'test_results',
  'test_utils',
]

from recipe_engine import config_types

def ignore_undumpable(obj):  # pragma: no cover
  try:
    return config_types.json_fixup(obj)
  except TypeError:
    return None


def RunSteps(api):
  # build/tests/masters_recipes_tests.py needs to manipulate the BUILDERS
  # dict, so we provide an API to dump it here.
  if api.properties.get('dump_builders'):  # pragma: no cover
    api.file.write(
        'Dump BUILDERS dict', api.properties['dump_builders'],
        api.json.dumps(api.chromium_tests.builders, default=ignore_undumpable))
    return

  mastername = api.properties.get('mastername')
  buildername = api.properties.get('buildername')

  if mastername == 'tryserver.chromium.perf' and api.chromium_tests.builders[
      mastername]['builders'][buildername]['bot_type'] == 'tester':
    api.bisect_tester.upload_job_url()

  bot_config = api.chromium_tests.create_bot_config_object(
      mastername, buildername)
  api.chromium_tests.configure_build(bot_config)
  update_step, bot_db = api.chromium_tests.prepare_checkout(bot_config)
  tests, tests_including_triggered = api.chromium_tests.get_tests(
      bot_config, bot_db)
  compile_targets = api.chromium_tests.get_compile_targets(
      bot_config, bot_db, tests_including_triggered)
  api.chromium_tests.compile_specific_targets(
      bot_config, update_step, bot_db,
      compile_targets, tests_including_triggered)
  api.chromium_tests.archive_build(
      mastername, buildername, update_step, bot_db)
  api.chromium_tests.download_and_unzip_build(mastername, buildername,
                                              update_step, bot_db)

  if not tests:
    return

  api.chromium_tests.configure_swarming('chromium', precommit=False,
                                        mastername=mastername)
  test_runner = api.chromium_tests.create_test_runner(api, tests)
  with api.chromium_tests.wrap_chromium_tests(bot_config, tests):
    test_runner()


def _sanitize_nonalpha(text):
  return ''.join(c if c.isalnum() else '_' for c in text)


def GenTests(api):
  for mastername, master_config in api.chromium_tests.builders.iteritems():

    # parent builder name -> list of triggered builders.
    triggered_by_parent = {}
    for buildername, bot_config in master_config['builders'].iteritems():
      parent = bot_config.get('parent_buildername')
      if parent:
        triggered_by_parent.setdefault(parent, []).append(buildername)

    for buildername, bot_config in master_config['builders'].iteritems():
      bot_type = bot_config.get('bot_type', 'builder_tester')

      if bot_type in ['builder', 'builder_tester']:
        assert bot_config.get('parent_buildername') is None, (
            'Unexpected parent_buildername for builder %r on master %r.' %
                (buildername, mastername))

      properties = {
        'mastername': mastername,
        'buildername': buildername,
        'parent_buildername': bot_config.get('parent_buildername'),
      }
      if mastername == 'chromium.webkit':
        properties['gs_acl'] = 'public-read'
      test = (
        api.test('full_%s_%s' % (_sanitize_nonalpha(mastername),
                                 _sanitize_nonalpha(buildername))) +
        api.properties.generic(**properties) +
        api.platform(bot_config['testing']['platform'],
                     bot_config.get(
                         'chromium_config_kwargs', {}).get('TARGET_BITS', 64))
      )

      if bot_type == 'tester' and mastername == 'tryserver.chromium.perf':
        bisect_config = {
            'test_type': 'perf',
            'command': 'tools/perf/run_benchmark -v '
                       '--browser=release page_cycler.intl_ar_fa_he',
            'good_revision': '300138',
            'bad_revision': '300148',
            'metric': 'warm_times/page_load_time',
            'repeat_count': '2',
            'max_time_minutes': '5',
            'truncate_percent': '25',
            'bug_id': '425582',
            'gs_bucket': 'chrome-perf',
            'builder_host': 'master4.golo.chromium.org',
            'builder_port': '8341',
        }
        test += api.step_data('saving url to temp file',
                              stdout=api.raw_io.output('/tmp/dummy1'))
        test += api.step_data('saving json to temp file',
                              stdout=api.raw_io.output('/tmp/dummy2'))
        if 'bisector' in buildername:
          test += api.step_data('Performance Test 2 of 2', retcode=1)
        test += api.properties(bisect_config=bisect_config)
        test += api.properties(job_name='f7a7b4135624439cbd27fdd5133d74ec')
        test += api.bisect_tester(tempfile='/tmp/dummy')
      if bot_config.get('parent_buildername'):
        test += api.properties(parent_got_revision='1111111')
        test += api.properties(
            parent_build_archive_url='gs://test-domain/test-archive.zip')

      if mastername == 'client.v8.fyi':
        test += api.properties(revision='22135')

      if bot_config.get('enable_swarming'):
        if bot_type == 'tester':
          test += api.properties(swarm_hashes={
            'browser_tests': 'ffffffffffffffffffffffffffffffffffffffff',
          })

        builders_with_tests = []
        if bot_type == 'builder':
          builders_with_tests = triggered_by_parent.get(buildername, [])
        else:
          builders_with_tests = [buildername]

        test += api.override_step_data('read test spec', api.json.output({
            b: {
            'gtest_tests': [
              {
                'test': 'browser_tests',
                'swarming': {'can_use_on_swarming_builders': True},
              },
            ],
          } for b in builders_with_tests
        }))
      yield test

  yield (
    api.test('dynamic_gtest') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          'base_unittests',
          {'test': 'browser_tests', 'shard_index': 0, 'total_shards': 2},
          {'test': 'content_unittests', 'name': 'renamed_content_unittests'},
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_gtest') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          {'test': 'browser_tests',
           'swarming': {'can_use_on_swarming_builders': True}},
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_gtest_mac_gpu') +
    api.properties.generic(mastername='chromium.mac',
                           buildername='Mac10.9 Tests',
                           parent_buildername='Mac Builder') +
    api.properties(swarm_hashes={
      'gl_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('mac', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Mac10.9 Tests': {
        'gtest_tests': [
          {
            'test': 'gl_tests',
            'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                {
                  'gpu': '8086:0a2e',  # Intel Iris
                  'hidpi': '0',
                  'os': 'Mac-10.10',
                }, {
                  'gpu': '10de:0fe9',  # NVIDIA GeForce GT 750M
                  'hidpi': '1',
                  'os': 'Mac-10.9',
                },
              ],
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_gtest_override_compile_targets') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.properties(swarm_hashes={
      'tab_capture_end2end_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          {
            'test': 'tab_capture_end2end_tests',
            'override_compile_targets': [ 'tab_capture_end2end_tests_run' ],
            'swarming': {
              'can_use_on_swarming_builders': True,
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('build_dynamic_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'args': ['--correct-common-arg'],
            'precommit_args': ['--SHOULD-NOT-BE-PRESENT-DURING-THE-RUN'],
            'non_precommit_args': [
              '--these-args-should-be-present',
              '--test-machine-name=\"${buildername}\"',
              '--build-revision=\"${got_revision}\"',
            ],
          },
        ],
      },
    }))
  )

  yield (
    api.test('build_dynamic_isolated_script_test_compile_target_overriden') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'override_compile_targets': ['abc', 'telemetry_gpu_unittests_run'],
          },
        ],
      },
    }))
  )

  yield (
    api.test('build_dynamic_swarmed_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
          },
        ],
      },
    }))
  )

  yield (
    api.test(
        'build_dynamic_swarmed_isolated_script_test_compile_target_overidden') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
            'override_compile_targets': ['telemetry_gpu_unittests_run', 'a'],
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_passed_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_linux_gpu') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                {
                  'gpu': '10de:104a',  # NVIDIA GeForce GT 610
                  'os': 'Linux',
                },
              ],
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_mac_gpu') +
    api.properties.generic(mastername='chromium.mac',
                           buildername='Mac10.9 Tests',
                           parent_buildername='Mac Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('mac', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Mac10.9 Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                {
                  'gpu': '8086:0a2e',  # Intel Iris
                  'hidpi': '0',
                  'os': 'Mac-10.10',
                }, {
                  'gpu': '10de:0fe9',  # NVIDIA GeForce GT 750M
                  'hidpi': '1',
                  'os': 'Mac-10.9',
                },
              ],
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_win_gpu') +
    api.properties.generic(mastername='chromium.win',
                           buildername='Win7 Tests (1)',
                           parent_buildername='Win Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('win', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Win7 Tests (1)': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                {
                  'gpu': '10de:104a',  # NVIDIA GeForce GT 610
                  'os': 'Windows',
                }, {
                  'gpu': '1002:6779',  # AMD Radeon HD 6450
                  'os': 'Windows',
                }, {
                  'gpu': '15ad:0405',  # VMWare SVGA II Adapter
                  'os': 'Windows',
                },
              ],
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_win_non_gpu') +
    api.properties.generic(mastername='chromium.win',
                           buildername='Win7 Tests (1)',
                           parent_buildername='Win Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('win', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Win7 Tests (1)': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                {
                  'os': 'Windows',
                },
              ],
            },
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_swarmed_failed_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
          },
        ],
      },
    })) +
    api.override_step_data('telemetry_gpu_unittests',
        api.test_utils.canned_isolated_script_output(
            passing=True, is_win=False, swarming=True,
            isolated_script_passing=False, valid=True),
        retcode=255)
  )

  yield (
    api.test('dynamic_swarmed_passed_with_bad_retcode_isolated_script_test') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
          },
        ],
      },
    })) +
    api.override_step_data('telemetry_gpu_unittests',
        api.test_utils.canned_isolated_script_output(
            passing=True, is_win=False, swarming=True,
            isolated_script_passing=True, valid=True),
        retcode=255)
  )

  yield (
    api.test(
        'dynamic_swarmed_passed_isolated_script_test_with_swarming_failure') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.properties(swarm_hashes={
      'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'isolated_scripts': [
          {
            'isolate_name': 'telemetry_gpu_unittests',
            'name': 'telemetry_gpu_unittests',
            'swarming': {'can_use_on_swarming_builders': True},
          },
        ],
      },
    })) +
    api.override_step_data('telemetry_gpu_unittests',
        api.test_utils.canned_isolated_script_output(
            passing=False, is_win=False, swarming=True,
            swarming_internal_failure=True, isolated_script_passing=True,
            valid=True),
        retcode=255)
  )

  yield (
    api.test('goma_with_diagnose_goma_failure') +
    api.properties.generic(mastername='chromium.fyi',
                           buildername='CrWinGoma',
                           build_data_dir='E:\\chrome-infra-logs') +
    api.step_data('diagnose_goma', retcode=1)
  )

  yield (
    api.test('dynamic_gtest_on_builder') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          'base_unittests',
          {'test': 'browser_tests', 'shard_index': 0, 'total_shards': 2},
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_gtest_win') +
    api.properties.generic(mastername='chromium.win',
                           buildername='Win7 Tests (1)',
                           parent_buildername='Win Builder') +
    api.platform('win', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Win7 Tests (1)': {
        'gtest_tests': [
          'aura_unittests',
          {'test': 'browser_tests', 'shard_index': 0, 'total_shards': 2},
        ],
      },
    }))
  )

  # Tests switching on asan and swiching off lsan for sandbox tester.
  yield (
    api.test('dynamic_gtest_memory_asan_no_lsan') +
    api.properties.generic(mastername='chromium.memory',
                           buildername='Linux ASan Tests (sandboxed)',
                           parent_buildername='Linux ASan LSan Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux ASan Tests (sandboxed)': {
        'gtest_tests': [
          'browser_tests',
        ],
      },
    }))
  )

  # Tests that the memory builder is using the correct compile targets.
  yield (
    api.test('dynamic_gtest_memory_builder') +
    api.properties.generic(mastername='chromium.memory',
                           buildername='Linux ASan LSan Builder',
                           revision='123456') +
    api.platform('linux', 64) +
    # The builder should build 'browser_tests', because there exists a child
    # tester that uses that test.
    api.override_step_data('read test spec', api.json.output({
      'Linux ASan Tests (sandboxed)': {
        'gtest_tests': [
          'browser_tests',
        ],
      },
    }))
  )

  # Tests that the memory mac tester is using the correct test flags.
  yield (
    api.test('dynamic_gtest_memory_mac64') +
    api.properties.generic(
        mastername='chromium.memory',
        buildername='Mac ASan 64 Tests (1)',
        parent_buildername='Mac ASan 64 Builder') +
    api.platform('mac', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Mac ASan 64 Tests (1)': {
        'gtest_tests': [
          'browser_tests',
        ],
      },
    }))
  )

  yield (
    api.test('tsan') +
    api.properties.generic(mastername='chromium.memory.fyi',
                           buildername='Linux TSan Tests',
                           parent_buildername='Chromium Linux TSan Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux TSan Tests': {
        'compile_targets': ['base_unittests'],
        'gtest_tests': ['base_unittests'],
      },
    }))
  )

  yield (
    api.test('msan') +
    api.properties.generic(mastername='chromium.memory.fyi',
                           buildername='Linux MSan Tests',
                           parent_buildername='Chromium Linux MSan Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux MSan Tests': {
        'compile_targets': ['base_unittests'],
        'gtest_tests': ['base_unittests'],
      },
    }))
  )

  yield (
    api.test('buildnumber_zero') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder',
                           buildnumber=0) +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          'base_unittests',
          {'test': 'browser_tests', 'shard_index': 0, 'total_shards': 2},
        ],
      },
    }))
  )

  # FIXME(iannucci): Make this test work.
  #yield (
  #  api.test('one_failure_keeps_going') +
  #  api.properties.generic(mastername='chromium.linux',
  #                         buildername='Linux Tests',
  #                         parent_buildername='Linux Builder') +
  #  api.platform('linux', 64) +
  #  api.step_data('mojo_python_tests', retcode=1)
  #)

  yield (
    api.test('one_failure_keeps_going_dynamic_tests') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'gtest_tests': [
          'base_unittests',
          {'test': 'browser_tests', 'shard_index': 0, 'total_shards': 2},
        ],
      },
    })) +
    api.step_data('base_unittests', retcode=1)
  )

  yield (
    api.test('archive_dependencies_failure') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Builder',
                           buildnumber=0) +
    api.platform('linux', 64) +
    api.override_step_data('archive dependencies',
                           api.test_utils.canned_gtest_output(True), retcode=1)
  )

  yield (
    api.test('perf_test_profile_failure') +
    api.properties.generic(mastername='chromium.perf',
                           buildername='Linux Perf (1)',
                           parent_buildername='Linux Builder',
                           buildnumber=0) +
    api.platform('linux', 64) +
    api.override_step_data(
        'blink_perf.all.release',
        api.json.output([]),
        retcode=1)
  )

  yield (
    api.test('dynamic_script_test_with_args') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'scripts': [
          {
            'name': 'media_perftests',
            'script': 'gtest_perf_test.py',
            'args': ['media_perftests', '--single-process-tests']
          },
        ],
      },
    }))
  )

  yield (
    api.test('dynamic_script_test_failure') +
    api.properties.generic(mastername='chromium.linux',
                           buildername='Linux Tests',
                           parent_buildername='Linux Builder') +
    api.platform('linux', 64) +
    api.override_step_data('read test spec', api.json.output({
      'Linux Tests': {
        'scripts': [
          {
            'name': 'test_script_with_broken_tests',
            'script': 'test_script_with_broken_tests.py'
          }
        ]
      }
    })) +
    api.override_step_data('test_script_with_broken_tests',
                           api.json.output({
      'valid': True,
      'failures': ['FailSuite.Test1', 'FlakySuite.TestA']
    }))
  )

  yield (
    api.test('chromium_webkit_crash') +
    api.properties.generic(mastername='chromium.webkit',
                           buildername='WebKit Linux') +
    api.platform('linux', 64) +
    api.override_step_data(
        'webkit_tests',
        api.test_utils.raw_test_output(None, retcode=1))
  )

  yield (
    api.test('chromium_webkit_warnings') +
    api.properties.generic(mastername='chromium.webkit',
                           buildername='WebKit Linux') +
    api.platform('linux', 64) +
    api.override_step_data(
        'webkit_tests',
        api.test_utils.canned_test_output(
            passing=True, unexpected_flakes=True, retcode=0))
  )

  yield (
    api.test('chromium_webkit_revision_webkit') +
    api.properties.generic(mastername='chromium.webkit',
                           buildername='WebKit Linux',
                           project='webkit',
                           revision='191187') +
    api.platform('linux', 64)
  )

  yield (
    api.test('chromium_webkit_revision_chromium') +
    api.properties.generic(
        mastername='chromium.webkit',
        buildername='WebKit Linux',
        project='chromium',
        revision='3edb4989f8f69c968c0df14cb1c26d21dd19bf1f') +
    api.platform('linux', 64)
  )

  yield (
    api.test('chromium_webkit_parent_revision_webkit') +
    api.properties.generic(
        mastername='chromium.webkit',
        buildername='WebKit Win7',
        project='webkit',
        parent_buildername='WebKit Win Builder',
        parent_got_revision='7496f63cbefd34b2d791022fbad64a82838a3f3f',
        parent_got_webkit_revision='191275',
        revision='191275') +
    api.platform('win', 32)
  )

  yield (
    api.test('chromium_webkit_parent_revision_chromium') +
    api.properties.generic(
        mastername='chromium.webkit',
        buildername='WebKit Win7',
        project='chromium',
        parent_buildername='WebKit Win Builder',
        parent_got_revision='1e74b372f951d4491f305ec64f6decfcda739e73',
        parent_got_webkit_revision='191269',
        revision='1e74b372f951d4491f305ec64f6decfcda739e73') +
    api.platform('win', 32)
  )

  yield (
    api.test('amp_split_recipe_trigger_failure') +
    api.properties(
        mastername='chromium.fyi',
        buildername='Android Tests (amp split)',
        slavename='build1-a1',
        buildnumber='77457',
        parent_build_archive_url='gs://test-domain/test-archive.zip'
    ) +
    api.override_step_data('[trigger] base_unittests', retcode=1)
  )

  yield (
    api.test('amp_split_recipe_instrumentation_trigger_failure') +
    api.properties(
        mastername='chromium.fyi',
        buildername='Android Tests (amp instrumentation test split)',
        slavename='build1-a1',
        buildnumber='77457',
        parent_build_archive_url='gs://test-domain/test-archive.zip'
    ) +
    api.override_step_data('[trigger] AndroidWebViewTest', retcode=1)
  )

  yield (
    api.test('amp_split_recipe_trigger_local_failure') +
    api.properties(
        mastername='chromium.fyi',
        buildername='Android Tests (amp split)',
        slavename='build1-a1',
        buildnumber='77457',
        parent_build_archive_url='gs://test-domain/test-archive.zip'
    ) +
    api.override_step_data('[trigger] base_unittests', retcode=1) +
    api.override_step_data('base_unittests', retcode=1)
  )

  yield (
    api.test('amp_split_recipe_collect_failure') +
    api.properties(
        mastername='chromium.fyi',
        buildername='Android Tests (amp split)',
        slavename='build1-a1',
        buildnumber='77457',
        parent_build_archive_url='gs://test-domain/test-archive.zip'
    ) +
    api.override_step_data('[collect] base_unittests', retcode=1)
  )

  yield (
    api.test('chromium_linux_Android_Tests_logcat_upload_timeout') +
    api.properties(
        mastername='chromium.linux',
        buildername='Android Tests',
        slavename='build1-a1',
        buildnumber='77457',
        parent_buildername='Android Builder',
    ) +
    api.override_step_data('gsutil upload', retcode=-2001)
  )
