use std::time::Duration;
use tempfile::tempdir;
use tokio::fs;
use tokio::test;
use tokio::time::sleep;
use crate::logger::{cleanup_old_log_files, Logger};
#[test]
async fn test_logger_no_file() {
let logger = Logger::new(None, "10MB".to_string(), 0).await;
logger.log("Test message with no file").await;
}
#[test]
async fn test_logger_with_file() {
let temp_dir = tempdir().unwrap();
let log_path = temp_dir.path().join("test.log");
let logger = Logger::new(Some(log_path.clone()), "10MB".to_string(), 0).await;
logger.log("Test message with file").await;
sleep(Duration::from_millis(100)).await;
let content = fs::read_to_string(&log_path).await.unwrap();
assert!(content.contains("Test message with file"));
}
#[test]
async fn test_log_rotation() {
let temp_dir = tempdir().unwrap();
let log_path = temp_dir.path().join("rotation.log");
fs::write(&log_path, "Initial content that takes up space")
.await
.unwrap();
let logger = Logger::new(Some(log_path.clone()), "50B".to_string(), 3).await;
for i in 1..=10 {
logger
.log(&format!("Log message {i} to trigger rotation"))
.await;
sleep(Duration::from_millis(50)).await;
}
sleep(Duration::from_millis(200)).await;
let mut dir_entries = fs::read_dir(temp_dir.path()).await.unwrap();
let mut rotated_files = 0;
while let Some(entry) = dir_entries.next_entry().await.unwrap() {
let path = entry.path();
if let Some(file_name) = path.file_name() {
if file_name.to_string_lossy().starts_with("rotation.log.") {
rotated_files += 1;
}
}
}
assert!(rotated_files > 0, "No rotated log files found");
}
#[test]
async fn test_max_log_files() {
let temp_dir = tempdir().unwrap();
let base_path = temp_dir.path().join("max_test.log");
let timestamps = [
"20250101_120000",
"20250101_120100",
"20250101_120200",
"20250101_120300",
"20250101_120400",
];
for ts in ×tamps {
let rotated_path = temp_dir.path().join(format!("max_test.log.{ts}"));
fs::write(&rotated_path, format!("Rotated content for {ts}"))
.await
.unwrap();
}
cleanup_old_log_files(&base_path, 2).await.unwrap();
let mut dir_entries = fs::read_dir(temp_dir.path()).await.unwrap();
let mut remaining_files = 0;
while let Some(entry) = dir_entries.next_entry().await.unwrap() {
let path = entry.path();
if let Some(file_name) = path.file_name() {
if file_name.to_string_lossy().starts_with("max_test.log.") {
remaining_files += 1;
}
}
}
assert_eq!(
remaining_files, 2,
"Incorrect number of files remaining after cleanup"
);
}