# 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.

"""Module containing unit tests for generic_builders."""

from unittest import mock

from chromite.cbuildbot.builders import generic_builders
from chromite.lib import cidb
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import fake_cidb
from chromite.lib import parallel
from chromite.lib import results_lib


# pylint: disable=protected-access
class BuilderTest(cros_test_lib.MockTestCase):
    """Test cases for Builder."""

    def test_RunParallelStages(self) -> None:
        """test _RunParallelStages."""
        fake_db = fake_cidb.FakeCIDBConnection()
        build_id = fake_db.InsertBuild(
            "test_build", 1, "test_build", "hostname"
        )
        cidb.CIDBConnectionFactory.SetupMockCidb(mock_cidb=fake_db)
        parallel_ex = parallel.UnexpectedException("run parallel exception")
        self.PatchObject(parallel, "RunParallelSteps", side_effect=parallel_ex)

        results_lib.Results.Record("stage_0", results_lib.Results.SKIPPED)
        fake_db.InsertBuildStage(
            build_id, "stage_0", status=constants.BUILDER_STATUS_SKIPPED
        )
        results_lib.Results.Record("stage_1", results_lib.Results.FORGIVEN)
        fake_db.InsertBuildStage(
            build_id, "stage_1", status=constants.BUILDER_STATUS_FORGIVEN
        )
        results_lib.Results.Record("stage_2", results_lib.Results.SUCCESS)
        fake_db.InsertBuildStage(
            build_id, "stage_2", status=constants.BUILDER_STATUS_PASSED
        )
        # build stage status for stage_3 is in completed status
        fake_db.InsertBuildStage(
            build_id, "stage_3", status=constants.BUILDER_STATUS_INFLIGHT
        )
        # build stage status for stage_4 is failed but no entry in failureTable
        fake_db.InsertBuildStage(
            build_id, "stage_4", status=constants.BUILDER_STATUS_FAILED
        )
        # no build stage status found for stage_5

        stage_objs = []
        for i in range(0, 6):
            stage_mock = mock.Mock()
            stage_mock.GetStageNames.return_value = ["stage_%s" % i]
            stage_mock.GetBuildStageIDs.return_value = [i]
            stage_mock.StageNamePrefix.return_value = "stage_prefix"
            stage_objs.append(stage_mock)

        self.assertRaises(
            parallel.UnexpectedException,
            generic_builders.Builder._RunParallelStages,
            stage_objs,
        )
        self.assertTrue(results_lib.Results.StageHasResults("stage_3"))
        self.assertTrue(results_lib.Results.StageHasResults("stage_4"))
        for r in results_lib.Results.Get():
            if r.name in ("stage_3", "stage_4"):
                self.assertEqual(r.prefix, "stage_prefix")
