open-standards/wai/http-conformance/falsify/adjacency-pdt.patch
Transaction Science 18da795017 wai: falsification of the playlist side (W3-4, W3-5)
Eighteen patches, each breaking one function of the playlist side and naming the
cases that must fail: adjacency (another program date-time, a larger discontinuity
sequence), rendering (parts after EXTINF, layer lines after the URI), bandwidth
rounding, duration rounding, a delta update read, the session-data line before
#EXTM3U, the render digest left out of the signed payload, a receipt under another
name, an unchecked parent, the open segment's parts not read for cids, the integer
log without interpolation, a waiting utility rule, a look-ahead blind to stalls, an
unlabelled figure taken as zero, per-layer bytes as a depth's, and size-blind entry
order. falsify/run.sh builds with http and video_manifest and runs the eleven new
Python mutations. A depth case at 150 kb/s sits between layer boundaries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 06:31:05 -04:00

15 lines
980 B
Diff

# must fail: adjacency_program_date_time
# adjacency ignores another program date-time (hls::timelines_adjacent)
diff --git a/wai/wai-rs/src/http_binding/hls.rs b/wai/wai-rs/src/http_binding/hls.rs
index 2623644b..e93d4430 100644
--- a/wai/wai-rs/src/http_binding/hls.rs
+++ b/wai/wai-rs/src/http_binding/hls.rs
@@ -412,7 +412,7 @@ pub fn timelines_adjacent(wai: &MediaPlaylist, classical: &MediaPlaylist) -> Res
if w.extra.discontinuity != c.extra.discontinuity {
return Err(misaligned(format!("segment {seq}: a discontinuity on one side only")));
}
- if w.extra.program_date_time != c.extra.program_date_time {
+ if w.extra.program_date_time.is_some() && c.extra.program_date_time.is_none() {
return Err(misaligned(format!("segment {seq}: another program date-time")));
}
if both_parts && !w.extra.parts.is_empty() && !c.extra.parts.is_empty() && parts_ms(&w.extra.parts) != parts_ms(&c.extra.parts) {