aboutsummaryrefslogtreecommitdiff
path: root/tests/Jellyfin.Controller.Tests
diff options
context:
space:
mode:
authorklizas <klizas@users.noreply.github.com>2026-10-05 19:18:45 -0400
committerCody Robibero <cody@robibe.ro>2026-10-05 19:18:45 -0400
commit7dc6544d3441187f73393dac54dc358b3ceb98ed (patch)
tree339d4cf7da2c12397602a372e028433e6e9c2434 /tests/Jellyfin.Controller.Tests
parent69e131eaa5bbe6ff01175332b58c5b262863a5a3 (diff)
Backport pull request #18186 from jellyfin/release-12.z
Fix segment cleaner deleting segments ahead of playback when remuxing MKV Original-merge: 3acc9c8443d7ee445c4fe015f2977a47d4ea57ac Merged-by: crobibero <cody@robibe.ro> Backported-by: Cody Robibero <cody@robibe.ro>
Diffstat (limited to 'tests/Jellyfin.Controller.Tests')
-rw-r--r--tests/Jellyfin.Controller.Tests/MediaEncoding/TranscodingJobTests.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/Jellyfin.Controller.Tests/MediaEncoding/TranscodingJobTests.cs b/tests/Jellyfin.Controller.Tests/MediaEncoding/TranscodingJobTests.cs
new file mode 100644
index 0000000000..9dc279a5b2
--- /dev/null
+++ b/tests/Jellyfin.Controller.Tests/MediaEncoding/TranscodingJobTests.cs
@@ -0,0 +1,56 @@
+using System;
+using MediaBrowser.Controller.MediaEncoding;
+using Microsoft.Extensions.Logging.Abstractions;
+using Xunit;
+
+namespace Jellyfin.Controller.Tests.MediaEncoding;
+
+public class TranscodingJobTests
+{
+ private static TranscodingJob CreateJob()
+ => new TranscodingJob(NullLogger<TranscodingJob>.Instance);
+
+ [Fact]
+ public void GetHighestServedSegmentIndexEndingAtOrBefore_NoSegmentsServed_ReturnsNull()
+ {
+ using var job = CreateJob();
+
+ Assert.Null(job.GetHighestServedSegmentIndexEndingAtOrBefore(TimeSpan.FromHours(1).Ticks));
+ }
+
+ [Fact]
+ public void GetHighestServedSegmentIndexEndingAtOrBefore_InitSegment_IsIgnored()
+ {
+ using var job = CreateJob();
+ job.ReportSegmentDownloaded(-1, 0);
+
+ Assert.Null(job.GetHighestServedSegmentIndexEndingAtOrBefore(TimeSpan.FromHours(1).Ticks));
+ }
+
+ [Fact]
+ public void GetHighestServedSegmentIndexEndingAtOrBefore_SegmentEndingExactlyAtPosition_IsIncluded()
+ {
+ using var job = CreateJob();
+ job.ReportSegmentDownloaded(0, TimeSpan.FromSeconds(6).Ticks);
+ job.ReportSegmentDownloaded(1, TimeSpan.FromSeconds(12).Ticks);
+
+ Assert.Equal(1, job.GetHighestServedSegmentIndexEndingAtOrBefore(TimeSpan.FromSeconds(12).Ticks));
+ Assert.Equal(0, job.GetHighestServedSegmentIndexEndingAtOrBefore(TimeSpan.FromSeconds(11.9).Ticks));
+ }
+
+ [Fact]
+ public void GetHighestServedSegmentIndexEndingAtOrBefore_SegmentsLongerThanDesired_ReturnsServedIndex()
+ {
+ // Keyframe-based playlists average longer segments than the desired 6s.
+ const double SegmentSeconds = 6.6;
+ using var job = CreateJob();
+ for (var i = 0; i < 520; i++)
+ {
+ job.ReportSegmentDownloaded(i, TimeSpan.FromSeconds((i + 1) * SegmentSeconds).Ticks);
+ }
+
+ var keepFrom = TimeSpan.FromSeconds((520 * SegmentSeconds) - 120);
+
+ Assert.Equal(500, job.GetHighestServedSegmentIndexEndingAtOrBefore(keepFrom.Ticks));
+ }
+}