blob: f361ec71fb22023cb9c35ccaef7aa3760129cd0d [file] [log] [blame]
# Copyright 2016 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 scheduler stages."""
from unittest import mock
from chromite.cbuildbot import cbuildbot_run
from chromite.cbuildbot.stages import generic_stages
from chromite.cbuildbot.stages import generic_stages_unittest
from chromite.cbuildbot.stages import scheduler_stages
from chromite.lib import cidb
from chromite.lib import config_lib
from chromite.lib import constants
from chromite.lib import fake_cidb
from chromite.lib.buildstore import FakeBuildStore
class ScheduleSlavesStageTest(generic_stages_unittest.AbstractStageTestCase):
"""Unit tests for ScheduleSalvesStage."""
BOT_ID = "master-release"
def setUp(self):
# pylint: disable=protected-access
self.PatchObject(
cbuildbot_run._BuilderRunBase,
"GetVersion",
return_value="R84-13099.77.0",
)
# Create and set up a fake cidb instance.
self.fake_db = fake_cidb.FakeCIDBConnection()
cidb.CIDBConnectionFactory.SetupMockCidb(self.fake_db)
self.sync_stage = mock.Mock()
self._Prepare()
def ConstructStage(self):
bs = FakeBuildStore()
return scheduler_stages.ScheduleSlavesStage(
self._run, bs, self.sync_stage
)
def testRequestBuild(self):
config = config_lib.BuildConfig(
name="child",
build_affinity=True,
important=True,
display_label="cq",
boards=["board_A"],
build_type="paladin",
)
stage = self.ConstructStage()
self.PatchObject(
scheduler_stages.ScheduleSlavesStage,
"_FindMostRecentBotId",
return_value="chromeos-ci-test-1",
)
# pylint: disable=protected-access
request = stage._CreateScheduledBuild(
"child", config, 0, "master_bb_0", None
)
self.assertEqual(request.build_config, "child")
self.assertEqual(request.master_buildbucket_id, "master_bb_0")
self.assertEqual(
request.extra_args,
["--buildbot", "--master-buildbucket-id", "master_bb_0"],
)
def testRequestBuildWithSnapshotRev(self):
config = config_lib.BuildConfig(
name="child",
build_affinity=True,
important=True,
display_label="cq",
boards=["board_A"],
build_type="paladin",
)
stage = self.ConstructStage()
self.PatchObject(
scheduler_stages.ScheduleSlavesStage,
"_FindMostRecentBotId",
return_value="chromeos-ci-test-1",
)
# Set the annealing snapshot revision to pass to the child builders.
# pylint: disable=protected-access
stage._run.options.cbb_snapshot_revision = "hash1234"
request = stage._CreateScheduledBuild(
"child", config, 0, "master_bb_1", None
)
self.assertEqual(request.build_config, "child")
self.assertEqual(request.master_buildbucket_id, "master_bb_1")
expected_extra_args = [
"--buildbot",
"--master-buildbucket-id",
"master_bb_1",
"--cbb_snapshot_revision",
"hash1234",
]
self.assertEqual(request.extra_args, expected_extra_args)
def testScheduleSlaveBuildsSuccess(self):
"""Test ScheduleSlaveBuilds with success."""
stage = self.ConstructStage()
self.PatchObject(
scheduler_stages.ScheduleSlavesStage,
"PostSlaveBuildToBuildbucket",
return_value=("buildbucket_id", None),
)
slave_config_map = {
"target1-release": config_lib.BuildConfig(important=False),
"target2-full": config_lib.BuildConfig(important=True),
"target3-release": config_lib.BuildConfig(important=True),
}
self.PatchObject(
generic_stages.BuilderStage,
"_GetSlaveConfigMap",
return_value=slave_config_map,
)
self.PatchObject(
constants, "LEGACY_RELEASE_ALLOWLIST", new=["target1-release"]
)
stage.ScheduleSlaveBuildsViaBuildbucket(
important_only=False, dryrun=True
)
scheduled_slaves = self._run.attrs.metadata.GetValue(
constants.METADATA_SCHEDULED_IMPORTANT_SLAVES
)
self.assertEqual(len(scheduled_slaves), 1)
experimental_slaves = self._run.attrs.metadata.GetValue(
constants.METADATA_SCHEDULED_EXPERIMENTAL_SLAVES
)
self.assertEqual(len(experimental_slaves), 1)
unscheduled_slaves = self._run.attrs.metadata.GetValue(
constants.METADATA_UNSCHEDULED_SLAVES
)
self.assertEqual(len(unscheduled_slaves), 0)
def testPostSlaveBuildToBuildbucket(self):
"""Test PostSlaveBuildToBuildbucket on builds with a single board."""
slave_config = config_lib.BuildConfig(
name="slave",
build_affinity=True,
important=True,
display_label="cq",
boards=["board_A"],
build_type="paladin",
)
stage = self.ConstructStage()
self.PatchObject(
scheduler_stages.ScheduleSlavesStage,
"_FindMostRecentBotId",
return_value="chromeos-ci-test-1",
)
buildbucket_id, created_ts = stage.PostSlaveBuildToBuildbucket(
"slave", slave_config, 0, "master_bb_id", dryrun=True
)
self.assertEqual(buildbucket_id, "0")
self.assertEqual(created_ts, "1")