#!/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()