210 lines
5.6 KiB
Python
210 lines
5.6 KiB
Python
"""Unit tests for log manager."""
|
|
|
|
import tempfile
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from src.server.utils.log_manager import LogManager, get_log_manager
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_log_env():
|
|
"""Create temporary log environment."""
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
yield tmpdir
|
|
|
|
|
|
def test_log_manager_initialization(temp_log_env):
|
|
"""Test log manager initialization."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
assert manager is not None
|
|
assert manager.log_dir.exists()
|
|
assert manager.archived_dir.exists()
|
|
|
|
|
|
def test_get_log_files(temp_log_env):
|
|
"""Test getting list of log files."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create test log files
|
|
(Path(temp_log_env) / "app.log").write_text("log content 1")
|
|
(Path(temp_log_env) / "error.log").write_text("log content 2")
|
|
(Path(temp_log_env) / "other.txt").write_text("not a log")
|
|
|
|
log_files = manager.get_log_files()
|
|
|
|
assert len(log_files) == 2
|
|
assert log_files[0].filename in ["app.log", "error.log"]
|
|
|
|
|
|
def test_rotate_log(temp_log_env):
|
|
"""Test log file rotation."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
log_file = Path(temp_log_env) / "app.log"
|
|
large_content = "x" * (11 * 1024 * 1024) # 11MB
|
|
log_file.write_text(large_content)
|
|
|
|
result = manager.rotate_log("app.log", max_size_bytes=10485760)
|
|
|
|
assert result is True
|
|
assert not log_file.exists() # Original file rotated
|
|
|
|
|
|
def test_rotate_log_not_found(temp_log_env):
|
|
"""Test rotation of non-existent log."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
result = manager.rotate_log("nonexistent.log")
|
|
|
|
assert result is False
|
|
|
|
|
|
def test_rotate_log_small_file(temp_log_env):
|
|
"""Test rotation of small log file."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
log_file = Path(temp_log_env) / "app.log"
|
|
log_file.write_text("small content")
|
|
|
|
result = manager.rotate_log("app.log", max_size_bytes=1048576)
|
|
|
|
assert result is False
|
|
assert log_file.exists()
|
|
|
|
|
|
def test_archive_old_logs(temp_log_env):
|
|
"""Test archiving old log files."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create old and new logs
|
|
old_log = Path(temp_log_env) / "old.log"
|
|
old_log.write_text("old log")
|
|
old_log.touch()
|
|
|
|
new_log = Path(temp_log_env) / "new.log"
|
|
new_log.write_text("new log")
|
|
|
|
archived = manager.archive_old_logs(days_old=30)
|
|
|
|
assert archived > 0
|
|
|
|
|
|
def test_search_logs(temp_log_env):
|
|
"""Test searching logs."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create test logs
|
|
(Path(temp_log_env) / "app.log").write_text(
|
|
"Error occurred\nWarning message\nError again"
|
|
)
|
|
(Path(temp_log_env) / "debug.log").write_text(
|
|
"Debug info\nError in debug"
|
|
)
|
|
|
|
results = manager.search_logs("Error", case_sensitive=False)
|
|
|
|
assert len(results) >= 1
|
|
assert any("Error" in line for lines in results.values()
|
|
for line in lines)
|
|
|
|
|
|
def test_search_logs_case_sensitive(temp_log_env):
|
|
"""Test case-sensitive log search."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
(Path(temp_log_env) / "app.log").write_text("ERROR\nerror\nError")
|
|
|
|
results = manager.search_logs("ERROR", case_sensitive=True)
|
|
|
|
assert "app.log" in results
|
|
# Should only find uppercase ERROR
|
|
assert len(results["app.log"]) == 1
|
|
|
|
|
|
def test_export_logs(temp_log_env):
|
|
"""Test exporting logs."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create test logs
|
|
(Path(temp_log_env) / "app.log").write_text("log content 1")
|
|
(Path(temp_log_env) / "error.log").write_text("log content 2")
|
|
|
|
output_file = Path(temp_log_env) / "export.tar.gz"
|
|
result = manager.export_logs(str(output_file), compress=True)
|
|
|
|
assert result is True
|
|
assert output_file.exists()
|
|
|
|
|
|
def test_export_logs_uncompressed(temp_log_env):
|
|
"""Test exporting logs without compression."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
(Path(temp_log_env) / "app.log").write_text("log content")
|
|
|
|
output_file = Path(temp_log_env) / "export.txt"
|
|
result = manager.export_logs(str(output_file), compress=False)
|
|
|
|
assert result is True
|
|
assert output_file.exists()
|
|
assert "log content" in output_file.read_text()
|
|
|
|
|
|
def test_get_log_stats(temp_log_env):
|
|
"""Test getting log statistics."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create test logs
|
|
(Path(temp_log_env) / "app.log").write_text("x" * 1000)
|
|
(Path(temp_log_env) / "error.log").write_text("y" * 2000)
|
|
|
|
stats = manager.get_log_stats()
|
|
|
|
assert stats["total_files"] == 2
|
|
assert stats["total_size_bytes"] >= 3000
|
|
|
|
|
|
def test_get_log_stats_empty(temp_log_env):
|
|
"""Test getting stats with no logs."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
stats = manager.get_log_stats()
|
|
|
|
assert stats["total_files"] == 0
|
|
assert stats["total_size_bytes"] == 0
|
|
|
|
|
|
def test_cleanup_logs(temp_log_env):
|
|
"""Test log cleanup."""
|
|
manager = LogManager(log_dir=temp_log_env)
|
|
|
|
# Create multiple logs
|
|
for i in range(10):
|
|
(Path(temp_log_env) / f"log_{i}.log").write_text("x" * 1000)
|
|
|
|
deleted = manager.cleanup_logs(max_total_size_mb=0.01, keep_files=2)
|
|
|
|
assert deleted > 0
|
|
|
|
|
|
def test_set_log_level():
|
|
"""Test setting log level."""
|
|
manager = LogManager()
|
|
|
|
result = manager.set_log_level("test_logger", "DEBUG")
|
|
|
|
assert result is True
|
|
|
|
|
|
def test_get_log_manager_singleton():
|
|
"""Test singleton log manager."""
|
|
manager1 = get_log_manager()
|
|
manager2 = get_log_manager()
|
|
|
|
assert manager1 is manager2
|
|
assert isinstance(manager1, LogManager)
|