< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.ScheduledTasks.Triggers.IntervalTrigger
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/ScheduledTasks/Triggers/IntervalTrigger.cs
Line coverage
71%
Covered lines: 20
Uncovered lines: 8
Coverable lines: 28
Total lines: 106
Line coverage: 71.4%
Branch coverage
50%
Covered branches: 5
Total branches: 10
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Start(...)50%4481.81%
Stop()100%11100%
DisposeTimer()100%22100%
OnTriggered()0%620%
Dispose()50%2280%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/ScheduledTasks/Triggers/IntervalTrigger.cs

#LineLine coverage
 1using System;
 2using System.Linq;
 3using System.Threading;
 4using MediaBrowser.Model.Tasks;
 5using Microsoft.Extensions.Logging;
 6
 7namespace Emby.Server.Implementations.ScheduledTasks.Triggers;
 8
 9/// <summary>
 10/// Represents a task trigger that runs repeatedly on an interval.
 11/// </summary>
 12public sealed class IntervalTrigger : ITaskTrigger, IDisposable
 13{
 14    private readonly TimeSpan _interval;
 15    private DateTime _lastStartDate;
 16    private Timer? _timer;
 17    private bool _disposed;
 18
 19    /// <summary>
 20    /// Initializes a new instance of the <see cref="IntervalTrigger"/> class.
 21    /// </summary>
 22    /// <param name="interval">The interval.</param>
 23    /// <param name="taskOptions">The options of this task.</param>
 24    public IntervalTrigger(TimeSpan interval, TaskOptions taskOptions)
 25    {
 27326        _interval = interval;
 27        TaskOptions = taskOptions;
 27328    }
 29
 30    /// <inheritdoc />
 31    public event EventHandler<EventArgs>? Triggered;
 32
 33    /// <inheritdoc />
 34    public TaskOptions TaskOptions { get; }
 35
 36    /// <inheritdoc />
 37    public void Start(TaskResult? lastResult, ILogger logger, string taskName, bool isApplicationStartup)
 38    {
 27339        DisposeTimer();
 40
 27341        DateTime now = DateTime.UtcNow;
 42        DateTime triggerDate;
 43
 27344        if (lastResult is null)
 45        {
 46            // Task has never been completed before
 27347            triggerDate = now.AddHours(1);
 48        }
 49        else
 50        {
 051            triggerDate = new[] { lastResult.EndTimeUtc, _lastStartDate, now.AddMinutes(1) }.Max().Add(_interval);
 52        }
 53
 27354        var dueTime = triggerDate - now;
 27355        var maxDueTime = TimeSpan.FromDays(7);
 56
 27357        if (dueTime > maxDueTime)
 58        {
 059            dueTime = maxDueTime;
 60        }
 61
 27362        _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
 27363    }
 64
 65    /// <inheritdoc />
 66    public void Stop()
 67    {
 54668        DisposeTimer();
 54669    }
 70
 71    /// <summary>
 72    /// Disposes the timer.
 73    /// </summary>
 74    private void DisposeTimer()
 75    {
 109276        _timer?.Dispose();
 109277        _timer = null;
 109278    }
 79
 80    /// <summary>
 81    /// Called when [triggered].
 82    /// </summary>
 83    private void OnTriggered()
 84    {
 085        DisposeTimer();
 86
 087        if (Triggered is not null)
 88        {
 089            _lastStartDate = DateTime.UtcNow;
 090            Triggered(this, EventArgs.Empty);
 91        }
 092    }
 93
 94    /// <inheritdoc />
 95    public void Dispose()
 96    {
 27397        if (_disposed)
 98        {
 099            return;
 100        }
 101
 273102        DisposeTimer();
 103
 273104        _disposed = true;
 273105    }
 106}