diff --git a/crates/irtt-cli/src/cmd/tui/ui.rs b/crates/irtt-cli/src/cmd/tui/ui.rs index 9e1be3e..3bc428a 100644 --- a/crates/irtt-cli/src/cmd/tui/ui.rs +++ b/crates/irtt-cli/src/cmd/tui/ui.rs @@ -122,7 +122,7 @@ impl TuiState { } pub(super) fn process_event(&mut self, event: &ClientEvent, stats: &mut StatsCollector) { - stats.process(event); + process_tui_stats(event, stats); match event { ClientEvent::SessionStarted { remote, @@ -263,6 +263,38 @@ impl TuiState { } } +fn process_tui_stats(event: &ClientEvent, stats: &mut StatsCollector) { + if let ClientEvent::LateReply { + seq, + highest_seen, + remote, + received_at, + bytes, + packet_meta, + .. + } = event + { + // The TUI treats late replies as diagnostics, even when retained send + // metadata lets the client attach RTT fields to the event. + let late_counter_event = ClientEvent::LateReply { + seq: *seq, + highest_seen: *highest_seen, + remote: *remote, + sent_at: None, + received_at: *received_at, + rtt: None, + server_timing: None, + one_way: None, + received_stats: None, + bytes: *bytes, + packet_meta: *packet_meta, + }; + stats.process(&late_counter_event); + } else { + stats.process(event); + } +} + impl Default for TuiState { fn default() -> Self { Self::new(TuiConfig::default()) @@ -582,10 +614,11 @@ fn packet_panel(state: &TuiState, snapshot: &Snapshot) -> Paragraph<'static> { format_count(packets.unique_replies) )), Line::from(format!( - "lost {:>8} duplicates {:>6} late {:>10}", + "lost {:>8} duplicates {:>6} late {:>10} warnings {:>6}", format_count(loss.lost_packets), format_count(packets.duplicates), - format_count(packets.late_packets) + format_count(packets.late_packets), + format_count(snapshot.events.warning_events) )), Line::from(format!( "loss {:>8} reply rate {:>10} progress {progress}", @@ -1263,6 +1296,14 @@ mod tests { ); assert!(state.graph_history.is_empty()); + let snapshot = stats.snapshot(); + assert_eq!(snapshot.events.duplicate_replies, 1); + assert_eq!(snapshot.events.late_unique_replies, 0); + assert_eq!(snapshot.events.untracked_late_replies, 1); + assert_eq!(snapshot.packets.unique_replies, 0); + assert_eq!(snapshot.packets.duplicates, 1); + assert_eq!(snapshot.packets.late_packets, 1); + assert_eq!(snapshot.rtt.primary.count, 0); assert!(state .recent_events .iter()