# Copyright 2019 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.

"""This tests the engine's ability to handle many simultaneously-started steps.

Prior to this, logdog butler and the recipe engine would run out of file
handles, because every spawn_immediate would immediately generate all log
handles for the step, instead of waiting for the step's cost to be available.
"""

from recipe_engine.post_process import DropExpectation

from PB.recipe_modules.recipe_engine.futures.examples.lottasteps import Input
from PB.recipe_engine.result import RawResult
from PB.go.chromium.org.luci.buildbucket.proto import common

PYTHON_VERSION_COMPATIBILITY = 'PY2+3'

DEPS = [
  'futures',
  'properties',
  'step',
]

PROPERTIES = Input


def RunSteps(api, props):
  work = []
  for i in range(props.num_steps):
    work.append(api.futures.spawn_immediate(
        api.step, ('hw %d' % i), ['sleep', '.1'],
        __name='step %d' % i,
    ))
  api.futures.wait(work)
  return RawResult(
      summary_markdown="Ran %d steps" % (len(work),),
      status=common.SUCCESS,
  )


def GenTests(api):
  yield (
    api.test('basic')
    + api.properties(num_steps=10)
    + api.post_process(DropExpectation)
  )
