# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for cbuildbot_alerts."""

import logging
import sys

from chromite.cbuildbot import cbuildbot_alerts
from chromite.lib import cros_test_lib


class CrosloggingTest(cros_test_lib.OutputTestCase):
    """Test logging works as expected."""

    def setUp(self):
        self.logger = logging.getLogger()
        sh = logging.StreamHandler(sys.stdout)
        self.logger.addHandler(sh)
        # pylint: disable=protected-access
        cbuildbot_alerts._buildbot_markers_enabled = False

    def AssertLogContainsMsg(self, msg, functor, *args, **kwargs):
        """Asserts that calling functor logs a line that contains msg.

        Args:
          msg: The message to look for.
          functor: A function taking no arguments to test.
          *args, **kwargs: passthrough arguments to AssertLogContainsMsg.
        """
        with self.OutputCapturer():
            functor()
        self.AssertOutputContainsLine(msg, *args, **kwargs)

    def testNotice(self):
        """Test logging.notice works and is between INFO and WARNING."""
        msg = "notice message"
        self.logger.setLevel(logging.INFO)
        self.AssertLogContainsMsg(msg, lambda: logging.notice(msg))
        self.logger.setLevel(logging.WARNING)
        self.AssertLogContainsMsg(msg, lambda: logging.notice(msg), invert=True)

    def testPrintBuildbotFunctionsNoMarker(self):
        """PrintBuildbot* without markers should not be recognized by buildbot."""
        self.AssertLogContainsMsg(
            "@@@STEP_LINK@",
            lambda: cbuildbot_alerts.PrintBuildbotLink("name", "url"),
            check_stderr=True,
            invert=True,
        )
        self.AssertLogContainsMsg(
            "@@@@STEP_TEXT@",
            lambda: cbuildbot_alerts.PrintBuildbotStepText("text"),
            check_stderr=True,
            invert=True,
        )
        self.AssertLogContainsMsg(
            "@@@STEP_WARNINGS@@@",
            cbuildbot_alerts.PrintBuildbotStepWarnings,
            check_stderr=True,
            invert=True,
        )
        self.AssertLogContainsMsg(
            "@@@STEP_FAILURE@@@",
            cbuildbot_alerts.PrintBuildbotStepFailure,
            check_stderr=True,
            invert=True,
        )
        self.AssertLogContainsMsg(
            "@@@BUILD_STEP",
            lambda: cbuildbot_alerts.PrintBuildbotStepName("name"),
            check_stderr=True,
            invert=True,
        )
        self.AssertLogContainsMsg(
            "@@@SET_BUILD_PROPERTY",
            lambda: cbuildbot_alerts.PrintKitchenSetBuildProperty(
                "name", {"a": "value"}
            ),
            check_stderr=True,
            invert=True,
        )

    def testPrintBuildbotFunctionsWithMarker(self):
        """PrintBuildbot* with markers should be recognized by buildbot."""
        cbuildbot_alerts.EnableBuildbotMarkers()
        self.AssertLogContainsMsg(
            "@@@STEP_LINK@name@url@@@",
            lambda: cbuildbot_alerts.PrintBuildbotLink("name", "url"),
            check_stderr=True,
        )
        self.AssertLogContainsMsg(
            "@@@STEP_TEXT@text@@@",
            lambda: cbuildbot_alerts.PrintBuildbotStepText("text"),
            check_stderr=True,
        )
        self.AssertLogContainsMsg(
            "@@@STEP_WARNINGS@@@",
            cbuildbot_alerts.PrintBuildbotStepWarnings,
            check_stderr=True,
        )
        self.AssertLogContainsMsg(
            "@@@STEP_FAILURE@@@",
            cbuildbot_alerts.PrintBuildbotStepFailure,
            check_stderr=True,
        )
        self.AssertLogContainsMsg(
            "@@@BUILD_STEP@name@@@",
            lambda: cbuildbot_alerts.PrintBuildbotStepName("name"),
            check_stderr=True,
        )
        self.AssertLogContainsMsg(
            '@@@SET_BUILD_PROPERTY@name@"value"@@@',
            lambda: cbuildbot_alerts.PrintKitchenSetBuildProperty(
                "name", "value"
            ),
            check_stderr=True,
        )
