# Copyright 2018 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 buildstore library."""

from unittest import mock

from chromite.lib import buildbucket_v2
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


BuildStore = buildstore.BuildStore


class TestBuildStore(cros_test_lib.MockTestCase):
    """Test buildstore.BuildStore."""

    # pylint: disable=protected-access

    def testIsCIDBClientMissing(self) -> None:
        """Tests _IsCIDBClientMissing function."""
        # Test CIDB needed and client missing.
        bs = BuildStore(_read_from_bb=False, _write_to_cidb=True)
        self.assertEqual(bs._IsCIDBClientMissing(), True)
        bs = BuildStore(_read_from_bb=True, _write_to_cidb=True)
        self.assertEqual(bs._IsCIDBClientMissing(), True)
        bs = BuildStore(_read_from_bb=False, _write_to_cidb=False)
        self.assertEqual(bs._IsCIDBClientMissing(), True)
        # Test CIDB is needed and client is up and running.
        bs = BuildStore(_read_from_bb=False, _write_to_cidb=True)
        bs.cidb_conn = object()
        self.assertEqual(bs._IsCIDBClientMissing(), False)
        bs = BuildStore(_read_from_bb=True, _write_to_cidb=True)
        bs.cidb_conn = object()
        self.assertEqual(bs._IsCIDBClientMissing(), False)
        bs = BuildStore(_read_from_bb=False, _write_to_cidb=False)
        bs.cidb_conn = object()
        self.assertEqual(bs._IsCIDBClientMissing(), False)
        # Test CIDB is not needed.
        bs = BuildStore(_read_from_bb=True, _write_to_cidb=False)
        self.assertEqual(bs._IsCIDBClientMissing(), False)

    def testIsBuildbucketClientMissing(self) -> None:
        """Tests _IsBuildbucketClientMissing function."""
        # Test Buildbucket needed and client missing.
        bs = BuildStore(_read_from_bb=True, _write_to_bb=True)
        self.assertEqual(bs._IsBuildbucketClientMissing(), True)
        bs = BuildStore(_read_from_bb=True, _write_to_bb=False)
        self.assertEqual(bs._IsBuildbucketClientMissing(), True)
        bs = BuildStore(_read_from_bb=False, _write_to_bb=True)
        self.assertEqual(bs._IsBuildbucketClientMissing(), True)
        # Test Buildbucket is needed and client is up and running.
        bs = BuildStore(_read_from_bb=True, _write_to_bb=True)
        bs.bb_client = object()
        self.assertEqual(bs._IsBuildbucketClientMissing(), False)
        bs = BuildStore(_read_from_bb=False, _write_to_bb=True)
        bs.bb_client = object()
        self.assertEqual(bs._IsBuildbucketClientMissing(), False)
        bs = BuildStore(_read_from_bb=True, _write_to_bb=False)
        bs.bb_client = object()
        self.assertEqual(bs._IsBuildbucketClientMissing(), False)
        # Test Buildbucket is not needed.
        bs = BuildStore(_read_from_bb=False, _write_to_bb=False)
        self.assertEqual(bs._IsBuildbucketClientMissing(), False)

    def testInitializeClientsWithCIDBSetup(self) -> None:
        """Tests InitializeClients with mock CIDB."""

        class StubCIDBConnection:
            """Stub class representing CIDBConnection."""

        # With CIDB setup, cidb_conn is populated.
        self.PatchObject(
            cidb.CIDBConnectionFactory, "IsCIDBSetup", return_value=True
        )
        mock_cidb = StubCIDBConnection()
        self.PatchObject(
            cidb.CIDBConnectionFactory,
            "GetCIDBConnectionForBuilder",
            return_value=mock_cidb,
        )
        bs = BuildStore()
        result = bs.InitializeClients()
        self.assertEqual(bs.cidb_conn, mock_cidb)
        self.assertEqual(result, True)

    def testInitializeClientsWithoutCIDBSetup(self) -> None:
        """Tests InitializeClients with mock CIDB."""

        self.PatchObject(
            cidb.CIDBConnectionFactory, "IsCIDBSetup", return_value=False
        )
        bs = BuildStore()
        self.assertEqual(bs.InitializeClients(), False)

    def testInitializeClientsWhenCIDBIsNotNeeded(self) -> None:
        """Test InitializeClients without CIDB requirement."""
        bs = BuildStore(_read_from_bb=True, _write_to_cidb=False)
        bs.cidb_conn = None
        self.PatchObject(
            BuildStore, "_IsBuildbucketClientMissing", return_value=False
        )
        # Does not raise exception.
        self.assertEqual(bs.InitializeClients(), True)

    def testInitializeClientsWithBuildbucketSetup(self) -> None:
        """Tests InitializeClients with mock Buildbucket."""
        bs = BuildStore()
        self.PatchObject(bs, "_IsCIDBClientMissing", return_value=False)
        result = bs.InitializeClients()
        self.assertIsInstance(bs.bb_client, buildbucket_v2.BuildbucketV2)
        self.assertEqual(result, True)

    def testInitializeClientsWhenBuildbucketIsNotNeeded(self) -> None:
        """Test InitializeClients without Buildbucket requirement."""
        bs = BuildStore(_read_from_bb=False, _write_to_bb=False)
        self.PatchObject(BuildStore, "_IsCIDBClientMissing", return_value=False)
        # Does not raise exception.
        self.assertEqual(bs.InitializeClients(), True)

    def testInsertBuild(self) -> None:
        """Tests the redirect for InsertBuild function."""
        self.PatchObject(BuildStore, "InitializeClients", return_value=True)
        # Test CIDB redirect.
        bs = BuildStore(_write_to_cidb=True, _write_to_bb=False)
        bs.cidb_conn = mock.MagicMock()
        self.PatchObject(
            bs.cidb_conn, "InsertBuild", return_value=constants.MOCK_BUILD_ID
        )
        build_id = bs.InsertBuild(
            "builder_name",
            12345,
            "something-paladin",
            "bot_hostname",
            master_build_id="master_id",
            timeout_seconds="timeout",
        )
        bs.cidb_conn.InsertBuild.assert_called_once_with(
            "builder_name",
            12345,
            "something-paladin",
            "bot_hostname",
            "master_id",
            "timeout",
            None,
            None,
            None,
        )
        self.assertEqual(build_id, constants.MOCK_BUILD_ID)
        # Test Buildbucket redirect.
        bs = BuildStore(_write_to_cidb=False, _write_to_bb=True)
        bs.bb_client = mock.MagicMock()
        self.PatchObject(buildbucket_v2, "UpdateSelfCommonBuildProperties")
        build_id = bs.InsertBuild(
            "builder_name",
            12345,
            "something-paladin",
            "bot_hostname",
            important=True,
            timeout_seconds="timeout",
        )
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_once_with(
            cidb_id=build_id, critical=True
        )
        self.assertEqual(build_id, 0)

    def testGetKilledChildBuilds(self) -> None:
        """Tests the redirect for GetKilledChildBuilds function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_read_from_bb=False)
        fake_result = [
            {"message_value": 1234},
            {"message_value": 2341},
            {"message_value": 3412},
        ]
        bs.cidb_conn = mock.MagicMock()
        self.PatchObject(
            bs.cidb_conn, "GetBuildMessages", return_value=fake_result
        )
        build_identifier = buildstore.BuildIdentifier(
            cidb_id=1, buildbucket_id=1234
        )
        # Test for buildbucket_ids.
        result = bs.GetKilledChildBuilds(build_identifier)
        bs.cidb_conn.GetBuildMessages.assert_called_once_with(
            1,
            message_type=buildstore.MESSAGE_TYPE_IGNORED_REASON,
            message_subtype=buildstore.MESSAGE_SUBTYPE_SELF_DESTRUCTION,
        )
        self.assertEqual(result, [1234, 2341, 3412])
        bs = BuildStore(_read_from_bb=True)
        bs.bb_client = mock.MagicMock()
        bs.GetKilledChildBuilds(build_identifier)
        bs.bb_client.GetKilledChildBuilds.assert_called_once_with(1234)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetKilledChildBuilds(build_identifier)

    def testInsertBuildMessage(self) -> None:
        """Tests the redirect for InsertBuildMessage function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_write_to_bb=True)
        bs.cidb_conn = mock.MagicMock()
        buildbucket_v2.UpdateSelfCommonBuildProperties = mock.MagicMock()
        self.PatchObject(bs.cidb_conn, "InsertBuildMessage")
        bs.InsertBuildMessage(
            1234, message_value=[8921795536486453568, 8921795536486453567]
        )
        bs.cidb_conn.InsertBuildMessage.assert_called_with(
            1234,
            message_type=buildstore.MESSAGE_TYPE_IGNORED_REASON,
            message_subtype=buildstore.MESSAGE_SUBTYPE_SELF_DESTRUCTION,
            message_value="8921795536486453567",
            board=None,
        )
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_once_with(
            killed_child_builds=[8921795536486453568, 8921795536486453567]
        )
        # Test error conditions.
        with self.assertRaises(AssertionError):
            bs.InsertBuildMessage(1234, message_value=8921795536486453568)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.InsertBuildMessage(1234, message_value=[8921795536486453568])

    def testGetBuildHistory(self) -> None:
        """Tests the redirect for GetBuildHistory function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        build_config = "some-paladin"
        num_results = 1234
        bs = BuildStore(_read_from_bb=False)
        bs.cidb_conn = mock.MagicMock()
        bs.GetBuildHistory(build_config, num_results, branch="master")
        bs.cidb_conn.GetBuildHistory.assert_called_once_with(
            build_config,
            num_results,
            starting_build_id=None,
            end_date=None,
            ignore_build_id=None,
            platform_version=None,
            branch="master",
            start_date=None,
        )
        bs = BuildStore(_read_from_bb=True)
        bs.bb_client = mock.MagicMock()
        bs.GetBuildHistory(build_config, num_results, branch="master")
        bs.bb_client.GetBuildHistory.assert_called_once_with(
            build_config,
            num_results,
            start_build_id=None,
            end_date=None,
            ignore_build_id=None,
            branch="master",
            start_date=None,
        )
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetBuildHistory(build_config, num_results)

    def testInsertBuildStage(self) -> None:
        """Tests the redirect for InsertBuildStage function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore()
        bs.cidb_conn = mock.MagicMock()
        self.PatchObject(
            bs.cidb_conn,
            "InsertBuildStage",
            return_value=constants.MOCK_STAGE_ID,
        )
        build_stage_id = bs.InsertBuildStage(
            constants.MOCK_BUILD_ID, "stage_name"
        )
        bs.cidb_conn.InsertBuildStage.assert_called_once_with(
            constants.MOCK_BUILD_ID,
            "stage_name",
            None,
            constants.BUILDER_STATUS_PLANNED,
        )
        self.assertEqual(build_stage_id, constants.MOCK_STAGE_ID)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.InsertBuildStage(constants.MOCK_BUILD_ID, "stage_name")

    def testGetSlaveStatuses(self) -> None:
        """Tests the redirect for GetSlaveStatuses function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_read_from_bb=False)
        fake_statuses = object()
        bs.cidb_conn = mock.MagicMock()
        self.PatchObject(
            bs.cidb_conn, "GetSlaveStatuses", return_value=fake_statuses
        )
        result = bs.GetSlaveStatuses(buildstore.BuildIdentifier(cidb_id=1234))
        bs.cidb_conn.GetSlaveStatuses.assert_called_once_with(1234, None)
        self.assertEqual(result, fake_statuses)
        bs = BuildStore(_read_from_bb=True)
        fake_statuses = object()
        bs.bb_client = mock.MagicMock()
        self.PatchObject(
            bs.bb_client, "GetChildStatuses", return_value=fake_statuses
        )
        result = bs.GetSlaveStatuses(
            buildstore.BuildIdentifier(cidb_id=1234, buildbucket_id=1234)
        )
        self.assertEqual(result, fake_statuses)
        bs.bb_client.GetChildStatuses.assert_called_once_with(1234)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetSlaveStatuses(1234)

    def testStartBuildStage(self) -> None:
        """Tests the redirect for StartBuildStage function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore()
        bs.cidb_conn = mock.MagicMock()
        stage_id = mock.Mock()
        self.PatchObject(bs.cidb_conn, "StartBuildStage", return_value=stage_id)
        ret = bs.StartBuildStage(constants.MOCK_BUILD_ID)
        bs.cidb_conn.StartBuildStage.assert_called_once_with(
            constants.MOCK_BUILD_ID
        )
        self.assertEqual(ret, stage_id)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.StartBuildStage(constants.MOCK_BUILD_ID)

    def testWaitBuildStage(self) -> None:
        """Tests the redirect for WaitBuildStage function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore()
        bs.cidb_conn = mock.MagicMock()
        stage_id = mock.Mock()
        self.PatchObject(bs.cidb_conn, "WaitBuildStage", return_value=stage_id)
        ret = bs.WaitBuildStage(constants.MOCK_BUILD_ID)
        bs.cidb_conn.WaitBuildStage.assert_called_once_with(
            constants.MOCK_BUILD_ID
        )
        self.assertEqual(ret, stage_id)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.WaitBuildStage(constants.MOCK_BUILD_ID)

    def testFinishBuildStage(self) -> None:
        """Tests the redirect for FinishBuildStage function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore()
        bs.cidb_conn = mock.MagicMock()
        stage_id = mock.Mock()
        self.PatchObject(
            bs.cidb_conn, "FinishBuildStage", return_value=stage_id
        )
        ret = bs.FinishBuildStage(constants.MOCK_BUILD_ID, "status")
        bs.cidb_conn.FinishBuildStage.assert_called_once_with(
            constants.MOCK_BUILD_ID, "status"
        )
        self.assertEqual(ret, stage_id)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.FinishBuildStage(constants.MOCK_BUILD_ID, "status")

    def testUpdateLuciNotifyProperties(self) -> None:
        """Tests the redirect for the UpdateLuciNotifyProperties function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_write_to_bb=True)
        buildbucket_v2.UpdateSelfCommonBuildProperties = mock.MagicMock()
        email_notify = mock.MagicMock()
        bs.UpdateLuciNotifyProperties(email_notify=email_notify)
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_once_with(
            email_notify=email_notify
        )
        init.return_value = False

    def testFinishBuild(self) -> None:
        """Tests the redirect for FinishBuild function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_write_to_bb=True, _write_to_cidb=True)
        buildbucket_v2.UpdateSelfCommonBuildProperties = mock.MagicMock()
        bs.cidb_conn = mock.MagicMock()
        status = mock.Mock()
        summary = mock.Mock()
        metadata_url = mock.Mock()
        strict = mock.Mock()
        self.PatchObject(bs.cidb_conn, "FinishBuild")
        bs.FinishBuild(
            constants.MOCK_BUILD_ID,
            status=status,
            summary=summary,
            metadata_url=metadata_url,
            strict=strict,
        )
        bs.cidb_conn.FinishBuild.assert_called_once_with(
            constants.MOCK_BUILD_ID,
            status=status,
            summary=summary,
            metadata_url=metadata_url,
            strict=strict,
        )
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_once_with(
            metadata_url=metadata_url
        )
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.FinishBuild(
                constants.MOCK_BUILD_ID,
                status=status,
                summary=summary,
                metadata_url=metadata_url,
                strict=strict,
            )

    def testFinishChildConfig(self) -> None:
        """Tests the redirect for FinishChildConfig function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore()
        bs.cidb_conn = mock.MagicMock()
        child_config = mock.Mock()
        status = mock.Mock()
        self.PatchObject(bs.cidb_conn, "FinishChildConfig")
        bs.FinishChildConfig(
            constants.MOCK_BUILD_ID, child_config, status=status
        )
        bs.cidb_conn.FinishChildConfig.assert_called_once_with(
            constants.MOCK_BUILD_ID, child_config, status=status
        )
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.FinishChildConfig(
                constants.MOCK_BUILD_ID, child_config, status=status
            )

    def testInsertBoardPerBuildWithoutMetadata(self) -> None:
        """Tests InsertBoardPerBuild function when metadata isn't available."""
        self.PatchObject(BuildStore, "InitializeClients", return_value=True)
        bs = BuildStore(_write_to_cidb=True, _write_to_bb=True)
        bs.cidb_conn = mock.MagicMock()
        buildbucket_v2.UpdateSelfCommonBuildProperties = mock.MagicMock()
        build_id = 1234
        board = "grunt"
        bs.InsertBoardPerBuild(build_id, board)
        bs.cidb_conn.InsertBoardPerBuild.assert_called_once_with(
            build_id, board
        )
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_once_with(
            board=board
        )

    def testInsertBoardPerBuildWithMetadata(self) -> None:
        """Tests the InsertBoardPerBuild function when metadata is available."""
        self.PatchObject(BuildStore, "InitializeClients", return_value=True)
        bs = BuildStore(_write_to_cidb=True, _write_to_bb=True)
        bs.cidb_conn = mock.MagicMock()
        buildbucket_v2.UpdateSelfCommonBuildProperties = mock.MagicMock()
        build_id = 1234
        board = "grunt"
        fake_metadata = {
            "main-firmware-version": "1.2.3.4",
            "ec-firmware-version": "2.3.4.5",
        }
        bs.InsertBoardPerBuild(build_id, board, fake_metadata)
        bs.cidb_conn.UpdateBoardPerBuildMetadata.assert_called_once_with(
            build_id, board, fake_metadata
        )
        buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_with(
            board=board,
            main_firmware_version=fake_metadata["main-firmware-version"],
            ec_firmware_version=fake_metadata["ec-firmware-version"],
        )

    def testInsertBoardPerBuildWithoutRequisiteClients(self) -> None:
        """Tests the redirect for InsertBoardPerBuild function."""
        self.PatchObject(BuildStore, "InitializeClients", return_value=False)
        build_id = 1234
        board = "grunt"
        bs = BuildStore(_write_to_cidb=True, _write_to_bb=True)
        with self.assertRaises(buildstore.BuildStoreException):
            bs.InsertBoardPerBuild(build_id, board)

    def testUpdateMetadata(self) -> None:
        """Tests the redirect for UpdateMetadata function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_write_to_cidb=True, _write_to_bb=False)
        bs.cidb_conn = mock.MagicMock()
        fake_metadata = {}
        self.PatchObject(bs.cidb_conn, "UpdateMetadata")
        bs.UpdateMetadata(constants.MOCK_BUILD_ID, fake_metadata)
        bs.cidb_conn.UpdateMetadata.assert_called_once_with(
            constants.MOCK_BUILD_ID, fake_metadata
        )
        bs = BuildStore(_write_to_cidb=False, _write_to_bb=True)
        self.PatchObject(buildbucket_v2, "UpdateBuildMetadata")
        bs.UpdateMetadata(constants.MOCK_BUILD_ID, fake_metadata)
        buildbucket_v2.UpdateBuildMetadata.assert_called_once_with(
            fake_metadata
        )
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.UpdateMetadata(constants.MOCK_BUILD_ID, fake_metadata)

    def testGetBuildsFailures(self) -> None:
        """Tests the redirect for GetBuildsFailures function."""
        # pylint: disable=protected-access
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_read_from_bb=False)
        bs.cidb_conn = mock.MagicMock()
        buildbucket_ids = [1234, 2341]
        # Test for CIDB redirect.
        bs.GetBuildsFailures(buildbucket_ids=buildbucket_ids)
        bs.cidb_conn.GetBuildsFailures.assert_called_once_with(buildbucket_ids)
        # Test for empty argument.
        self.assertEqual(bs.GetBuildsFailures([]), [])
        fake_return = [
            {
                "stage_name": "stage_1",
                "stage_status": "fail",
                "buildbucket_id": 1234,
                "build_config": "something-paladin",
                "build_status": "pass",
                "important": True,
            }
        ]
        bs = BuildStore(_read_from_bb=True)
        bs.bb_client = mock.MagicMock()
        self.PatchObject(
            bs.bb_client, "GetStageFailures", return_value=fake_return
        )
        fail = bs.GetBuildsFailures(buildbucket_ids=[1234])
        bs.bb_client.GetStageFailures.assert_called_with(1234)
        self.assertIsInstance(fail[0], failure_message_lib.StageFailure)
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetBuildsFailures(buildbucket_ids=buildbucket_ids)

    def testGetBuildsStages(self) -> None:
        """Tests the redirect for GetBuildsStages function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_read_from_bb=False)
        bs.cidb_conn = mock.MagicMock()
        buildbucket_ids = ["bucket 1", "bucket 2"]
        # Test for buildbucket_ids.
        bs.GetBuildsStages(buildbucket_ids=buildbucket_ids)
        bs.cidb_conn.GetBuildsStagesWithBuildbucketIds.assert_called_once_with(
            buildbucket_ids
        )
        bs = BuildStore(_read_from_bb=True)
        bs.bb_client = mock.MagicMock()
        buildbucket_ids = [1234]
        # Test for buildbucket_ids.
        bs.GetBuildsStages(buildbucket_ids=buildbucket_ids)
        bs.bb_client.GetBuildStages.assert_called_once_with(1234)
        # Test for empty argument.
        self.assertEqual(bs.GetBuildsStages([]), [])
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetBuildsStages(buildbucket_ids=buildbucket_ids)

    def testGetBuildStatuses(self) -> None:
        """Tests the redirect for GetBuildStatuses function."""
        init = self.PatchObject(
            BuildStore, "InitializeClients", return_value=True
        )
        bs = BuildStore(_read_from_bb=False)
        bs.cidb_conn = mock.MagicMock()
        build_ids = ["build 1", "build 2"]
        buildbucket_ids = [1234, 2341]
        # Test for build_ids.
        bs.GetBuildStatuses(build_ids=build_ids)
        bs.cidb_conn.GetBuildStatuses.assert_called_once_with(build_ids)
        # Test for buildbucket_ids.
        bs.GetBuildStatuses(buildbucket_ids)
        bs.cidb_conn.GetBuildStatusesWithBuildbucketIds.assert_called_once_with(
            buildbucket_ids
        )
        bs = BuildStore(_read_from_bb=True)
        bs.bb_client = mock.MagicMock()
        bs.GetBuildStatuses(buildbucket_ids)
        bs.bb_client.GetBuildStatus.assert_called_with(2341)
        # Test for error conditions.
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetBuildStatuses(
                buildbucket_ids=buildbucket_ids, build_ids=build_ids
            )
        self.assertEqual(bs.GetBuildStatuses(), [])
        init.return_value = False
        with self.assertRaises(buildstore.BuildStoreException):
            bs.GetBuildStatuses(build_ids=build_ids)
