import os
import tempfile
import unittest
from unittest.mock import Mock
from olc.config.properties_loader import PropertiesLoader, PropertiesManager
class TestPropertiesLoader(unittest.TestCase):
def test_load_properties_file(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.sdk.domain=test.example.com\n')
f.write('olc.sdk.switch=true\n')
f.write('olc.redis.mode=cluster\n')
f.write('olc.redis.timeout=3000\n')
temp_file = f.name
try:
props = PropertiesLoader.load(temp_file)
self.assertEqual(props['olc.sdk.domain'], 'test.example.com')
self.assertEqual(props['olc.sdk.switch'], 'true')
self.assertEqual(props['olc.redis.mode'], 'cluster')
self.assertEqual(props['olc.redis.timeout'], '3000')
finally:
os.unlink(temp_file)
def test_load_nonexistent_file(self):
props = PropertiesLoader.load('nonexistent.properties')
self.assertEqual(props, {})
def test_load_properties_with_comments_and_empty_lines(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('# 这是注释\n')
f.write('\n')
f.write('olc.sdk.domain=test.example.com\n')
f.write('\n')
f.write('# 另一个注释\n')
f.write('olc.sdk.switch=true\n')
temp_file = f.name
try:
props = PropertiesLoader.load(temp_file)
self.assertEqual(props['olc.sdk.domain'], 'test.example.com')
self.assertEqual(props['olc.sdk.switch'], 'true')
self.assertEqual(len(props), 2)
finally:
os.unlink(temp_file)
class TestConfigManager(unittest.TestCase):
def test_config_loading(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.sdk.domain=test.example.com\n')
f.write('olc.sdk.switch=true\n')
f.write('olc.redis.mode=cluster\n')
f.write('olc.redis.timeout=3000\n')
temp_file = f.name
try:
config_manager = PropertiesManager(temp_file)
config = config_manager.get()
self.assertEqual(config.sdk_config.domain, 'test.example.com')
self.assertEqual(config.sdk_config.switch, True)
self.assertEqual(config.redis_config.mode, 'cluster')
self.assertEqual(config.redis_config.timeout, 3000)
finally:
os.unlink(temp_file)
def test_default_config(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
temp_file = f.name
try:
config_manager = PropertiesManager(temp_file)
config = config_manager.get()
self.assertEqual(config.sdk_config.domain, '')
self.assertEqual(config.sdk_config.switch, True)
self.assertEqual(config.sdk_config.dynamic_switch, False)
self.assertEqual(config.sdk_config.config_stub, 'jsonfile')
self.assertEqual(config.sdk_config.policy_update_period, 6)
self.assertEqual(config.redis_config.mode, 'alone')
self.assertEqual(config.redis_config.node_list, '')
self.assertIsNone(config.redis_config.password)
self.assertEqual(config.redis_config.timeout, 2000)
self.assertEqual(config.redis_config.max_connections, 64)
self.assertEqual(config.redis_config.service_name, '')
finally:
os.unlink(temp_file)
def test_decryption(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.redis.password=ENC(encrypted_password)\n')
temp_file = f.name
try:
mock_encryptor = Mock()
mock_encryptor.decrypt.return_value = 'decrypted_password'
config_manager = PropertiesManager(temp_file, encryptor=mock_encryptor)
config = config_manager.get()
finally:
os.unlink(temp_file)
def test_hot_reload(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.sdk.domain=initial.example.com\n')
temp_file = f.name
try:
config_manager = PropertiesManager(temp_file, interval=1)
config_manager._start_watcher()
initial_config = config_manager.get()
self.assertEqual(initial_config.sdk_config.domain, 'initial.example.com')
with open(temp_file, 'w') as f:
f.write('olc.sdk.domain=updated.example.com\n')
import time
time.sleep(2)
updated_config = config_manager.get()
finally:
os.unlink(temp_file)
def test_callback(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.sdk.domain=initial.example.com\n')
temp_file = f.name
try:
callback_mock = Mock()
config_manager = PropertiesManager(temp_file, on_change=callback_mock)
config_manager._load_config()
finally:
os.unlink(temp_file)
def test_exception_handling(self):
with tempfile.NamedTemporaryFile(mode='w', suffix='.properties', delete=False) as f:
f.write('olc.sdk.switch=not_a_boolean\n')
temp_file = f.name
try:
config_manager = PropertiesManager(temp_file)
config = config_manager.get()
self.assertEqual(config.sdk_config.switch, False)
finally:
os.unlink(temp_file)
if __name__ == '__main__':
print("Running tests...")
unittest.main(verbosity=2)