# Copyright (c) 2020, the Dart project 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.post_process import DropExpectation, DoesNotRunRE, Filter, MustRun
from recipe_engine.recipe_api import Property

DEPS = [
    'depot_tools/gitiles',
    'bisect_build',
    'recipe_engine/properties',
    'recipe_engine/step',
    'recipe_engine/buildbucket',
]

PROPERTIES = {
    'current_failure':
        Property(
            kind=str,
            help="Reason for current failure or 'SUCCESS'",
            default="SUCCESS"),
}


def RunSteps(api, current_failure):
  api.m.bisect_build.schedule("https://dummy/repo/url", current_failure)


def _test(api, name, failure=None):
  data = api.test(
      name,
      api.buildbucket.ci_build(
          builder='builder',
          git_repo='https://dart.googlesource.com/sdk',
          revision='f' * 8))
  if failure:
    data += api.m.properties(current_failure=failure)
  return data


def GenTests(api):
  yield _test(api, 'basic')

  yield (_test(api, 'starts bisection', failure='failure') + api.step_data(
      'gitiles log: 2d72510e447ab60a9728aeea2362d8be2cbd7789..ffffffff',
      api.gitiles.make_log_test_data('master')) +
         api.buildbucket.simulated_search_results(
             [
                 api.buildbucket.ci_build_message(status='SUCCESS'),
             ],
             step_name='fetch previous build') + api.post_process(
                 MustRun,
                 'schedule bisect (f4d35da881f8fd329a4d3e01dd78b66a502d5c49)'))

  yield (_test(
      api, 'do-not-start-bisect-if-previous-build-failed', failure="failure") +
         api.buildbucket.simulated_search_results(
             [
                 api.buildbucket.ci_build_message(status='FAILURE'),
             ],
             step_name='fetch previous build') + api.post_process(
                 DoesNotRunRE, r'schedule bisect.*'))

  yield (_test(
      api, 'do-not-start-bisect-without-previous-build', failure="failure") +
         api.buildbucket.simulated_search_results(
             [], step_name='fetch previous build') + api.post_process(
                 DoesNotRunRE, r'schedule bisect.*'))

  yield api.test(
      'do-not-start-bisect-without-current-revision',
      api.buildbucket.ci_build(
          builder='builder',
          git_repo='https://dart.googlesource.com/sdk',
          revision=None), api.m.properties(current_failure="failure"),
      api.post_process(DoesNotRunRE, r'schedule bisect.*'))

  yield (_test(api, 'continue-bisect-on-failure', failure="failure") +
         api.properties(
             bisect_newer=['a', 'b', 'c'],
             bisect_older=['c', 'd', 'e'],
             bisect_reason="failure") + api.post_process(
                 MustRun, 'schedule bisect (d)') + api.post_process(
                     Filter('schedule bisect (d)')))

  yield (_test(api, 'continue-bisect-on-success') + api.properties(
      bisect_newer=['a', 'b', 'c'],
      bisect_older=['c', 'd', 'e'],
      bisect_reason="failure") + api.post_process(
          MustRun, 'schedule bisect (b)') + api.post_process(
              Filter('schedule bisect (b)')))

  yield (_test(api, 'fan-out-on-distinct-failure', failure="different failure")
         + api.properties(
             bisect_newer=['a', 'b', 'c'],
             bisect_older=['c', 'd', 'e'],
             bisect_reason='failure') + api.post_process(
                 MustRun, 'schedule bisect (b)') + api.post_process(
                     MustRun, 'schedule bisect (d)') + api.post_process(
                         Filter().include_re(r'schedule bisect \(.*\)')))

  yield (_test(api, 'stop-bisect') + api.properties(
      bisect_newer=[], bisect_older=[], bisect_reason='failure') +
         api.post_process(DoesNotRunRE, r'schedule bisect.*') +
         api.post_process(DropExpectation))
