use crate::stats::Speed;
use std::collections::HashMap;
use std::net::Ipv4Addr;
pub fn aggregate_peak_speed<'a, I>(hosts_buffer: I) -> HashMap<Ipv4Addr, Speed>
where
I: Iterator<Item = &'a HashMap<Ipv4Addr, Speed>>,
{
let mut peak_speeds: HashMap<Ipv4Addr, Speed> = Default::default();
hosts_buffer.for_each(|pair| {
pair.iter().for_each(|(ip, speed)| {
peak_speeds
.entry(*ip)
.and_modify(|s| {
if speed.input > s.input {
s.input = speed.input;
}
if speed.output > s.output {
s.output = speed.output;
}
})
.or_insert(*speed);
});
});
peak_speeds
}
#[deprecated(
since = "0.2.0",
note = "Use time-weighted averaging with SpeedAccumulator instead"
)]
pub fn aggregate_sum_speed<'a, I>(hosts_buffer: I) -> HashMap<Ipv4Addr, Speed>
where
I: Iterator<Item = &'a HashMap<Ipv4Addr, Speed>>,
{
let mut speed_and_count: HashMap<Ipv4Addr, (Speed, u8)> = Default::default();
hosts_buffer.for_each(|pair| {
pair.iter().for_each(|(ip, speed)| {
speed_and_count
.entry(*ip)
.and_modify(|(s, n)| {
*s += *speed;
*n += 1
})
.or_insert((*speed, 1));
});
});
let mut average_speeds: HashMap<Ipv4Addr, Speed> = Default::default();
speed_and_count.iter().for_each(|(ip, (speed, n))| {
average_speeds.insert(*ip, *speed / (*n as u128));
});
average_speeds
}
#[cfg(test)]
mod tests {
#![allow(deprecated)]
use super::*;
macro_rules! ip {
($a:expr, $b:expr, $c:expr, $d:expr) => {
std::net::Ipv4Addr::new($a, $b, $c, $d)
};
}
#[test]
fn test_aggregate_peak_speed_empty() {
let buffer: Vec<HashMap<Ipv4Addr, Speed>> = vec![];
let result = aggregate_peak_speed(buffer.iter());
assert!(result.is_empty());
}
#[test]
fn test_aggregate_peak_speed_single_entry() {
let mut buffer = vec![];
let mut map = HashMap::new();
map.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
buffer.push(map);
let result = aggregate_peak_speed(buffer.iter());
assert_eq!(result.len(), 1);
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 1000);
assert_eq!(result[&ip!(192, 168, 1, 1)].output, 500);
}
#[test]
fn test_aggregate_peak_speed_multiple_samples() {
let mut buffer = vec![];
let mut map1 = HashMap::new();
map1.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
buffer.push(map1);
let mut map2 = HashMap::new();
map2.insert(ip!(192, 168, 1, 1), Speed::new(2000, 1000));
buffer.push(map2);
let mut map3 = HashMap::new();
map3.insert(ip!(192, 168, 1, 1), Speed::new(1500, 750));
buffer.push(map3);
let result = aggregate_peak_speed(buffer.iter());
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 2000); assert_eq!(result[&ip!(192, 168, 1, 1)].output, 1000); }
#[test]
fn test_aggregate_peak_speed_multiple_hosts() {
let mut buffer = vec![];
let mut map1 = HashMap::new();
map1.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
map1.insert(ip!(192, 168, 1, 2), Speed::new(2000, 1500));
buffer.push(map1);
let mut map2 = HashMap::new();
map2.insert(ip!(192, 168, 1, 1), Speed::new(3000, 1000));
map2.insert(ip!(192, 168, 1, 2), Speed::new(500, 250));
buffer.push(map2);
let result = aggregate_peak_speed(buffer.iter());
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 3000);
assert_eq!(result[&ip!(192, 168, 1, 1)].output, 1000);
assert_eq!(result[&ip!(192, 168, 1, 2)].input, 2000);
assert_eq!(result[&ip!(192, 168, 1, 2)].output, 1500);
}
#[test]
fn test_aggregate_sum_speed_empty() {
let buffer: Vec<HashMap<Ipv4Addr, Speed>> = vec![];
let result = aggregate_sum_speed(buffer.iter());
assert!(result.is_empty());
}
#[test]
fn test_aggregate_sum_speed_single_entry() {
let mut buffer = vec![];
let mut map = HashMap::new();
map.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
buffer.push(map);
let result = aggregate_sum_speed(buffer.iter());
assert_eq!(result.len(), 1);
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 1000);
assert_eq!(result[&ip!(192, 168, 1, 1)].output, 500);
}
#[test]
fn test_aggregate_sum_speed_multiple_samples() {
let mut buffer = vec![];
let mut map1 = HashMap::new();
map1.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
buffer.push(map1);
let mut map2 = HashMap::new();
map2.insert(ip!(192, 168, 1, 1), Speed::new(2000, 1000));
buffer.push(map2);
let result = aggregate_sum_speed(buffer.iter());
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 1500);
assert_eq!(result[&ip!(192, 168, 1, 1)].output, 750);
}
#[test]
fn test_aggregate_sum_speed_multiple_hosts() {
let mut buffer = vec![];
let mut map1 = HashMap::new();
map1.insert(ip!(192, 168, 1, 1), Speed::new(1000, 500));
map1.insert(ip!(192, 168, 1, 2), Speed::new(2000, 1500));
buffer.push(map1);
let mut map2 = HashMap::new();
map2.insert(ip!(192, 168, 1, 1), Speed::new(3000, 1000));
map2.insert(ip!(192, 168, 1, 2), Speed::new(500, 250));
buffer.push(map2);
let result = aggregate_sum_speed(buffer.iter());
assert_eq!(result[&ip!(192, 168, 1, 1)].input, 2000);
assert_eq!(result[&ip!(192, 168, 1, 1)].output, 750);
assert_eq!(result[&ip!(192, 168, 1, 2)].input, 1250);
assert_eq!(result[&ip!(192, 168, 1, 2)].output, 875);
}
}