pub mod app;
pub use app::{aggregate_by_app, AppStats};
use crate::stats::{Direction, Speed};
pub trait DirectionalAggregation {
fn add_directional(&mut self, size: u128, direction: Direction);
}
impl DirectionalAggregation for Speed {
fn add_directional(&mut self, size: u128, direction: Direction) {
match direction {
Direction::Incoming => {
self.input += size;
}
Direction::Outgoing => {
self.output += size;
}
Direction::Internet => {
self.output += size;
}
Direction::Local => {
self.input += size;
self.output += size;
}
Direction::None => {
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_directional_aggregation_incoming() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::Incoming);
assert_eq!(speed.input, 1000);
assert_eq!(speed.output, 0);
}
#[test]
fn test_directional_aggregation_outgoing() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::Outgoing);
assert_eq!(speed.input, 0);
assert_eq!(speed.output, 1000);
}
#[test]
fn test_directional_aggregation_internet() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::Internet);
assert_eq!(speed.input, 0);
assert_eq!(speed.output, 1000);
}
#[test]
fn test_directional_aggregation_local() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::Local);
assert_eq!(speed.input, 1000);
assert_eq!(speed.output, 1000);
}
#[test]
fn test_directional_aggregation_none() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::None);
assert_eq!(speed.input, 0);
assert_eq!(speed.output, 0);
}
#[test]
fn test_directional_aggregation_mixed() {
let mut speed = Speed::default();
speed.add_directional(1000, Direction::Incoming);
speed.add_directional(500, Direction::Outgoing);
speed.add_directional(200, Direction::Local);
assert_eq!(speed.input, 1200); assert_eq!(speed.output, 700); }
}