use drain_flow::drains::api::Drain;
use drain_flow::drains::simple::SingleLayer;
use drain_flow::drains::two_stage_drain::TwoStageDrain;
use drain_flow::drains::DifferentialDrain; use drain_flow::log_group::LogGroup;
fn get_template_string(group: &LogGroup) -> String {
group.base_record().to_string() }
#[allow(dead_code)]
#[cfg(feature = "verbose-tests")]
fn print_groups_summary(drain_name: &str, groups: &[LogGroup]) {
println!("\n---- {} ----", drain_name);
println!("Total groups: {}", groups.len());
for (i, group) in groups.iter().enumerate() {
println!(
" Group {}: Count={}, Template='{}', ID={}",
i,
group.len(),
get_template_string(group),
group.id
);
}
println!("--------------------");
}
#[allow(dead_code)]
#[cfg(not(feature = "verbose-tests"))]
fn print_groups_summary(_drain_name: &str, _groups: &[LogGroup]) {}
#[cfg(test)]
mod comparative_tests {
use super::*;
#[test]
fn test_scenario_1_simple_evolution() {
let log_sequence: Vec<&str> = vec![
"Login success user admin_user_1 session 12345",
"Login success user guest_user_A session 67890",
"Login success user admin_user_2 session abcde",
];
let mut dd_drain = DifferentialDrain::new(0.6, 2);
let mut sl_drain = SingleLayer::new(vec![]).expect("Failed to create SingleLayer");
let mut ts_drain =
TwoStageDrain::new(vec![], 0.5, 4, 100).expect("Failed to create TwoStageDrain");
for line in &log_sequence {
dd_drain.process_line(line.to_string()).unwrap();
sl_drain.process_line(line.to_string()).unwrap();
ts_drain.process_line(line.to_string()).unwrap();
}
let dd_groups = dd_drain.collect_log_groups();
let sl_groups = sl_drain.collect_log_groups();
let ts_groups = ts_drain.collect_log_groups();
print_groups_summary("DifferentialDrain", &dd_groups);
print_groups_summary("SingleLayer", &sl_groups);
print_groups_summary("TwoStageDrain", &ts_groups);
assert_eq!(
dd_groups.len(),
1,
"DifferentialDrain: Expected 1 group for scenario 1"
);
if !dd_groups.is_empty() {
let template = get_template_string(&dd_groups[0]);
assert_eq!(
template, "Login success user <*> session <*>",
"DifferentialDrain: Template mismatch for scenario 1"
);
assert_eq!(
dd_groups[0].len(),
4,
"DifferentialDrain: Count mismatch for scenario 1"
);
}
assert_eq!(
sl_groups.len(),
1,
"SingleLayer: Expected 1 group for scenario 1"
);
assert!(
!ts_groups.is_empty() && ts_groups.len() <= 3,
"TwoStageDrain: Group count out of expected range for scenario 1. Got {}",
ts_groups.len()
);
if ts_groups.len() == 1 {
println!(
"TwoStageDrain also produced 1 group for scenario 1. Template: '{}'",
get_template_string(&ts_groups[0])
);
}
}
#[test]
fn test_scenario_2_evolving_patterns() {
let log_sequence: Vec<&str> = vec![
"Service v1.0 request proc_alpha status 200", "Service v1.0 request proc_beta status 200", "Service v1.1 request proc_alpha status 200", "Service v1.1 request proc_beta status 200", "Service v1.1 request proc_alpha status 503", ];
let mut dd_drain = DifferentialDrain::new(0.6, 2);
let mut sl_drain = SingleLayer::new(vec![]).expect("Failed to create SingleLayer");
let mut ts_drain =
TwoStageDrain::new(vec![], 0.5, 4, 100).expect("Failed to create TwoStageDrain");
for line in &log_sequence {
dd_drain.process_line(line.to_string()).unwrap();
sl_drain.process_line(line.to_string()).unwrap();
ts_drain.process_line(line.to_string()).unwrap();
}
let dd_groups = dd_drain.collect_log_groups();
let sl_groups = sl_drain.collect_log_groups();
let ts_groups = ts_drain.collect_log_groups();
print_groups_summary("DifferentialDrain (Scenario 2)", &dd_groups);
print_groups_summary("SingleLayer (Scenario 2)", &sl_groups);
print_groups_summary("TwoStageDrain (Scenario 2)", &ts_groups);
assert_eq!(
dd_groups.len(),
1,
"DifferentialDrain: Expected 1 group for scenario 2"
);
if !dd_groups.is_empty() {
let template = get_template_string(&dd_groups[0]);
assert_eq!(
template, "Service v1 . <*> request <*> status <*>",
"DifferentialDrain: Template mismatch for scenario 2"
);
assert_eq!(
dd_groups[0].len(),
6,
"DifferentialDrain: Count mismatch for scenario 2"
);
}
assert_eq!(
sl_groups.len(),
2,
"SingleLayer: Expected 2 groups for scenario 2"
);
assert!(
!ts_groups.is_empty() && ts_groups.len() <= 5,
"TwoStageDrain: Group count out of expected range for scenario 2. Got {}",
ts_groups.len()
);
if dd_groups.len() < ts_groups.len() {
println!("TwoStageDrain created more groups ({}) than DifferentialDrain ({}) as expected sometimes.", ts_groups.len(), dd_groups.len());
}
}
}