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

DEPS = [
  'dart',
  'depot_tools/bot_update',
  'depot_tools/depot_tools',
  'depot_tools/gclient',
  'depot_tools/osx_sdk',
  'recipe_engine/context',
  'recipe_engine/path',
  'recipe_engine/properties',
  'recipe_engine/step',
  'test_utils',
  'swarming_client',
]


TEST_MATRIX = {
  "filesets": {
    "fileset1": "[]",
    "nameoffileset": "[]"
  },
  "global": {
    "chrome": "66.0.3359.139",
    "firefox": "60.0.1"
  },
  "builder_configurations": [
    {
      "builders": [
        "dart2js-win10-debug-x64-firefox",
        "analyzer-linux-release-none"
      ],
      "meta": {},
      "steps": [{
        "name": "Build",
        "script": "tools/build.py",
        "arguments": ["foo", "--bar"],
        "shards": 1
      }, {
        "name": "Test-step 1",
        "script": "tools/test.py",
        "arguments": ["foo", "--bar"],
        "tests": ["-e co19", "language_2"]
      }, {
        "name": "Test-step 2",
        "arguments": ["foo", "--bar", "-mdebug",
                      "-n${runtime}-foo-${mode}-${arch}-bar"],
        "tests": []
      }]
    },
    {
      "builders": [
        "dart2js-linux-release-chrome"
      ],
      "meta": {},
      "steps": [{
        "name": "Test-step 1",
        "script": "tools/test.py",
        "arguments": ["foo", "--bar"],
        "tests": ["-e co19", "language_2"],
        "excludeTests": []
      }, {
        "name": "Test-step custom",
        "script": "tools/custom_thing.py",
        "arguments": ["foo", "--bar"]
      }, {
        "name": "Test-step 2",
        "arguments": ["foo", "--bar"],
        "tests": ["co19"]
      }]
    }
  ]
}


def RunSteps(api):
  with api.osx_sdk('mac'):
    _run_steps_impl(api)


def _run_steps_impl(api):
  latest, latest_revision = api.dart.get_latest_tested_commit()
  # If parent_fileset is set, the bot is triggered by
  # another builder, and we should not download the sdk.
  # We rely on all files being in the isolate
  if 'parent_fileset' in api.properties:
    # todo(athom): this doesn't work on windows, see bug 785362.
    api.swarming_client.checkout('master')
    api.dart.download_parent_isolate()
  else:
    builder_name = api.properties.get('buildername')
    builder_fragments = builder_name.split('-')
    channel = builder_fragments[-1]
    if channel not in ['be', 'dev', 'stable', 'integration', 'try']:
      channel = 'be'
    clobber = 'clobber' in api.properties
    # todo(athom): remove the new workflow check when enabled by default
    if channel == 'try' and 'new_workflow_enabled' in api.properties:
      api.dart.checkout(clobber, revision=latest_revision)
    else:
      api.dart.checkout(clobber)

  api.dart.kill_tasks()

  try_build_args = api.properties.get('try_build_args', None)
  try_commands = [key for key in api.properties.keys() if
      'try_cmd' in key and '_repeat' not in key]

  if try_build_args or try_commands:
    if try_build_args:
      build_args = try_build_args.split()
      api.dart.build(build_args)
    elif 'parent_fileset' not in api.properties:
      api.dart.build()
    try_commands.sort()
    with api.step.defer_results():
      with api.context(cwd=api.path['checkout']):
        for cmd_key in try_commands:
          try_test_cmd = api.properties[cmd_key].split()
          if try_test_cmd[0] == "xvfb":
            try_test_cmd = ['/usr/bin/xvfb-run','-a',
              '--server-args=-screen 0 1024x768x24'] + try_test_cmd[1:]
          try_test_repeat = api.properties.get(cmd_key + '_repeat', '1')
          for x in range(0, int(try_test_repeat)):
            api.step("%s %s" % (api.properties[cmd_key],x), try_test_cmd)
  else:
    with api.step.defer_results():
      api.dart.test(latest=latest, test_data=TEST_MATRIX)
      api.dart.kill_tasks()
      with api.context(cwd=api.path['checkout']):
        api.dart.read_debug_log()


def GenTests(api):
   yield (
      api.test('builders/vm-linux-release-x64') +
      api.properties.generic(
        buildername='builders/vm-linux-release-x64')
   )
   yield (
      api.test('builders/vm-linux-release-x64-try') +
      api.properties.generic(
        buildername='builders/vm-linux-release-x64-try',
        clobber='true')
   )
   yield (
      api.test('builders/dart2js-win10-debug-x64-firefox-try') +
      api.properties.generic(
        buildername='dart2js-win10-debug-x64-firefox-try',
        revision='3456abcd78ef',
        new_workflow_enabled='true')
   )
   yield (
      api.test('builders/try-cl-builder') +
      api.properties.generic(
          buildername='builders/vm-linux-release-x64-try',
          try_build_args='  runtime,sdk',
          try_cmd_1='tools/test.py -rchrome',
          try_cmd_2='tools/test.py -mdebug',
          try_cmd_2_repeat='2')
   )
   yield (
      api.test('builders/try-cl-builder-default-build') +
      api.properties.generic(
          buildername='builders/vm-linux-release-x64-try',
          try_cmd_1='xvfb tools/test.py  -mrelease',
          try_cmd_1_repeat='1',
          try_cmd_2='tools/test.py language_2/some_test',
          try_cmd_2_repeat='3')
   )
   yield (
      api.test('builders/analyzer-triggered') +
      api.properties.generic(
        buildername='builders/analyzer-triggered',
        parent_fileset='isolate_123',
        parent_fileset_name='test_name')
   )
