# 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 = [
    'build',
    'chromium',
    'chromium_tests',
    'commit_position',
    'depot_tools/bot_update',
    'depot_tools/gclient',
    'depot_tools/tryserver',
    'isolate',
    'recipe_engine/buildbucket',
    'recipe_engine/json',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/python',
    'recipe_engine/step',
    'swarming',
    'test_results',
    'test_utils',
]

from recipe_engine import post_process


def RunSteps(api):
  api.gclient.set_config('chromium')
  api.chromium.set_config('chromium')

  api.chromium_tests.set_precommit_mode()

  update_step = api.bot_update.ensure_checkout()

  single_spec = api.properties.get('single_spec')
  test_spec = {
      'test_buildername': {
          'isolated_scripts': [single_spec] if single_spec else [],
      }
  }

  for test in api.chromium_tests._generators.generate_isolated_script(
      api,
      api.chromium_tests,
      'test_mastername',
      'test_buildername',
      test_spec,
      update_step):
    try:
      test.pre_run(api, '')
      test.run(api, '')
    finally:
      api.step('details', [])
      api.step.active_result.presentation.logs['details'] = [
          'compile_targets: %r' % test.compile_targets(api),
          'uses_local_devices: %r' % test.uses_local_devices,
      ]


def GenTests(api):
  # FIXME: These tests should use the post_process.Filter methods to pick which
  # specific steps are important to the particular test.

  yield (
      api.test('basic') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
      },
      swarm_hashes={
        'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      })
  )

  yield (
      api.test('invalid_test_results') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
      },
      swarm_hashes={
        'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      }) +
      api.override_step_data('base_unittests', api.json.output({
          'valid': False,
          'failures': [],
      }))
  )

  yield (
      api.test('fake_results_handler') +
      api.properties(
          single_spec={
              'name': 'base_unittests',
              'isolate_name': 'base_unittests_run',
              'results_handler': 'fake',
              'swarming': {
                  'can_use_on_swarming_builders': True,
              },
          },
          swarm_hashes={
            'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
          },
      )
  )

  yield (
      api.test('swarming') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'merge': {
              'script': '//path/to/script.py',
          },
          'setup': [
            {'script': '//path/to/setup1.py'},
            {'script': '//path/to/setup2.py'}
          ],
          'teardown': [
            {'script': '//path/to/teardown1.py'},
            {'script': '//path/to/teardown2.py'}
          ],
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
        }, swarm_hashes={
            'base_unittests_run': 'deadbeef',
        },
        mastername='test_mastername',
        buildername='test_buildername',
        buildnumber=1)
  )

  yield (
      api.test('service_account') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'swarming': {
              'can_use_on_swarming_builders': True,
              'service_account': 'test-account@serviceaccount.com',
          },
        }, swarm_hashes={
            'base_unittests_run': 'deadbeef',
        },
        mastername='test_mastername',
        buildername='test_buildername',
        buildnumber=1) +
      api.post_process(post_process.StepCommandContains,
          '[trigger] base_unittests', [
              '--service-account', 'test-account@serviceaccount.com']) +
      api.post_process(post_process.DropExpectation)
  )

  yield (
      api.test('bad set up') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'merge': {
              'script': '//path/to/script.py',
          },
          'teardown': [
            {'script': '//path/to/teardown1.py'},
            {'script': 'path/to/teardown2.py'}
          ],
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
        }, swarm_hashes={
            'base_unittests_run': 'deadbeef',
        },
        mastername='test_mastername',
        buildername='test_buildername',
        buildnumber=1)
  )

  yield (
      api.test('bad tear down') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'merge': {
              'script': '//path/to/script.py',
          },
          'setup': [
            {'script': '//path/to/setup1.py'},
            {'script': 'path/to/setup2.py'}
          ],
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
        }, swarm_hashes={
            'base_unittests_run': 'deadbeef',
        },
        mastername='test_mastername',
        buildername='test_buildername',
        buildnumber=1)
  )

  yield (
      api.test('swarming_trigger_script') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'trigger_script': {
              'script': '//path/to/script.py',
          },
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
      }, swarm_hashes={
          'base_unittests_run': 'deadbeef',
      },
         mastername='test_mastername',
         buildername='test_buildername',
         buildnumber=1)
  )

  yield (
      api.test('swarming_trigger_script_invalid') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'trigger_script': {
              'script': 'bad',
          },
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
      }, swarm_hashes={
          'base_unittests_run': 'deadbeef',
      },
         mastername='test_mastername',
         buildername='test_buildername',
         buildnumber=1)
  )

  yield (
      api.test('swarming_dimension_sets') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                  {'os': 'Linux'},
              ],
          },
      }, swarm_hashes={
            'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      },
      mastername='test_mastername',
      buildername='test_buildername',
      buildnumber=1)
  )

  yield (
      api.test('swarming_dimension_sets_plus_optional') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'swarming': {
              'can_use_on_swarming_builders': True,
              'dimension_sets': [
                  {'os': 'Linux'},
              ],
              'optional_dimensions': {
                  60: [{'os': 'Ubuntu-14.04'}],
              },
          },
      }, swarm_hashes={
            'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      },
      mastername='test_mastername',
      buildername='test_buildername',
      buildnumber=1)
  )

  yield (
      api.test('spec_error') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'results_handler': 'bogus',
      })
  )

  yield (
      api.test('merge_invalid') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'merge': {
              'script': 'path/to/script.py',
          },
          'swarming': {
              'can_use_on_swarming_builders': True,
          },
      })
  )

  yield (
      api.test('precommit_args') +
      api.properties(single_spec={
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
          'args': [
              '--should-be-in-output',
          ],
          'precommit_args': [
              '--should-also-be-in-output',
          ],
      }, swarm_hashes={
            'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      })
  )

  yield (
      api.test('blink_web_tests_with_suffixes') +
      api.properties(
          single_spec={
              'name': 'blink_web_tests',
              'isolate_name': 'webkit_tests',
              'results_handler': 'layout tests',
              'swarming': {
                  'can_use_on_swarming_builders': True,
                  'dimension_sets': [{
                      'os': 'Mac',
                      'gpu': '8086:blah',
                  }],
              },
          },
          swarm_hashes={
            'webkit_tests': 'ffffffffffffffffffffffffffffffffffffffff',
          },
          mastername='test_mastername',
          buildername='test_buildername',
          buildnumber=1
      ) + api.post_process(post_process.Filter(
          # Ensure that we still pass the full step name to the test result
          # upload, but we pass a simplified step name to 'archive results'.
          'Upload to test-results [blink_web_tests on Intel GPU on Mac]',
          'archive results for blink_web_tests', '$result'))
  )

  yield (
      api.test('custom_webkit_tests_step_name') +
      api.properties(
          single_spec={
              'name': 'custom_webkit_tests',
              'isolate_name': 'webkit_tests',
              'results_handler': 'layout tests',
              'swarming': {
                  'can_use_on_swarming_builders': True,
              },
          },
          swarm_hashes={
            'webkit_tests': 'ffffffffffffffffffffffffffffffffffffffff',
          },
          mastername='test_mastername',
          buildername='test_buildername',
          buildnumber=1
      )
  )

  yield (
      api.test('swarming_cipd_packages') +
      api.properties(
          single_spec={
              'name': 'base_unittests',
              'isolate_name': 'base_unittests_run',
              'trigger_script': {
                  'script': '//path/to/script.py',
              },
              'swarming': {
                  'can_use_on_swarming_builders': True,
                  'cipd_packages': [{
                      'cipd_package': 'cipd/package/name',
                      'location': '../../cipd/package/location',
                      'revision': 'version:1.0',
                   }],
              },
          },
          swarm_hashes={
              'base_unittests_run': 'deadbeef',
          },
          mastername='test_mastername',
          buildername='test_buildername',
          buildnumber=1
      ) +
      api.post_process(post_process.StepCommandContains,
          '[trigger] base_unittests',
          [
              '--cipd-package',
              '../../cipd/package/location:cipd/package/name:version:1.0',
          ]
      ) +
      api.post_process(post_process.DropExpectation)
  )

  yield (
    api.test('experimental') +
      api.properties(single_spec={
          'experiment_percentage': '100',
          'name': 'base_unittests',
          'isolate_name': 'base_unittests_run',
      },
      swarm_hashes={
        'base_unittests_run': 'ffffffffffffffffffffffffffffffffffffffff',
      }) +
    api.step_data('base_unittests', retcode=1) +
    api.post_process(post_process.StatusSuccess) +
    api.post_process(post_process.DropExpectation))
