Parcourir la source

Add tests for ComputeEqualLengthSegments and fix bug

cvium il y a 3 ans
Parent
commit
3e5cb8e04e

+ 9 - 2
src/Jellyfin.MediaEncoding.Hls/Playlist/DynamicHlsPlaylistGenerator.cs

@@ -221,7 +221,14 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
 
         internal static double[] ComputeEqualLengthSegments(long desiredSegmentLengthMs, long totalRuntimeTicks)
         {
-            var segmentLengthTicks = TimeSpan.FromMilliseconds(desiredSegmentLengthMs).Ticks;
+            if (desiredSegmentLengthMs == 0 || totalRuntimeTicks == 0)
+            {
+                throw new InvalidOperationException($"Invalid segment length ({desiredSegmentLengthMs}) or runtime ticks ({totalRuntimeTicks})");
+            }
+
+            var desiredSegmentLength = TimeSpan.FromMilliseconds(desiredSegmentLengthMs);
+
+            var segmentLengthTicks = desiredSegmentLength.Ticks;
             var wholeSegments = totalRuntimeTicks / segmentLengthTicks;
             var remainingTicks = totalRuntimeTicks % segmentLengthTicks;
 
@@ -229,7 +236,7 @@ namespace Jellyfin.MediaEncoding.Hls.Playlist
             var segments = new double[segmentsLen];
             for (int i = 0; i < wholeSegments; i++)
             {
-                segments[i] = desiredSegmentLengthMs;
+                segments[i] = desiredSegmentLength.TotalSeconds;
             }
 
             if (remainingTicks != 0)

+ 31 - 1
tests/Jellyfin.MediaEncoding.Hls.Tests/Playlist/DynamicHlsPlaylistGeneratorTests.cs

@@ -1,10 +1,26 @@
-using Jellyfin.MediaEncoding.Hls.Playlist;
+using System;
+using Jellyfin.MediaEncoding.Hls.Playlist;
 using Xunit;
 
 namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
 {
     public class DynamicHlsPlaylistGeneratorTests
     {
+        [Theory]
+        [MemberData(nameof(ComputeEqualLengthSegments_Valid_Success_Data))]
+        public void ComputeEqualLengthSegments_Valid_Success(long desiredSegmentLengthMs, long totalRuntimeTicks, double[] segments)
+        {
+            Assert.Equal(segments, DynamicHlsPlaylistGenerator.ComputeEqualLengthSegments(desiredSegmentLengthMs, totalRuntimeTicks));
+        }
+
+        [Theory]
+        [InlineData(0, 1000000)]
+        [InlineData(1000, 0)]
+        public void ComputeEqualLengthSegments_Invalid_ThrowsInvalidOperationException(long desiredSegmentLengthMs, long totalRuntimeTicks)
+        {
+            Assert.Throws<InvalidOperationException>(() => DynamicHlsPlaylistGenerator.ComputeEqualLengthSegments(desiredSegmentLengthMs, totalRuntimeTicks));
+        }
+
         [Theory]
         [InlineData("testfile.mkv", new string[0], false)]
         [InlineData("testfile.flv", new[] { "mp4", "mkv", "ts" }, false)]
@@ -21,5 +37,19 @@ namespace Jellyfin.MediaEncoding.Hls.Tests.Playlist
         {
             Assert.False(DynamicHlsPlaylistGenerator.IsExtractionAllowedForFile(filePath, allowedExtensions));
         }
+
+        private static TheoryData<long, long, double[]> ComputeEqualLengthSegments_Valid_Success_Data()
+        {
+            var data = new TheoryData<long, long, double[]>
+            {
+                { 6000, TimeSpan.FromMilliseconds(13000).Ticks, new[] { 6.0, 6.0, 1.0 } },
+                { 3000, TimeSpan.FromMilliseconds(15000).Ticks, new[] { 3.0, 3.0, 3.0, 3.0, 3.0 } },
+                { 6000, TimeSpan.FromMilliseconds(25000).Ticks, new[] { 6.0, 6.0, 6.0, 6.0, 1.0 } },
+                { 6000, TimeSpan.FromMilliseconds(20123).Ticks, new[] { 6.0, 6.0, 6.0, 2.123 } },
+                { 6000, TimeSpan.FromMilliseconds(1234).Ticks, new[] { 1.234 } }
+            };
+
+            return data;
+        }
     }
 }