aboutsummaryrefslogtreecommitdiff
path: root/tests/Jellyfin.Controller.Tests/MediaEncoding/TranscodingJobTests.cs
blob: 9dc279a5b2beda803a7fa944777283b3a54068de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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));
    }
}