use regex::Regex;
use std::io::Write;
use tempfile::NamedTempFile;
use timber_rs::analyzer::LogAnalyzer;
fn create_test_log_file(lines: usize) -> NamedTempFile {
let temp_file = NamedTempFile::new().unwrap();
let mut file = std::fs::File::create(temp_file.path()).unwrap();
for i in 0..lines {
let level = match i % 5 {
0 => "ERROR",
1 => "WARN",
2 => "INFO",
3 => "DEBUG",
_ => "TRACE",
};
writeln!(
file,
"2025-03-21 {:02}:{:02}:00,{:03} [{}] Test message {}",
(i / 60) % 24,
i % 60,
i % 1000,
level,
i
)
.unwrap();
}
temp_file
}
#[test]
fn test_parallel_processing_basic() {
let temp_file = create_test_log_file(1000);
let file_path = temp_file.path();
let content = std::fs::read_to_string(file_path).unwrap();
let lines: Vec<String> = content.lines().map(String::from).collect();
let mut sequential_analyzer = LogAnalyzer::new();
let mut parallel_analyzer = LogAnalyzer::new();
let sequential_result =
sequential_analyzer.analyze_lines(lines.clone().into_iter(), None, None, false, false);
let parallel_result = parallel_analyzer.analyze_lines_parallel(lines, None, None, false, false);
assert_eq!(sequential_result.count, parallel_result.count);
assert_eq!(
sequential_result.matched_lines.len(),
parallel_result.matched_lines.len()
);
}
#[test]
fn test_parallel_processing_with_filters() {
let temp_file = create_test_log_file(1000);
let file_path = temp_file.path();
let content = std::fs::read_to_string(file_path).unwrap();
let lines: Vec<String> = content.lines().map(String::from).collect();
let mut sequential_analyzer = LogAnalyzer::new();
let mut parallel_analyzer = LogAnalyzer::new();
let pattern = Regex::new("ERROR").unwrap();
let sequential_result = sequential_analyzer.analyze_lines(
lines.clone().into_iter(),
Some(&pattern),
Some("ERROR"),
false,
false,
);
let parallel_result = parallel_analyzer.analyze_lines_parallel(
lines,
Some(&pattern),
Some("ERROR"),
false,
false,
);
assert_eq!(sequential_result.count, parallel_result.count);
assert_eq!(
sequential_result.matched_lines.len(),
parallel_result.matched_lines.len()
);
}
#[test]
fn test_parallel_processing_with_stats() {
let temp_file = create_test_log_file(1000);
let file_path = temp_file.path();
let content = std::fs::read_to_string(file_path).unwrap();
let lines: Vec<String> = content.lines().map(String::from).collect();
let mut sequential_analyzer = LogAnalyzer::new();
let mut parallel_analyzer = LogAnalyzer::new();
let sequential_result =
sequential_analyzer.analyze_lines(lines.clone().into_iter(), None, None, true, true);
let parallel_result = parallel_analyzer.analyze_lines_parallel(lines, None, None, true, true);
assert_eq!(sequential_result.count, parallel_result.count);
assert_eq!(
sequential_result.time_trends.len(),
parallel_result.time_trends.len()
);
for (timestamp, count) in &sequential_result.time_trends {
assert_eq!(parallel_result.time_trends.get(timestamp), Some(count));
}
assert_eq!(
sequential_result.levels_count.len(),
parallel_result.levels_count.len()
);
for (level, count) in &sequential_result.levels_count {
assert_eq!(parallel_result.levels_count.get(level), Some(count));
}
assert_eq!(
sequential_result.unique_messages.len(),
parallel_result.unique_messages.len()
);
}
#[test]
#[ignore]
fn test_merge_results_manually() {
let temp_file1 = create_test_log_file(100);
let temp_file2 = create_test_log_file(200);
let content1 = std::fs::read_to_string(temp_file1.path()).unwrap();
let content2 = std::fs::read_to_string(temp_file2.path()).unwrap();
let lines1: Vec<String> = content1.lines().map(String::from).collect();
let lines2: Vec<String> = content2.lines().map(String::from).collect();
let mut analyzer1 = LogAnalyzer::new();
let mut analyzer2 = LogAnalyzer::new();
let result1 = analyzer1.analyze_lines(lines1.into_iter(), None, None, true, true);
let result2 = analyzer2.analyze_lines(lines2.into_iter(), None, None, true, true);
assert_eq!(result1.count + result2.count, 300);
for (timestamp, count1) in &result1.time_trends {
if let Some(count2) = result2.time_trends.get(timestamp) {
let expected_merged = count1 + count2;
assert!(expected_merged >= *count1);
assert!(expected_merged >= *count2);
}
}
}