#!/usr/bin/env python3 """ Test script for enhanced logging features """ import time import json import os import sys import logging from pathlib import Path # Add the apt-ostree module to path sys.path.insert(0, str(Path(__file__).parent / "src/apt-ostree.py/python")) from utils.logging import AptOstreeLogger, LogValidator from utils.config import ConfigManager def test_enhanced_logging(): """Test enhanced logging features""" print("=== Testing Enhanced Logging Features ===\n") # Create test configuration config = { 'daemon': { 'logging': { 'level': 'DEBUG', 'format': 'json', 'file': '/tmp/apt-ostree-test.log', 'max_size': '1MB', # Small size for testing rotation 'max_files': 3, 'rotation_strategy': 'size', 'compression': True, 'correlation_id': True, 'performance_monitoring': True, 'include_hostname': True, 'include_version': True } } } # Initialize logger logger_manager = AptOstreeLogger(config) logger = logger_manager.get_logger('test') print("1. Testing Basic Logging") logger.info("Basic info message") logger.warning("Warning message") logger.error("Error message") logger.debug("Debug message") print("2. Testing Structured Logging with Extra Fields") logger.log_with_fields(logging.INFO, "Package installation started", package="firefox", version="115.0", user="root") print("3. Testing Performance Logging") start_time = time.time() time.sleep(0.1) # Simulate work duration = time.time() - start_time logger.log_performance("package_install", duration, package="firefox") print("4. Testing Transaction Logging") transaction_id = "tx-12345" logger.log_transaction(transaction_id, "started", operation="install") logger.log_transaction(transaction_id, "completed", operation="install", success=True) print("5. Testing Log Rotation (generating large log)") print(" Generating 2MB of log data to trigger rotation...") for i in range(1000): logger.info(f"Log entry {i}: " + "x" * 100) # Large log entries print("6. Testing Log Statistics") stats = logger_manager.get_log_stats() print(f" Current log size: {stats['current_log_size']} bytes") print(f" Total log files: {stats['total_log_files']}") print(f" Oldest log age: {stats['oldest_log_age']:.1f} seconds") print(f" Newest log age: {stats['newest_log_age']:.1f} seconds") print("7. Testing Log Validation") validator = LogValidator() # Valid log entry valid_entry = { 'timestamp': '2024-01-15T10:30:00.000000', 'level': 'INFO', 'logger': 'apt-ostree.test', 'message': 'Test message' } print(f" Valid log entry: {validator.validate_log_entry(valid_entry)}") # Invalid log entry invalid_entry = { 'timestamp': 'invalid-timestamp', 'level': 'INVALID', 'message': 'Test message' } print(f" Invalid log entry: {validator.validate_log_entry(invalid_entry)}") print("8. Testing Log File Inspection") log_file = '/tmp/apt-ostree-test.log' if os.path.exists(log_file): print(f" Log file exists: {log_file}") print(f" File size: {os.path.getsize(log_file)} bytes") # Read and parse a few log entries with open(log_file, 'r') as f: lines = f.readlines() if lines: print(f" Total log lines: {len(lines)}") print(" Sample log entry:") try: sample = json.loads(lines[0]) print(f" Timestamp: {sample.get('timestamp')}") print(f" Level: {sample.get('level')}") print(f" Message: {sample.get('message')}") print(f" Correlation ID: {sample.get('correlation_id')}") print(f" Hostname: {sample.get('hostname')}") print(f" Version: {sample.get('version')}") except json.JSONDecodeError: print(" (Not valid JSON)") print("9. Testing Log Directory Contents") log_dir = '/tmp' log_files = [f for f in os.listdir(log_dir) if f.startswith('apt-ostree-test.log')] print(f" Log files found: {len(log_files)}") for log_file in sorted(log_files): filepath = os.path.join(log_dir, log_file) size = os.path.getsize(filepath) mtime = os.path.getmtime(filepath) print(f" {log_file}: {size} bytes, modified {time.ctime(mtime)}") print("\n=== Enhanced Logging Test Complete ===") print("Check the log files in /tmp/apt-ostree-test.log* for results") def test_time_based_rotation(): """Test time-based log rotation""" print("\n=== Testing Time-Based Log Rotation ===\n") config = { 'daemon': { 'logging': { 'level': 'INFO', 'format': 'json', 'file': '/tmp/apt-ostree-time-test.log', 'rotation_strategy': 'time', 'rotation_interval': 1, 'rotation_unit': 'M', # Minutes for testing 'max_files': 3, 'compression': True } } } logger_manager = AptOstreeLogger(config) logger = logger_manager.get_logger('time-test') print("Generating logs for time-based rotation test...") for i in range(10): logger.info(f"Time-based test log entry {i}") time.sleep(0.1) print("Time-based rotation test complete") def test_hybrid_rotation(): """Test hybrid log rotation""" print("\n=== Testing Hybrid Log Rotation ===\n") config = { 'daemon': { 'logging': { 'level': 'INFO', 'format': 'json', 'file': '/tmp/apt-ostree-hybrid-test.log', 'rotation_strategy': 'hybrid', 'max_size': '500KB', 'max_files': 5, 'compression': True } } } logger_manager = AptOstreeLogger(config) logger = logger_manager.get_logger('hybrid-test') print("Generating logs for hybrid rotation test...") for i in range(500): logger.info(f"Hybrid test log entry {i}: " + "x" * 50) print("Hybrid rotation test complete") if __name__ == "__main__": # Clean up any existing test log files for pattern in ['apt-ostree-test.log*', 'apt-ostree-time-test.log*', 'apt-ostree-hybrid-test.log*']: for filepath in Path('/tmp').glob(pattern): try: filepath.unlink() print(f"Cleaned up: {filepath}") except Exception as e: print(f"Failed to clean up {filepath}: {e}") # Run tests test_enhanced_logging() test_time_based_rotation() test_hybrid_rotation() print("\n=== All Tests Complete ===") print("Check the log files in /tmp/ for results:") print(" - apt-ostree-test.log* (size-based rotation)") print(" - apt-ostree-time-test.log* (time-based rotation)") print(" - apt-ostree-hybrid-test.log* (hybrid rotation)")