blob: 0a75dade79a3e24123f3617fa4997589f1a1a15f [file] [log] [blame]
# Copyright 2020 The Fuchsia 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.recipe_api import Property
from RECIPE_MODULES.flutter.shard_util.api import SubbuildResult
DEPS = [
"flutter/display_util",
"recipe_engine/buildbucket",
]
PROPERTIES = {
"raise_on_failure": Property(kind=bool, default=True),
}
# Build ids used to inject mock build objects to the buildbucket API.
SUCCESS_BUILD_ID = 123456789012345678
INFRA_FAILURE_BUILD_ID = 987654321098765432
FAILURE_BUILD_ID = 112233445566778899
FAILURE_BUILD_ID_2 = 112233445566778890
SCHEDULED_BUILD_ID = 199887766554433221
CANCELED_BUILD_ID = 987654321098765433
def RunSteps(api, raise_on_failure):
# Collect current build status using the buildbucket API. The build ids
# list passed to the API is to limit the query to only the build ids that
# we are interested on. This API return a Build oject only if the build
# exists in buildbucket.
builds = api.buildbucket.collect_builds(
build_ids=[
# Builds with the following ids are mocked in the GenTests section
# with different properties and status depending on the test.
SUCCESS_BUILD_ID,
INFRA_FAILURE_BUILD_ID,
FAILURE_BUILD_ID,
SCHEDULED_BUILD_ID,
CANCELED_BUILD_ID,
]
)
final_builds = {}
for key in builds:
build = builds[key]
final_builds[build.id] = SubbuildResult(
builder=build.builder.builder,
build_id=build.id,
build_name=build.builder.builder,
build_proto=build,
url='https://cr-buildbucket.appspot.com/build/%s' % build.id
)
api.display_util.display_subbuilds(
step_name="display builds",
subbuilds=final_builds,
raise_on_failure=raise_on_failure,
)
def GenTests(api):
def build(summary_markdown=None, **kwargs):
b = api.buildbucket.ci_build_message(**kwargs)
if summary_markdown:
b.summary_markdown = summary_markdown
return b
# Mock builds injected in the different tests.
success_build = build(
build_id=SUCCESS_BUILD_ID,
status="SUCCESS",
)
infra_failure_build = build(
build_id=INFRA_FAILURE_BUILD_ID,
status="INFRA_FAILURE",
summary_markdown="something failed related to infra",
)
failure_build = build(
build_id=FAILURE_BUILD_ID,
status="FAILURE",
summary_markdown="something failed not related to infra",
)
# Do not include summary_markdown to ensure full coverage.
failure_build_2 = build(
build_id=FAILURE_BUILD_ID_2,
status="FAILURE",
)
scheduled_build = build(
build_id=SCHEDULED_BUILD_ID,
status="SCHEDULED",
)
canceled_build = build(
build_id=CANCELED_BUILD_ID,
status="CANCELED",
summary_markdown="something failed related to infra",
)
yield (
api.test("mixed_with_infra_failures", status="INFRA_FAILURE") +
# Exercise all status colors.
# Purple failures prioritized over red failures.
api.buildbucket.simulated_collect_output([
success_build,
infra_failure_build,
failure_build,
scheduled_build,
])
)
yield (
api.test("canceled_builds", status="INFRA_FAILURE") +
# Exercise all status colors.
# Purple failures prioritized over red failures.
api.buildbucket.simulated_collect_output([
success_build,
canceled_build,
scheduled_build,
])
)
yield (
api.test("mixed_without_infra_failures", status="FAILURE") +
# With just red failures, raise red.
api.buildbucket.simulated_collect_output([
success_build,
failure_build,
failure_build_2,
scheduled_build,
])
)
yield (
api.test("all_passed") +
# With just red failures, raise red.
api.buildbucket.simulated_collect_output([
success_build,
])
)