blob: ba257cf8b1dcd973ee27cec7a8b97258945a8877 [file] [log] [blame]
# Copyright 2015 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.
"""Tests that run_steps is handling recipe failures correctly."""
from PB.recipe_engine import result as result_pb2
from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2
from recipe_engine import post_process
DEPS = [
'step',
'json'
]
def RunSteps(api):
raw_result = result_pb2.RawResult()
try:
result = api.step('step_result',
['cmd', api.json.output()], timeout=480)
if result.json.output:
raw_result.summary_markdown = result.json.output['summary']
raw_result.status = common_pb2.SUCCESS
else:
raw_result.summary_markdown = 'No json output.'
raw_result.status = common_pb2.FAILURE
except api.step.StepFailure:
step_data = api.step.active_result
if step_data.json.output:
raw_result.summary_markdown = step_data.json.output['summary']
if step_data.exc_result.had_timeout:
raw_result.summary_markdown += 'Failure : Timeout'
raw_result.status = common_pb2.FAILURE
elif step_data.exc_result.retcode == 1:
raw_result.status = common_pb2.FAILURE
else:
raw_result.status = common_pb2.INFRA_FAILURE
if raw_result.summary_markdown == '':
raise
return raw_result
def GenTests(api):
yield (
api.test('successful_result') +
api.step_data('step_result', api.json.output(
{'summary': 'This test should be successful'})) +
api.post_process(post_process.StatusSuccess) +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('successful_result_no_json') +
api.step_data('step_result', api.json.output({})) +
api.post_process(post_process.StatusFailure) +
api.post_process(post_process.ResultReason, "No json output.") +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('failure_result') +
api.step_data('step_result', api.json.output(
{'summary': 'Failure: step failed at line 90'}, retcode=1)) +
api.post_process(post_process.StatusFailure) +
api.post_process(post_process.ResultReason,
"Failure: step failed at line 90") +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('infra_failure_result') +
api.step_data('step_result', api.json.output(
{'summary': 'Infra Failure: no memory'}, retcode=2)) +
api.post_process(post_process.StatusException) +
api.post_process(post_process.ResultReason,
"Infra Failure: no memory") +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('failure_result_no_json') +
api.step_data('step_result', api.json.output(None, retcode=1)) +
api.post_process(post_process.StatusFailure) +
api.post_process(post_process.ResultReason,
"Step('step_result') (retcode: 1)") +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('infra_failure_result_no_json') +
api.step_data('step_result', api.json.output(None, retcode=2)) +
api.post_process(post_process.StatusFailure) +
api.post_process(post_process.ResultReason,
"Step('step_result') (retcode: 2)") +
api.post_process(post_process.DropExpectation)
)
yield (
api.test('timeout_result') +
api.step_data('step_result', api.json.output({'summary': ''}),
times_out_after=60*20) +
api.post_process(post_process.StatusFailure) +
api.post_process(post_process.ResultReason, "Failure : Timeout") +
api.post_process(post_process.DropExpectation)
)