diff --git a/crates/irtt-cli/src/main.rs b/crates/irtt-cli/src/main.rs index d173565..34a25fe 100644 --- a/crates/irtt-cli/src/main.rs +++ b/crates/irtt-cli/src/main.rs @@ -77,6 +77,7 @@ fn run(args: CliArgs, shutdown_requested: &AtomicBool) -> Result<(), Box Result<(), Box { mode: irtt_cli::OutputMode, human_options: HumanOutputOptions, print_final_summary: bool, + show_running_only_summary_note: bool, out: &'a mut W, #[cfg(feature = "stats")] stats: &'a mut StatsCollector, @@ -261,6 +265,7 @@ impl EventOutput<'_, W> { &self.stats.snapshot(), irtt_cli::summary::SummaryFormatOptions { verbose: self.human_options.verbose, + show_running_only_note: self.show_running_only_summary_note, }, ) )?; @@ -471,6 +476,7 @@ mod tests { mode: irtt_cli::OutputMode::RttUs, human_options: HumanOutputOptions::default(), print_final_summary: true, + show_running_only_summary_note: false, out: &mut out, stats: &mut stats, }; @@ -494,6 +500,7 @@ mod tests { mode: irtt_cli::OutputMode::Human, human_options: HumanOutputOptions::default(), print_final_summary: false, + show_running_only_summary_note: true, out: &mut out, stats: &mut stats, }; @@ -512,6 +519,7 @@ mod tests { mode: irtt_cli::OutputMode::Human, human_options: HumanOutputOptions::default(), print_final_summary: true, + show_running_only_summary_note: true, out: &mut out, stats: &mut stats, }; @@ -521,6 +529,8 @@ mod tests { let rendered = String::from_utf8(out).unwrap(); assert!(rendered.contains("irtt-rs summary")); + assert!(rendered.contains("medians unavailable")); + assert!(rendered.contains("continuous mode")); assert!(rendered.contains("packets:")); assert!(rendered.contains("received=1")); } @@ -535,6 +545,7 @@ mod tests { mode: irtt_cli::OutputMode::Human, human_options: HumanOutputOptions::default(), print_final_summary: false, + show_running_only_summary_note: false, out: &mut out, stats: &mut stats, }; diff --git a/crates/irtt-cli/src/summary.rs b/crates/irtt-cli/src/summary.rs index 6d95eee..be970f6 100644 --- a/crates/irtt-cli/src/summary.rs +++ b/crates/irtt-cli/src/summary.rs @@ -9,6 +9,7 @@ pub fn format_summary(summary: &Snapshot) -> String { #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct SummaryFormatOptions { pub verbose: bool, + pub show_running_only_note: bool, } pub fn format_summary_with_options(summary: &Snapshot, options: SummaryFormatOptions) -> String { @@ -18,6 +19,13 @@ pub fn format_summary_with_options(summary: &Snapshot, options: SummaryFormatOpt writeln!(out).unwrap(); writeln!(out, "irtt-rs summary").unwrap(); + if options.show_running_only_note { + writeln!( + out, + "note: medians unavailable in continuous mode; running statistics are bounded-memory" + ) + .unwrap(); + } writeln!(out).unwrap(); writeln!( out, @@ -232,6 +240,7 @@ mod tests { assert!(output.contains("10.0µs")); assert!(output.contains("timer error")); assert!(output.contains("2.0µs")); + assert!(!output.contains("medians unavailable")); } #[test] @@ -259,13 +268,32 @@ mod tests { let output = format_summary_with_options( &collector.snapshot(), - SummaryFormatOptions { verbose: true }, + SummaryFormatOptions { + verbose: true, + ..SummaryFormatOptions::default() + }, ); assert!(output.contains("raw RTT")); assert!(output.contains("adjusted RTT")); } + #[test] + fn running_only_note_is_format_option() { + let summary = StatsCollector::new(StatsConfig::continuous()).snapshot(); + let output = format_summary_with_options( + &summary, + SummaryFormatOptions { + show_running_only_note: true, + ..SummaryFormatOptions::default() + }, + ); + + assert!(output.contains("irtt-rs summary")); + assert!(output.contains("medians unavailable")); + assert!(output.contains("continuous mode")); + } + #[test] fn signed_stats_can_format_negative_values() { let stats = TimeStats {