# 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',
  'bisect_tester',
  'build',
  'chromium',
  'chromium_android',
  'chromium_swarming',
  'chromium_tests',
  'commit_position',
  'depot_tools/bot_update',
  'depot_tools/gsutil',
  'isolate',
  'recipe_engine/buildbucket',
  'recipe_engine/file',
  'recipe_engine/json',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/properties',
  'recipe_engine/python',
  'recipe_engine/step',
  'recipe_engine/tempfile',
  'recipe_engine/runtime',
  'swarming',
  'test_results',
  'test_utils',
]

from recipe_engine import config_types
from recipe_engine import post_process

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_text(
        'Dump BUILDERS dict', api.properties['dump_builders'],
        api.json.dumps(api.chromium_tests.builders, default=ignore_undumpable))
    return

  with api.chromium.chromium_layout():
    api.chromium_tests.main_waterfall_steps()


def GenTests(api):
  def props(mastername='chromium.linux',
            builder='Linux Tests',
            parent_buildername='Linux Builder',
            **kwargs):
    bb_kwargs = {
        'project': 'chromium/src',
        'builder': builder,
    }
    kwargs.update({
        'mastername': mastername,
        'buildername':builder,
    })
    if parent_buildername:
      kwargs['parent_buildername'] = parent_buildername
    return api.properties.generic(**kwargs) + api.buildbucket.ci_build(
        **bb_kwargs)


  yield (
    api.test('dynamic_gtest') +
    props() +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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',
                    'use_xvfb': False,
                },
              ],
            },
        })
    )
  )

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

  yield (
    api.test('dynamic_swarmed_serialized_gtests') +
    # The chromium.gpu.fyi bots use serialize_tests in order to reduce
    # load on the GPU bots in the Swarming pool.
    props(mastername='chromium.gpu.fyi',
          builder='Linux FYI Release (NVIDIA)',
          parent_buildername='GPU FYI Linux Builder',
          swarm_hashes={
              'base_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
              'browser_tests': 'ffffffffffffffffffffffffffffff',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.gpu.fyi.json)',
        api.json.output({
            'Linux FYI Release (NVIDIA)': {
                'gtest_tests': [
                    {
                        'test': 'base_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'dimension_sets': [
                                {
                                    'gpu': '10de:104a',  # NVIDIA GeForce GT 610
                                    'os': 'Linux',
                                },
                            ],
                        },
                    },
                    {
                        'test': 'browser_tests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'dimension_sets': [
                                {
                                    'gpu': '10de:104a',  # NVIDIA GeForce GT 610
                                    'os': 'Linux',
                                },
                            ],
                        },
                    },
                ],
            },
        })
    ) +
    # Make one of the tests fail to improve code coverage.
    api.override_step_data('base_unittests on NVIDIA GPU on Linux',
        api.swarming.canned_summary_output(failure=True) +
        api.test_utils.canned_gtest_output(False))
  )

  yield (
    api.test('dynamic_swarmed_gtest_mac_gpu') +
    props(mastername='chromium.mac',
          builder='Mac10.13 Tests',
          parent_buildername='Mac Builder',
          swarm_hashes={
              'gl_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('mac', 64) +
    api.override_step_data(
        'read test spec (chromium.mac.json)',
        api.json.output({
            'Mac10.13 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 GT750M
                                    'hidpi': '1',
                                    'os': 'Mac-10.13',
                                },
                            ],
                        },
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_swarmed_gtest_override_compile_targets') +
    props(builder='Linux Builder',
          parent_buildername=None,
          swarm_hashes={
              'tab_capture_end2end_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props(builder='Linux Builder',
          parent_buildername=None) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_isolated_script_test') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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('dynamic_local_isolated_script_test_with_failed_json_results') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) + api.override_step_data('telemetry_gpu_unittests',
            api.test_utils.canned_isolated_script_output(
                passing=False, is_win=False, swarming=False,
                isolated_script_passing=False,
                use_json_test_format=True),
            retcode=0)
  )

  yield (
    api.test('dynamic_local_isolated_script_test_with_unknown_json_results') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) + api.override_step_data('telemetry_gpu_unittests',
            api.test_utils.canned_isolated_script_output(
                passing=True, is_win=False, swarming=False,
                isolated_script_passing=True,
                use_json_test_format=True, unknown=True),
            retcode=0)
  )

  yield (
    api.test('dynamic_local_isolated_script_test_with_corrupt_json_results') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) + api.override_step_data('telemetry_gpu_unittests',
            api.test_utils.canned_isolated_script_output(
                passing=True, is_win=False, swarming=False,
                isolated_script_passing=True,
                use_json_test_format=True, corrupt=True),
            retcode=0)
  )

  yield (
    api.test('dynamic_local_isolated_script_test_with_passed_json_results') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) + api.override_step_data('telemetry_gpu_unittests',
            api.test_utils.canned_isolated_script_output(
                passing=True, is_win=False, swarming=False,
                isolated_script_passing=True,
                use_json_test_format=True),
            retcode=0)
  )

  yield (
    api.test('dynamic_local_isolated_script_test_with_custom_results_handler') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                      'results_handler': 'fake',
                    },
                ],
            },
        })
    ) + api.override_step_data('telemetry_gpu_unittests',
            api.test_utils.canned_isolated_script_output(
                passing=False, is_win=False, swarming=False,
                isolated_script_passing=False,
                use_json_test_format=True),
            retcode=0)
  )

  yield (
    api.test('dynamic_isolated_script_test_harness_failure_zero_retcode') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) +
    api.override_step_data('telemetry_gpu_unittests',
        api.test_utils.canned_isolated_script_output(
            passing=False, is_win=False, swarming=False,
            isolated_script_passing=False, valid=False),
        retcode=0)
  )

  yield (
    api.test('dynamic_isolated_script_test_harness_failure_no_json') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'telemetry_gpu_unittests',
                      'name': 'telemetry_gpu_unittests',
                    },
                ],
            },
        })
    ) +
    api.override_step_data('telemetry_gpu_unittests',
                           api.json.output(None),
                           retcode=-11)
  )

  yield (
    api.test('build_dynamic_isolated_script_test_compile_target_overriden') +
    props(builder='Linux Builder',
          parent_buildername=None) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props(builder='Linux Builder',
          parent_buildername=None) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props(builder='Linux Builder',
          parent_buildername=None) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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_sharded_passed_isolated_script_test') +
    props(buildnumber='1234',
          version='v23523',
          git_revision='a' * 40,
          swarm_hashes={
              'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee'
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
        'telemetry_gpu_unittests',
        api.swarming.canned_summary_output(2)
        + api.test_utils.canned_isolated_script_output(
            passing=True, is_win=False, swarming=True,
            shards=2, isolated_script_passing=True,
            use_json_test_format=True, output_chartjson=True),
        retcode=0)
  )

  yield (
    api.test('dynamic_swarmed_sharded_corrupt_json_isolated_script_test') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 3,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
        'telemetry_gpu_unittests',
        api.swarming.canned_summary_output(3)
        + api.test_utils.canned_isolated_script_output(
            passing=True, is_win=False, swarming=True,
            shards=3, isolated_script_passing=True, corrupt=True,
            use_json_test_format=True, output_chartjson=True),
        retcode=0)
  )

  yield (
    api.test('dynamic_swarmed_sharded_invalid_json_isolated_script_test') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 3,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data('telemetry_gpu_unittests',
        api.json.output({'version': 2}),
        retcode=0)
  )

  yield (
    api.test('dynamic_swarmed_sharded_failed_isolated_script_test') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
        'telemetry_gpu_unittests',
        api.swarming.canned_summary_output(2)
        + api.test_utils.canned_isolated_script_output(
            passing=False, is_win=False, swarming=True,
            shards=2, isolated_script_passing=False,
            use_json_test_format=True), retcode=1)
  )

  yield (
    api.test('dynamic_swarmed_sharded_isolated_script_test_missing_shard') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
      'telemetry_gpu_unittests',
      api.swarming.canned_summary_output(2)
      + api.test_utils.canned_isolated_script_output(
        passing=True, is_win=False, swarming=True,
        shards=2, isolated_script_passing=True, valid=True,
        missing_shards=[1]),
      retcode=1)
  )

  yield (
    api.test('dynamic_swarmed_sharded_isolated_script_test_harness_failure') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
      'telemetry_gpu_unittests',
      api.swarming.canned_summary_output(2)
      + api.test_utils.canned_isolated_script_output(
        passing=True, is_win=False, swarming=True,
        shards=2, isolated_script_passing=True, valid=True,
        empty_shards=[1]),
      retcode=1)
  )

  yield (
    api.test(
      'dynamic_swarmed_sharded_isolated_chartjson_test_harness_failure') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
      'telemetry_gpu_unittests',
      api.swarming.canned_summary_output(2)
      + api.test_utils.canned_isolated_script_output(
        passing=True, is_win=False, swarming=True,
        shards=4, isolated_script_passing=True,
        empty_shards=[1], output_chartjson=True,
        use_json_test_format=True),
      retcode=1)
  )

  yield (
    api.test('dynamic_swarmed_sharded_isolated_chartjson_test_disabled') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
        'telemetry_gpu_unittests',
        api.swarming.canned_summary_output(2)
        + api.test_utils.canned_isolated_script_output(
            passing=True, is_win=False, swarming=True,
            shards=2, isolated_script_passing=True,
            output_chartjson=True, benchmark_enabled=False,
            use_json_test_format=True),
        retcode=0)
  )

  yield (
    api.test(
        'dynamic_swarmed_sharded_isolated_chartjson_test_missing_all_shards') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
      'telemetry_gpu_unittests',
      api.swarming.canned_summary_output(2)
      + api.test_utils.canned_isolated_script_output(
        passing=True, is_win=False, swarming=True,
        shards=2, isolated_script_passing=True,
        missing_shards=[1], output_chartjson=True, use_json_test_format=True),
      retcode=1) +
    api.post_process(
        post_process.DoesNotRun, 'telemetry_gpu_unittests Dashboard Upload') +
    api.post_process(
        post_process.Filter('telemetry_gpu_unittests'))
  )

  yield (
    api.test('dynamic_swarmed_sharded_isolated_chartjson_test_missing_shard') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                        'isolate_name': 'telemetry_gpu_unittests',
                        'name': 'telemetry_gpu_unittests',
                        'swarming': {
                            'can_use_on_swarming_builders': True,
                            'shards': 2,
                        },
                    },
                ],
            },
        })
    ) +
    api.override_step_data(
      'telemetry_gpu_unittests',
      api.swarming.canned_summary_output(2)
      + api.test_utils.canned_isolated_script_output(
        passing=True, is_win=False, swarming=True,
        shards=2, isolated_script_passing=True,
        missing_shards=[1], output_chartjson=True, use_json_test_format=True),
      retcode=1)
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_linux_gpu') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props(mastername='chromium.mac',
          builder='Mac10.13 Tests',
          parent_buildername='Mac Builder',
          swarm_hashes={
              'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('mac', 64) +
    api.override_step_data(
        'read test spec (chromium.mac.json)',
        api.json.output({
            'Mac10.13 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 GT750M
                                    'hidpi': '1',
                                    'os': 'Mac-10.13',
                                },
                            ],
                        },
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_win_gpu') +
    props(mastername='chromium.win',
          builder='Win7 Tests (1)',
          parent_buildername='Win Builder',
          swarm_hashes={
              'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('win', 64) +
    api.override_step_data(
        'read test spec (chromium.win.json)',
        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': [
                                {
                                    # NVIDIA GeForce GT 610
                                    'gpu': '10de:104a',
                                    'os': 'Windows',
                                }, {
                                    # AMD Radeon HD 6450
                                    'gpu': '1002:6779',
                                    'os': 'Windows',
                                }, {
                                    # VMWare SVGA II Adapter
                                    'gpu': '15ad:0405',
                                    'os': 'Windows',
                                },
                            ],
                        },
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_swarmed_isolated_script_test_win_non_gpu') +
    props(mastername='chromium.win',
          builder='Win7 Tests (1)',
          parent_buildername='Win Builder',
          swarm_hashes={
              'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('win', 64) +
    api.override_step_data(
        'read test spec (chromium.win.json)',
        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') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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.swarming.canned_summary_output()
        + 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') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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.swarming.canned_summary_output()
        + 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') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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.swarming.canned_summary_output(internal_failure=True)
        + 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(
        'dynamic_swarmed_isolated_script_test_failure_no_result_json') +
    props(swarm_hashes={
        'telemetry_gpu_unittests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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.swarming.canned_summary_output(failure=True)
        + api.json.output({}),
        retcode=1)
  )

  yield (
    api.test('dynamic_instrumentation_test') +
    props(mastername='chromium.android',
          builder='android-kitkat-arm-rel') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'android-kitkat-arm-rel': {
                'instrumentation_tests': [
                    {
                        'test': 'ChromePublicTest',
                        'test_apk': 'one_apk',
                        'apk_under_test': 'second_apk',
                        'additional_apks': [
                            'another_apk',
                            'omg_so_many_apks',
                        ],
                    }
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_instrumentation_test_custom_name') +
    props(mastername='chromium.android',
          builder='android-kitkat-arm-rel') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'android-kitkat-arm-rel': {
                'instrumentation_tests': [
                    {
                        'name': 'custom_test_name',
                        'test': 'default_test_name',
                        'test_apk': 'one_apk',
                        'apk_under_test': 'second_apk',
                        'additional_apks': [
                            'another_apk',
                            'omg_so_many_apks',
                        ],
                    }
                ],
            },
        })
    ) +
    api.post_process(post_process.MustRun, 'custom_test_name') +
    api.post_process(post_process.DoesNotRun, 'default_test_name')
  )

  yield (
    api.test('dynamic_instrumentation_nodefault_build') +
    props(mastername='chromium.android',
          builder='android-kitkat-arm-rel') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'android-kitkat-arm-rel': {
                'instrumentation_tests': [
                    {
                        'test': 'chrome_public_test_apk',
                    }
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_instrumentation_nodefault_test') +
    props(mastername='chromium.android',
          builder='android-kitkat-arm-rel') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'android-kitkat-arm-rel': {
                'instrumentation_tests': [
                    {
                        'test': 'chrome_public_test_apk',
                    }
                ],
            },
        })
    )
  )

  yield (
    api.test('dynamic_junit_test') +
    props(mastername='chromium.android',
          builder='android-kitkat-arm-rel') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'android-kitkat-arm-rel': {
                'junit_tests': [
                    {
                        'test': 'base_junit_tests',
                    },
                ],
            },
        })
    )
  )

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

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

  yield (
    api.test('dynamic_gtest_android') +
    props(mastername='chromium.android',
          builder='Lollipop Phone Tester',
          parent_buildername='Android arm Builder (dbg)') +
    api.override_step_data(
        'read test spec (chromium.android.json)',
        api.json.output({
            'Lollipop Phone Tester': {
                'gtest_tests': [
                    {
                      'test': 'base_unittests',
                    }
                ],
            },
        }))
  )

  yield (
    api.test('dynamic_gtest_fuchsia') +
    props(mastername='chromium.fyi',
          builder='Fuchsia') +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.fyi.json)',
        api.json.output({
            'Fuchsia': {
                'gtest_tests': [
                    {
                      'test': 'base_unittests',
                    }
                ],
            },
        }))
  )

  # Tests switching on asan and swiching off lsan for sandbox tester.
  yield (
    api.test('dynamic_gtest_memory_asan_no_lsan') +
    props(mastername='chromium.memory',
          builder='Linux ASan Tests (sandboxed)',
          parent_buildername='Linux ASan LSan Builder') +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.memory.json)',
        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') +
    props(mastername='chromium.memory',
          builder='Linux ASan LSan Builder',
          parent_buildername=None,
          revision='a' * 40) +
    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 (chromium.memory.json)',
        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') +
    props(mastername='chromium.memory',
          builder='Mac ASan 64 Tests (1)',
          parent_buildername='Mac ASan 64 Builder') +
    api.platform('mac', 64) +
    api.override_step_data(
        'read test spec (chromium.memory.json)',
        api.json.output({
            'Mac ASan 64 Tests (1)': {
                'gtest_tests': [
                    'browser_tests',
                ],
            },
        })
    )
  )

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

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

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

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

  yield (
    api.test('dynamic_script_test_with_args') +
    props() +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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') +
    props() +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        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('kitchen_path_config') +
    props(
        mastername='chromium.fyi',
        builder='Linux remote_run Builder',
        buildnumber='77457',
        path_config='kitchen')
  )

  yield (
    api.test('generic_path_config') +
    props(
        mastername='chromium.fyi',
        builder='Linux remote_run Builder',
        buildnumber='77457',
        path_config='generic')
  )

  yield (
    api.test('ensure_goma_fail') +
    props(
        mastername='chromium.fyi',
        builder='Linux remote_run Builder',
        buildnumber='77457',
        path_config='kitchen') +
    api.override_step_data('ensure_goma.ensure_installed', retcode=1)
  )

  json_results = {
    'interrupted': False,
    'version': 3,
    'path_delimiter': '/',
    'seconds_since_epoch': 0,
    'tests': {},
    'num_failures_by_type': {},
    'links': {'custom_link': 'http://example.com'}
  }

  yield (
    api.test('gtest_custom_merge_script') +
    props(swarm_hashes={
        'browser_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'gtest_tests': [
                    {
                        'test': 'browser_tests',
                        'swarming': {'can_use_on_swarming_builders': True},
                        'merge': {
                            'script': '//fake_merge_script.py',
                        },
                    },
                ],
            },
        })
    ) +
    api.post_process(post_process.Filter('browser_tests'))
  )

  yield (
    api.test('gtest_bad_custom_merge_script') +
    props(swarm_hashes={
        'browser_tests': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'gtest_tests': [
                    {
                        'test': 'browser_tests',
                        'swarming': {'can_use_on_swarming_builders': True},
                        'merge': {
                            'script': 'fake_merge_script.py',
                        },
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('isolated_script_test_custom_merge_script') +
    props(swarm_hashes={
        'fake_test': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.step_data('fake_test', api.json.output(json_results)) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'fake_test',
                      'name': 'fake_test',
                      'merge': {
                        'script': '//fake_merge_script.py',
                      },
                      'swarming': {
                        'can_use_on_swarming_builders': True,
                      },
                    },
                ],
            },
        })
    ) +
    api.post_process(post_process.Filter('fake_test'))
  )

  yield (
    api.test('isolated_script_test_bad_custom_merge_script') +
    props(swarm_hashes={
        'fake_test': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'fake_test',
                      'name': 'fake_test',
                      'merge': {
                        'script': 'bad_fake_merge_script.py',
                      },
                      'swarming': {
                        'can_use_on_swarming_builders': True,
                      },
                    },
                ],
            },
        })
    )
  )

  yield (
    api.test('isolated_script_test_custom_merge_script_with_args') +
    props(swarm_hashes={
        'fake_test': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.step_data('fake_test', api.json.output(json_results)) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'fake_test',
                      'name': 'fake_test',
                      'merge': {
                        'script': '//fake_merge_script.py',
                        'args': [
                          '--foo', 'foo_value',
                        ],
                      },
                      'swarming': {
                        'can_use_on_swarming_builders': True,
                      },
                    },
                ],
            },
        })
    ) +
    api.post_process(post_process.Filter('fake_test'))
  )

  yield (
    api.test('isolated_script_test_custom_results_handler') +
    props(swarm_hashes={
        'fake_test': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.step_data('fake_test', api.json.output(json_results)) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'fake_test',
                      'name': 'fake_test',
                      'results_handler': 'fake',
                      'swarming': {
                        'can_use_on_swarming_builders': True,
                      },
                    },
                ],
            },
        })
    ) +
    api.post_process(post_process.Filter('fake_test'))
  )

  yield (
    api.test('isolated_script_test_invalid_results_handler') +
    props(swarm_hashes={
        'fake_test': 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
    }) +
    api.platform('linux', 64) +
    api.override_step_data(
        'read test spec (chromium.linux.json)',
        api.json.output({
            'Linux Tests': {
                'isolated_scripts': [
                    {
                      'isolate_name': 'fake_test',
                      'name': 'fake_test',
                      'results_handler': 'unknown',
                    },
                ],
            },
        })
    )
  )
