295 lines
10 KiB
Python
295 lines
10 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Integration Tests for Components
|
|
"""
|
|
|
|
import unittest
|
|
import json
|
|
import tempfile
|
|
import os
|
|
import shutil
|
|
import time
|
|
from unittest.mock import Mock, patch, MagicMock
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add api directory to path
|
|
api_dir = Path(__file__).parent.parent / 'api'
|
|
sys.path.insert(0, str(api_dir))
|
|
|
|
from base_service_manager import BaseServiceManager
|
|
from config_manager import ConfigManager
|
|
from service_bus import ServiceBus, EventType
|
|
from log_manager import LogManager
|
|
from network_manager import NetworkManager
|
|
|
|
class TestIntegration(unittest.TestCase):
|
|
"""Test integration between components"""
|
|
|
|
def setUp(self):
|
|
self.temp_dir = tempfile.mkdtemp()
|
|
self.data_dir = os.path.join(self.temp_dir, 'data')
|
|
self.config_dir = os.path.join(self.temp_dir, 'config')
|
|
self.log_dir = os.path.join(self.temp_dir, 'logs')
|
|
|
|
os.makedirs(self.data_dir, exist_ok=True)
|
|
os.makedirs(self.config_dir, exist_ok=True)
|
|
os.makedirs(self.log_dir, exist_ok=True)
|
|
|
|
# Initialize components
|
|
self.config_manager = ConfigManager(self.config_dir, self.data_dir)
|
|
self.service_bus = ServiceBus()
|
|
self.log_manager = LogManager(log_dir=self.log_dir)
|
|
|
|
# Create a test service manager
|
|
class TestServiceManager(BaseServiceManager):
|
|
def get_status(self):
|
|
return {'running': True, 'status': 'online'}
|
|
|
|
def test_connectivity(self):
|
|
return {'success': True, 'message': 'Connected'}
|
|
|
|
self.test_service = TestServiceManager('test_service', self.data_dir, self.config_dir)
|
|
|
|
def tearDown(self):
|
|
self.log_manager.stop()
|
|
self.service_bus.stop()
|
|
shutil.rmtree(self.temp_dir)
|
|
|
|
def test_service_bus_with_config_manager(self):
|
|
"""Test service bus integration with config manager"""
|
|
# Register config manager with service bus
|
|
self.service_bus.register_service('config_manager', self.config_manager)
|
|
|
|
# Test calling config manager through service bus
|
|
test_config = {
|
|
'dns_port': 53,
|
|
'dhcp_range': '10.0.0.100-10.0.0.200',
|
|
'ntp_servers': ['pool.ntp.org']
|
|
}
|
|
|
|
# Update config through service bus
|
|
result = self.service_bus.call_service(
|
|
'config_manager',
|
|
'update_service_config',
|
|
service='network',
|
|
config=test_config
|
|
)
|
|
self.assertTrue(result)
|
|
|
|
# Get config through service bus
|
|
config = self.service_bus.call_service(
|
|
'config_manager',
|
|
'get_service_config',
|
|
service='network'
|
|
)
|
|
self.assertEqual(config['dns_port'], 53)
|
|
|
|
def test_service_bus_with_log_manager(self):
|
|
"""Test service bus integration with log manager"""
|
|
# Register log manager with service bus
|
|
self.service_bus.register_service('log_manager', self.log_manager)
|
|
|
|
# Add service logger through service bus
|
|
config = {'level': 'INFO', 'formatter': 'json'}
|
|
result = self.service_bus.call_service(
|
|
'log_manager',
|
|
'add_service_logger',
|
|
service='test_service',
|
|
config=config
|
|
)
|
|
|
|
# Get logs through service bus
|
|
logs = self.service_bus.call_service(
|
|
'log_manager',
|
|
'get_service_logs',
|
|
service='test_service'
|
|
)
|
|
self.assertIsInstance(logs, list)
|
|
|
|
def test_event_driven_config_updates(self):
|
|
"""Test event-driven configuration updates"""
|
|
config_updates = []
|
|
|
|
def config_change_handler(event):
|
|
config_updates.append(event.data)
|
|
|
|
# Subscribe to config change events
|
|
self.service_bus.subscribe_to_event(EventType.CONFIG_CHANGED, config_change_handler)
|
|
|
|
# Update config with valid configuration
|
|
test_config = {
|
|
'dns_port': 5353,
|
|
'dhcp_range': '10.0.0.100-10.0.0.200',
|
|
'ntp_servers': ['pool.ntp.org']
|
|
}
|
|
self.config_manager.update_service_config('network', test_config)
|
|
|
|
# Publish config change event
|
|
self.service_bus.publish_event(
|
|
EventType.CONFIG_CHANGED,
|
|
'config_manager',
|
|
{'service': 'network', 'config': test_config}
|
|
)
|
|
|
|
# Give time for event processing
|
|
time.sleep(0.1)
|
|
|
|
# Check if event was received
|
|
self.assertIsInstance(config_updates, list)
|
|
# Note: Event processing might be async, so we can't guarantee immediate reception
|
|
|
|
def test_service_lifecycle_with_logging(self):
|
|
"""Test service lifecycle with integrated logging"""
|
|
# Add service logger
|
|
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
|
|
|
|
# Register service with bus
|
|
self.service_bus.register_service('test_service', self.test_service)
|
|
|
|
# Start service bus
|
|
self.service_bus.start()
|
|
|
|
# Test service operations
|
|
status = self.service_bus.call_service('test_service', 'get_status')
|
|
self.assertEqual(status['running'], True)
|
|
|
|
# Check if logs were generated
|
|
logs = self.log_manager.get_service_logs('test_service')
|
|
self.assertIsInstance(logs, list)
|
|
|
|
# Stop service bus
|
|
self.service_bus.stop()
|
|
|
|
def test_network_manager_inheritance(self):
|
|
"""Test NetworkManager inheritance from BaseServiceManager"""
|
|
network_manager = NetworkManager(self.data_dir, self.config_dir)
|
|
|
|
# Test inherited methods
|
|
status = network_manager.get_status()
|
|
self.assertIn('running', status)
|
|
self.assertIn('status', status)
|
|
|
|
connectivity = network_manager.test_connectivity()
|
|
self.assertIn('success', connectivity)
|
|
|
|
# Test network-specific methods
|
|
self.assertTrue(hasattr(network_manager, 'get_dns_status'))
|
|
|
|
def test_comprehensive_workflow(self):
|
|
"""Test comprehensive workflow with all components"""
|
|
# Start all components
|
|
self.service_bus.start()
|
|
|
|
# Register all services
|
|
self.service_bus.register_service('config_manager', self.config_manager)
|
|
self.service_bus.register_service('log_manager', self.log_manager)
|
|
self.service_bus.register_service('test_service', self.test_service)
|
|
|
|
# Add logging for all services
|
|
self.log_manager.add_service_logger('config_manager', {'level': 'INFO'})
|
|
self.log_manager.add_service_logger('log_manager', {'level': 'INFO'})
|
|
self.log_manager.add_service_logger('test_service', {'level': 'INFO'})
|
|
|
|
# Perform workflow
|
|
# 1. Update configuration
|
|
test_config = {
|
|
'dns_port': 53,
|
|
'dhcp_range': '10.0.0.100-10.0.0.200',
|
|
'ntp_servers': ['pool.ntp.org']
|
|
}
|
|
|
|
success = self.service_bus.call_service(
|
|
'config_manager',
|
|
'update_service_config',
|
|
service='network',
|
|
config=test_config
|
|
)
|
|
self.assertTrue(success)
|
|
|
|
# 2. Check service status
|
|
status = self.service_bus.call_service('test_service', 'get_status')
|
|
self.assertEqual(status['running'], True)
|
|
|
|
# 3. Get logs
|
|
logs = self.service_bus.call_service(
|
|
'log_manager',
|
|
'get_service_logs',
|
|
service='test_service'
|
|
)
|
|
self.assertIsInstance(logs, list)
|
|
|
|
# 4. Get configuration
|
|
config = self.service_bus.call_service(
|
|
'config_manager',
|
|
'get_service_config',
|
|
service='network'
|
|
)
|
|
self.assertEqual(config['dns_port'], 53)
|
|
|
|
# Stop all components
|
|
self.service_bus.stop()
|
|
|
|
def test_error_propagation(self):
|
|
"""Test error propagation through components"""
|
|
# Register services
|
|
self.service_bus.register_service('config_manager', self.config_manager)
|
|
self.service_bus.register_service('log_manager', self.log_manager)
|
|
|
|
# Add logging
|
|
self.log_manager.add_service_logger('config_manager', {'level': 'ERROR'})
|
|
|
|
# Test error handling
|
|
with self.assertRaises(ValueError):
|
|
self.service_bus.call_service(
|
|
'config_manager',
|
|
'get_service_config',
|
|
service='nonexistent_service'
|
|
)
|
|
|
|
# Check if error was logged
|
|
logs = self.log_manager.get_service_logs('config_manager', level='ERROR')
|
|
self.assertIsInstance(logs, list)
|
|
|
|
def test_component_initialization_order(self):
|
|
"""Test proper component initialization order"""
|
|
# Test that components can be initialized in any order
|
|
components = []
|
|
|
|
# Initialize in different orders
|
|
components.append(ConfigManager(self.config_dir, self.data_dir))
|
|
components.append(ServiceBus())
|
|
components.append(LogManager(log_dir=self.log_dir))
|
|
|
|
# Verify all components are properly initialized
|
|
for component in components:
|
|
self.assertIsNotNone(component)
|
|
|
|
# Clean up
|
|
for component in components:
|
|
if hasattr(component, 'stop'):
|
|
component.stop()
|
|
|
|
def test_memory_cleanup(self):
|
|
"""Test proper memory cleanup"""
|
|
# Create components
|
|
config_manager = ConfigManager(self.config_dir, self.data_dir)
|
|
service_bus = ServiceBus()
|
|
log_manager = LogManager(log_dir=self.log_dir)
|
|
|
|
# Register services
|
|
service_bus.register_service('config_manager', config_manager)
|
|
service_bus.register_service('log_manager', log_manager)
|
|
|
|
# Start services
|
|
service_bus.start()
|
|
|
|
# Stop services
|
|
service_bus.stop()
|
|
log_manager.stop()
|
|
|
|
# Verify cleanup (no exceptions should be raised)
|
|
self.assertTrue(True)
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main() |