# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import recipe_api
from recipe_engine.types import freeze

DEPS = [
  'archive',
  'chromedriver',
  'chromium',
  'chromium_android',
  'commit_position',
  'depot_tools/bot_update',
  'depot_tools/gclient',
  'recipe_engine/json',
  'recipe_engine/platform',
  'recipe_engine/properties',
  'recipe_engine/raw_io',
  'recipe_engine/step',
]

BUILDERS = freeze({
  'Android ChromeDriver Tests Example': {
    'chromedriver_platform': 'android',
    # Whether or not to update the test results log (Android only).
    'update_test_log': True,
    'android_packages': [
      'chrome_shell',
      'chrome_stable',
      'chrome_beta',
      'chromedriver_webview_shell',
    ],
  },
})

def RunSteps(api):
  buildername = api.properties['buildername']
  builder = BUILDERS[buildername]
  android_packages = builder.get('android_packages')
  update_test_log = builder.get('update_test_log')

  api.chromium.set_config('chromium')
  api.gclient.set_config('chromium')
  api.bot_update.ensure_checkout(force=True)
  platform = builder.get('chromedriver_platform')

  commit_position = api.commit_position.parse_revision(
      api.properties['got_revision_cp'])

  if platform == 'android':
    api.chromedriver.download_prebuilts()

  passed = True
  try:
    api.chromedriver.run_all_tests(android_packages=android_packages,
                                   archive_server_logs=True)
  except api.step.StepFailure:
    passed = False

  if platform == 'android':
    if update_test_log:
      api.chromedriver.update_test_results_log(
          platform, commit_position, passed)

def GenTests(api):

  sanitize = lambda s: ''.join(c if c.isalnum() else '_' for c in s)

  yield (
      api.test('%s_basic' % sanitize('Android ChromeDriver')) +
      api.properties.generic(
          buildername='Android ChromeDriver Tests Example',
          slavename='slavename') +
      api.properties(
          parent_build_archive_url='gs://test-domain/test-archive.zip',
          got_revision_cp='refs/heads/master@{#3333333333}'))

  yield (
      api.test('%s_test_failure' % sanitize('Android ChromeDriver')) +
      api.properties.generic(
          buildername='Android ChromeDriver Tests Example',
          slavename='slavename') +
      api.properties(
          parent_build_archive_url='gs://test-domain/test-archive.zip',
          got_revision_cp='refs/heads/master@{#3333333333}') +
      api.step_data('java_tests chrome_stable.Run Tests', retcode=1))

  yield (
      api.test('%s_commit_already_in_logs' % sanitize('Android ChromeDriver')) +
      api.properties.generic(
          buildername='Android ChromeDriver Tests Example',
          slavename='slavename') +
      api.properties(
          parent_build_archive_url='gs://test-domain/test-archive.zip',
          got_revision_cp='refs/heads/master@{#3333333333}') +
      api.step_data('Download Test Results Log.read results log file',
                    api.raw_io.output('{"3333333333": true}')))

  yield (
      api.test('%s_download_logs_failure' % sanitize('Android ChromeDriver')) +
      api.properties.generic(
          buildername='Android ChromeDriver Tests Example',
          slavename='slavename') +
      api.properties(
          parent_build_archive_url='gs://test-domain/test-archive.zip',
          got_revision_cp='refs/heads/master@{#3333333333}') +
      api.step_data(
          'Download Test Results Log.gsutil download results log', retcode=1))

  yield (
      api.test('%s_unexpected_prebuilt' % sanitize('Android ChromeDriver')) +
      api.properties.generic(
          buildername='Android ChromeDriver Tests Example',
          slavename='slavename') +
      api.properties(
          parent_build_archive_url='gs://test-domain/test-archive.zip',
          got_revision_cp='refs/heads/master@{#3333333333}') +
      api.step_data(
          'Download Prebuilts.listdir get prebuilt filename',
          api.json.output(['rNone.zip'])))
