Skip to main content

lobe_core/engine/
timing.rs

1use crate::models::TimingReport;
2
3#[derive(Debug, Clone, Copy, Default)]
4pub struct TimingPhases {
5    pub dns_ms: u64,
6    pub tcp_ms: u64,
7    pub tls_ms: u64,
8    pub ttfb_ms: u64,
9    pub download_ms: u64,
10}
11
12pub fn build_report(
13    dns_ms: u64,
14    tcp_ms: u64,
15    tls_ms: u64,
16    ttfb_ms: u64,
17    download_ms: u64,
18) -> TimingReport {
19    let total_ms = calculate_total_ms(dns_ms, tcp_ms, tls_ms, ttfb_ms, download_ms);
20
21    TimingReport {
22        dns_ms,
23        tcp_ms,
24        tls_ms,
25        ttfb_ms,
26        download_ms,
27        total_ms,
28    }
29}
30
31pub fn build_report_from_phases(phases: TimingPhases) -> TimingReport {
32    build_report(
33        phases.dns_ms,
34        phases.tcp_ms,
35        phases.tls_ms,
36        phases.ttfb_ms,
37        phases.download_ms,
38    )
39}
40
41pub fn calculate_total_ms(
42    dns_ms: u64,
43    tcp_ms: u64,
44    tls_ms: u64,
45    ttfb_ms: u64,
46    download_ms: u64,
47) -> u64 {
48    dns_ms + tcp_ms + tls_ms + ttfb_ms + download_ms
49}
50
51#[cfg(test)]
52mod tests {
53    use super::{build_report, build_report_from_phases, calculate_total_ms, TimingPhases};
54
55    #[test]
56    fn calculate_total_ms_sums_all_phases() {
57        let total_ms = calculate_total_ms(10, 20, 30, 40, 50);
58
59        assert_eq!(total_ms, 150);
60    }
61
62    #[test]
63    fn calculate_total_ms_handles_zero_values() {
64        let total_ms = calculate_total_ms(0, 0, 0, 0, 0);
65
66        assert_eq!(total_ms, 0);
67    }
68
69    #[test]
70    fn build_report_populates_each_field() {
71        let report = build_report(15, 25, 35, 45, 55);
72
73        assert_eq!(report.dns_ms, 15);
74        assert_eq!(report.tcp_ms, 25);
75        assert_eq!(report.tls_ms, 35);
76        assert_eq!(report.ttfb_ms, 45);
77        assert_eq!(report.download_ms, 55);
78        assert_eq!(report.total_ms, 175);
79    }
80
81    #[test]
82    fn build_report_from_phases_uses_phase_values() {
83        let phases = TimingPhases {
84            dns_ms: 5,
85            tcp_ms: 10,
86            tls_ms: 15,
87            ttfb_ms: 20,
88            download_ms: 25,
89        };
90
91        let report = build_report_from_phases(phases);
92
93        assert_eq!(report.dns_ms, 5);
94        assert_eq!(report.tcp_ms, 10);
95        assert_eq!(report.tls_ms, 15);
96        assert_eq!(report.ttfb_ms, 20);
97        assert_eq!(report.download_ms, 25);
98        assert_eq!(report.total_ms, 75);
99    }
100}