diff --git a/net/hlssink3/tests/common/mod.rs b/net/hlssink3/tests/common/mod.rs index 61f55e49f..354771826 100644 --- a/net/hlssink3/tests/common/mod.rs +++ b/net/hlssink3/tests/common/mod.rs @@ -12,6 +12,12 @@ pub struct ByteRange { offset: u64, } +impl ByteRange { + fn end(&self) -> u64 { + self.offset + self.length + } +} + pub fn get_byte_ranges(s: &gst::StructureRef) -> Vec { let mut ranges = Vec::new(); @@ -43,3 +49,23 @@ pub fn validate_byterange_sequence(ranges: &[ByteRange]) -> bool { next.offset == current.offset + current.length }) } + +fn ranges_overlap(a: &ByteRange, b: &ByteRange) -> bool { + a.offset < b.end() && b.offset < a.end() +} + +pub fn all_ranges_non_overlapping(ranges: &[ByteRange]) -> bool { + if ranges.len() <= 1 { + return true; // 0 or 1 range cannot overlap + } + + for i in 0..ranges.len() { + for j in (i + 1)..ranges.len() { + if ranges_overlap(&ranges[i], &ranges[j]) { + return false; + } + } + } + + true +} diff --git a/net/hlssink3/tests/hlscmafsink.rs b/net/hlssink3/tests/hlscmafsink.rs index e0554a7e4..1880bd3fa 100644 --- a/net/hlssink3/tests/hlscmafsink.rs +++ b/net/hlssink3/tests/hlscmafsink.rs @@ -205,6 +205,7 @@ fn test_hlscmafsink_video_with_single_media_file() -> Result<(), ()> { // byte range can differ from each run and hence we do not validate // the entire playlist. assert!(validate_byterange_sequence(&byte_ranges)); + assert!(all_ranges_non_overlapping(&byte_ranges)); let expected_messages = { use self::HlsSinkEvent::*; diff --git a/net/hlssink3/tests/hlssink3.rs b/net/hlssink3/tests/hlssink3.rs index b2f83815f..77aba345c 100644 --- a/net/hlssink3/tests/hlssink3.rs +++ b/net/hlssink3/tests/hlssink3.rs @@ -14,7 +14,7 @@ use std::sync::LazyLock; use std::sync::{mpsc, Arc, Mutex}; mod common; -use crate::common::{get_byte_ranges, validate_byterange_sequence, ByteRange}; +use crate::common::*; static CAT: LazyLock = LazyLock::new(|| { gst::DebugCategory::new( @@ -657,6 +657,7 @@ fn test_hlssink3_video_with_single_media_file() -> Result<(), ()> { // range can differ from each run and hence we do not validate // the entire playlist. assert!(validate_byterange_sequence(&byte_ranges)); + assert!(all_ranges_non_overlapping(&byte_ranges)); let expected_messages = { use self::HlsSinkEvent::*;