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

"""Test the telemetry config."""

import configparser

from chromite.lib import cros_test_lib
from chromite.lib.telemetry import config


class ConfigTest(cros_test_lib.TempDirTestCase):
    """Test Config class."""

    def test_create_missing_config_file(self) -> None:
        """Test Config to create missing config file."""

        path = self.tempdir / "telemetry.cfg"
        cfg = config.Config(path)

        self.assertFileContents(
            path, "[root]\nnotice_countdown = 10\n\n[trace]\n\n"
        )
        self.assertFalse(cfg.trace_config.enabled)
        self.assertFalse(cfg.trace_config.has_enabled())
        self.assertEqual("AUTO", cfg.trace_config.enabled_reason)
        self.assertEqual(10, cfg.root_config.notice_countdown)

    def test_load_config_file(self) -> None:
        """Test Config to load config file."""

        path = "telemetry.cfg"
        self.WriteTempFile(
            path, "[root]\nnotice_countdown = 3\n\n[trace]\nenabled = True\n\n"
        )

        path = self.tempdir / path
        cfg = config.Config(path)

        self.assertTrue(cfg.trace_config.enabled)
        self.assertEqual(3, cfg.root_config.notice_countdown)

    def test_flush_config_file_with_updates(self) -> None:
        """Test Config to write the config changes to file."""

        path = self.tempdir / "telemetry.cfg"
        self.WriteTempFile(
            path, "[root]\nnotice_countdown = 7\n\n[trace]\nenabled = True\n\n"
        )

        cfg = config.Config(path)

        cfg.trace_config.update(enabled=False, reason="AUTO")
        cfg.root_config.update(notice_countdown=9)
        cfg.flush()

        self.assertFileContents(
            path,
            "\n".join(
                [
                    "[root]",
                    "notice_countdown = 9",
                    "",
                    "[trace]",
                    "enabled = False",
                    "enabled_reason = AUTO",
                    "",
                    "",
                ]
            ),
        )


def test_default_trace_config() -> None:
    """Test TraceConfig to load default values."""
    cfg = configparser.ConfigParser()
    cfg[config.TRACE_SECTION_KEY] = {}
    trace_config = config.TraceConfig(cfg)

    assert not trace_config.has_enabled()


def test_trace_config_update() -> None:
    """Test TraceConfig to update values."""
    cfg = configparser.ConfigParser()
    cfg[config.TRACE_SECTION_KEY] = {config.ENABLED_KEY: True}
    trace_config = config.TraceConfig(cfg)
    trace_config.update(enabled=False, reason="AUTO")
    assert not trace_config.enabled
    assert trace_config.enabled_reason == "AUTO"


def test_trace_config() -> None:
    """Test TraceConfig to instantiate from passed dict."""
    cfg = configparser.ConfigParser()
    cfg[config.TRACE_SECTION_KEY] = {config.ENABLED_KEY: True}
    trace_config = config.TraceConfig(cfg)

    assert trace_config.enabled
    assert trace_config.has_enabled()
    assert trace_config.enabled_reason == "AUTO"


def test_default_root_config() -> None:
    """Test RootConfig to load default values."""
    cfg = configparser.ConfigParser()
    cfg[config.ROOT_SECTION_KEY] = {}
    root_config = config.RootConfig(cfg)

    assert root_config.notice_countdown == 10


def test_root_config_update() -> None:
    """Test RootConfig to update values."""
    cfg = configparser.ConfigParser()
    cfg[config.ROOT_SECTION_KEY] = {config.NOTICE_COUNTDOWN_KEY: True}
    root_config = config.RootConfig(cfg)
    root_config.update(notice_countdown=8)
    assert root_config.notice_countdown == 8


def test_root_config() -> None:
    """Test RootConfig to instantiate from passed dict."""
    cfg = configparser.ConfigParser()
    cfg[config.ROOT_SECTION_KEY] = {config.NOTICE_COUNTDOWN_KEY: 9}
    root_config = config.RootConfig(cfg)

    assert root_config.notice_countdown == 9
