use super::*;
fn traced(events: &[(TraceStep, usize, u64)]) -> InferenceTracer {
let mut t = tracer_for(Some("step")).expect("step is traced");
for &(step, iteration, us) in events {
t.record_timed(step, iteration, None, us);
}
t
}
fn serve<'a>(
level: &'a str,
events: &'a [TraceEvent],
layers: Option<&'a [LayerTiming]>,
wall_us: u64,
) -> ServeTrace<'a> {
ServeTrace {
level: Some(level),
events,
layers,
wall_us,
prompt_tokens: 4,
completion_tokens: 3,
num_layers: 2,
}
}
fn layer(total_us: u64, calls: u32) -> LayerTiming {
LayerTiming {
total_us,
calls,
kind: "deltanet",
}
}
#[test]
fn falsify_obs_trace_001_no_events_is_not_measured() {
let (_, step, _) = traces_for(&serve("step", &[], None, 10_000));
let step = step.expect("the header still gets its wall-clock row");
assert_eq!(step.provenance, TraceProvenance::WallClockTotal);
let (_, _, layers) = traces_for(&serve("layer", &[], None, 10_000));
assert_eq!(
layers.expect("wall-clock row").provenance,
TraceProvenance::WallClockTotal
);
let idle = [layer(0, 0), layer(0, 0)];
let (_, _, layers) = traces_for(&serve("layer", &[], Some(&idle), 10_000));
assert_eq!(
layers.expect("wall-clock row").provenance,
TraceProvenance::WallClockTotal
);
}
#[test]
fn falsify_obs_trace_001_disabled_tracer_records_nothing() {
let mut t = InferenceTracer::disabled();
t.record_timed(TraceStep::TransformerBlock, 0, None, 5);
assert!(t.events().is_empty());
assert!(tracer_for(Some("brick")).is_none());
assert!(tracer_for(None).is_none());
}
#[test]
fn falsify_obs_trace_002_layer_sum_over_wall_is_not_measured() {
let over = [layer(600, 3), layer(500, 3)];
let (_, _, l) = traces_for(&serve("layer", &[], Some(&over), 1_000));
assert_eq!(
l.expect("wall-clock row").provenance,
TraceProvenance::WallClockTotal
);
let t = traced(&[
(TraceStep::TransformerBlock, 0, 900),
(TraceStep::Decode, 0, 200),
]);
let (_, s, _) = traces_for(&serve("step", t.events(), None, 1_000));
assert_eq!(
s.expect("wall-clock row").provenance,
TraceProvenance::WallClockTotal
);
}
#[test]
fn measured_layers_are_reported_per_layer_within_wall() {
let tally = [
layer(300, 3),
LayerTiming {
total_us: 200,
calls: 3,
kind: "attention",
},
];
let (b, s, l) = traces_for(&serve("layer", &[], Some(&tally), 1_000));
assert!(b.is_none() && s.is_none());
let l = l.expect("layer trace");
assert_eq!(l.provenance, TraceProvenance::Measured);
assert_eq!(l.total_time_us, 1_000);
let names: Vec<_> = l.breakdown.iter().map(|o| o.name.as_str()).collect();
assert_eq!(names, ["layer[0] deltanet", "layer[1] attention"]);
let sum: u64 = l.breakdown.iter().map(|o| o.time_us).sum();
assert!(sum <= l.total_time_us);
}
#[test]
fn measured_steps_split_prefill_decode_emit() {
let t = traced(&[
(TraceStep::TransformerBlock, 0, 400),
(TraceStep::Decode, 0, 5),
(TraceStep::TransformerBlock, 1, 100),
(TraceStep::Decode, 1, 5),
(TraceStep::TransformerBlock, 2, 110),
(TraceStep::Decode, 2, 5),
]);
let (_, s, _) = traces_for(&serve("step", t.events(), None, 1_000));
let s = s.expect("step trace");
assert_eq!(s.provenance, TraceProvenance::Measured);
assert_eq!(s.operations, 6);
let rows: Vec<_> = s
.breakdown
.iter()
.map(|o| (o.name.as_str(), o.time_us))
.collect();
assert_eq!(rows, [("prefill", 400), ("decode", 210), ("emit", 15)]);
let counts: Vec<_> = s
.breakdown
.iter()
.map(|o| o.details.as_deref().and_then(|d| d.split(' ').next()))
.collect();
assert_eq!(counts, [Some("1"), Some("2"), Some("3")]);
}
#[test]
fn falsify_obs_trace_002_sum_at_wall_is_measured_one_over_is_not() {
let case = |sum_extra: u64| {
let at = [layer(600, 3), layer(400 + sum_extra, 3)];
let (_, _, l) = traces_for(&serve("layer", &[], Some(&at), 1_000));
let t = traced(&[
(TraceStep::TransformerBlock, 0, 800),
(TraceStep::TransformerBlock, 1, 150),
(TraceStep::Decode, 1, 50 + sum_extra),
]);
let (_, s, _) = traces_for(&serve("step", t.events(), None, 1_000));
(
l.expect("layer row").provenance,
s.expect("step row").provenance,
)
};
use TraceProvenance::{Measured, WallClockTotal};
assert_eq!(case(0), (Measured, Measured), "sum == wall");
assert_eq!(case(1), (WallClockTotal, WallClockTotal), "sum == wall + 1");
}