blob: b479c25cc4d8f9ffe36b67fb840bac83b129f4d5 [file] [log] [blame]
# Copyright 2017 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for builder_status_lib."""
from chromite.lib import builder_status_lib
from chromite.lib import buildstore
from chromite.lib import cidb
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import failure_message_lib
from chromite.lib import failure_message_lib_unittest
from chromite.lib import fake_cidb
stage_failure_helper = failure_message_lib_unittest.StageFailureHelper
def ConstructFailureMessages(build_config):
"""Helper method to construct failure messages."""
entry_1 = stage_failure_helper.GetStageFailure(
build_config=build_config, failure_id=1
)
entry_2 = stage_failure_helper.GetStageFailure(
build_config=build_config, failure_id=2, outer_failure_id=1
)
entry_3 = stage_failure_helper.GetStageFailure(
build_config=build_config, failure_id=3, outer_failure_id=1
)
failure_entries = [entry_1, entry_2, entry_3]
failure_messages = (
failure_message_lib.FailureMessageManager.ConstructStageFailureMessages(
failure_entries
)
)
return failure_messages
class BuilderStatusLibTests(cros_test_lib.MockTestCase):
"""Tests for builder_status_lib."""
def testGetSlavesAbortedBySelfDestructedMaster(self) -> None:
"""Test GetSlavesAbortedBySelfDestructedMaster with aborted slaves."""
db = fake_cidb.FakeCIDBConnection()
bs = buildstore.FakeBuildStore(db)
cidb.CIDBConnectionFactory.SetupMockCidb(db)
master_build_id = db.InsertBuild(
"master", 1, "master", "bot_hostname", buildbucket_id=1234
)
master_build_identifier = buildstore.BuildIdentifier(
cidb_id=master_build_id, buildbucket_id=1234
)
self.assertEqual(
set(),
builder_status_lib.GetSlavesAbortedBySelfDestructedMaster(
master_build_identifier, bs
),
)
db.InsertBuild(
"slave_1",
1,
"slave_1",
"bot_hostname",
master_build_id=master_build_id,
buildbucket_id=12,
)
db.InsertBuild(
"slave_2",
2,
"slave_2",
"bot_hostname",
master_build_id=master_build_id,
buildbucket_id=23,
)
db.InsertBuild(
"slave_3",
3,
"slave_3",
"bot_hostname",
master_build_id=master_build_id,
buildbucket_id=34,
)
for slave_build_id in (12, 23):
db.InsertBuildMessage(
master_build_id,
message_type=buildstore.MESSAGE_TYPE_IGNORED_REASON,
message_subtype=buildstore.MESSAGE_SUBTYPE_SELF_DESTRUCTION,
message_value=str(slave_build_id),
)
self.assertEqual(
{"slave_1", "slave_2"},
builder_status_lib.GetSlavesAbortedBySelfDestructedMaster(
buildstore.BuildIdentifier(
cidb_id=master_build_id, buildbucket_id=1234
),
bs,
),
)
# pylint: disable=protected-access
class BuilderStatusManagerTest(cros_test_lib.MockTestCase):
"""Tests for BuilderStatusManager."""
def setUp(self) -> None:
self.db = fake_cidb.FakeCIDBConnection()
def testCreateBuildFailureMessageWithMessages(self) -> None:
"""Test CreateBuildFailureMessage with stage failure messages."""
overlays = constants.PRIVATE_OVERLAYS
dashboard_url = "http://fake_dashboard_url"
slave = "cyan-paladin"
failure_messages = ConstructFailureMessages(slave)
build_msg = (
builder_status_lib.BuilderStatusManager.CreateBuildFailureMessage(
slave, overlays, dashboard_url, failure_messages
)
)
self.assertTrue("the builder failed" in build_msg.message_summary)
self.assertTrue(build_msg.internal)
self.assertEqual(build_msg.builder, slave)
def testCreateBuildFailureMessageWithoutMessages(self) -> None:
"""Test CreateBuildFailureMessage without stage failure messages."""
overlays = constants.PUBLIC_OVERLAYS
dashboard_url = "http://fake_dashboard_url"
slave = "cyan-paladin"
build_msg = (
builder_status_lib.BuilderStatusManager.CreateBuildFailureMessage(
slave, overlays, dashboard_url, None
)
)
self.assertTrue("cbuildbot failed" in build_msg.message_summary)
self.assertFalse(build_msg.internal)
self.assertEqual(build_msg.builder, slave)
def testCreateBuildFailureMessageWhenCanceled(self) -> None:
"""Test CreateBuildFailureMessage with no stage failure and canceled"""
overlays = constants.PRIVATE_OVERLAYS
dashboard_url = "http://fake_dashboard_url"
slave = "cyan-paladin"
build_msg = (
builder_status_lib.BuilderStatusManager.CreateBuildFailureMessage(
slave,
overlays,
dashboard_url,
None,
aborted_by_self_destruction=True,
)
)
self.assertTrue(
"aborted by self-destruction" in build_msg.message_summary
)
self.assertFalse("cbuildbot failed" in build_msg.message_summary)
self.assertEqual(build_msg.builder, slave)
def testCreateBuildFailureMessageSupersedesCancellation(self) -> None:
"""Test CreateBuildFailureMessage with a stage failure when canceled"""
overlays = constants.PRIVATE_OVERLAYS
dashboard_url = "http://fake_dashboard_url"
slave = "cyan-paladin"
failure_messages = ConstructFailureMessages(slave)
build_msg = (
builder_status_lib.BuilderStatusManager.CreateBuildFailureMessage(
slave,
overlays,
dashboard_url,
failure_messages,
aborted_by_self_destruction=True,
)
)
self.assertFalse("canceled by master" in build_msg.message_summary)
self.assertFalse("cbuildbot failed" in build_msg.message_summary)
self.assertEqual(build_msg.builder, slave)