# Copyright (c) Huawei Technologies Co., Ltd. 2026-2026. All rights reserved.
# MindIE is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#         `http://license.coscl.org.cn/MulanPSL2`
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.

import unittest
from unittest.mock import Mock, patch

from olc.collector.collector_manager import OlcCollectorManager
from olc.collector.collector import AbsCollector


from olc.collector.collector import Measurable


class MockMeasurable(Measurable):
    @classmethod
    def get_properties(cls) -> list:
        return ["value", "count"]


class MockCollector(AbsCollector):
    def __init__(self):
        super().__init__(measurable_type=MockMeasurable)

    def collect(self) -> list:
        return []

    def get_name(self) -> str:
        return "test-collector"

    def get_storage(self) -> list:
        return []


class TestOlcCollectorManager(unittest.TestCase):
    def setUp(self):
        # 重置单例
        OlcCollectorManager._instance = None
        self.manager = OlcCollectorManager.get_instance()

    def test_get_instance(self):
        instance1 = OlcCollectorManager.get_instance()
        instance2 = OlcCollectorManager.get_instance()
        self.assertIs(instance1, instance2)

    def test_add_collector(self):
        self.manager.add_collector("test", MockCollector)
        self.assertIn("test", self.manager._collector_map)

    def test_get_collector(self):
        # 测试获取不存在的收集器
        collector = self.manager.get_collector("non-existent")
        self.assertIsNone(collector)

    def test_init(self):
        with patch('olc.collector.collector_manager.OlcConfigManager') as mock_config:
            mock_instance = Mock()
            mock_sdk_config = Mock()
            mock_sdk_config.collector_active = "test-collector"
            mock_instance.get_sdk_config.return_value = mock_sdk_config
            mock_config.get_instance.return_value = mock_instance

            # 添加收集器
            self.manager.add_collector("test-collector", MockCollector)

            # 初始化
            self.manager.init()

            # 验证收集器被激活
            collector = self.manager.get_collector("test-collector")
            self.assertIsInstance(collector, MockCollector)

    def test_valid(self):
        with patch('olc.collector.collector_manager.OlcConfigManager') as mock_config:
            mock_instance = Mock()
            mock_sdk_config = Mock()
            mock_sdk_config.collector_active = "test-collector"
            mock_instance.get_sdk_config.return_value = mock_sdk_config
            mock_config.get_instance.return_value = mock_instance

            # 添加收集器
            self.manager.add_collector("test-collector", MockCollector)

            # 初始化
            self.manager.init()

            # 测试有效参数
            self.assertTrue(self.manager.valid("test-collector.value"))

            # 测试无效参数格式
            self.assertFalse(self.manager.valid("invalid"))

            # 测试不存在的收集器
            self.assertFalse(self.manager.valid("non-existent.value"))

            # 测试不存在的属性
            self.assertFalse(self.manager.valid("test-collector.invalid"))

            # 测试空参数
            self.assertFalse(self.manager.valid(""))


if __name__ == '__main__':
    unittest.main()