< 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: 107
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%4.1481.81%
Stop()100%11100%
DisposeTimer()100%22100%
OnTriggered()0%620%
Dispose()50%2.03280%

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>
 12    public sealed class IntervalTrigger : ITaskTrigger, IDisposable
 13    {
 14        private readonly TimeSpan _interval;
 15        private DateTime _lastStartDate;
 16        private Timer? _timer;
 17        private bool _disposed = false;
 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        {
 28626            _interval = interval;
 27            TaskOptions = taskOptions;
 28628        }
 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        {
 28639            DisposeTimer();
 40
 28641            DateTime now = DateTime.UtcNow;
 42            DateTime triggerDate;
 43
 28644            if (lastResult is null)
 45            {
 46                // Task has never been completed before
 28647                triggerDate = now.AddHours(1);
 48            }
 49            else
 50            {
 051                triggerDate = new[] { lastResult.EndTimeUtc, _lastStartDate, now.AddMinutes(1) }.Max().Add(_interval);
 52            }
 53
 28654            var dueTime = triggerDate - now;
 28655            var maxDueTime = TimeSpan.FromDays(7);
 56
 28657            if (dueTime > maxDueTime)
 58            {
 059                dueTime = maxDueTime;
 60            }
 61
 28662            _timer = new Timer(_ => OnTriggered(), null, dueTime, TimeSpan.FromMilliseconds(-1));
 28663        }
 64
 65        /// <inheritdoc />
 66        public void Stop()
 67        {
 57268            DisposeTimer();
 57269        }
 70
 71        /// <summary>
 72        /// Disposes the timer.
 73        /// </summary>
 74        private void DisposeTimer()
 75        {
 114476            _timer?.Dispose();
 114477            _timer = null;
 114478        }
 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        {
 28697            if (_disposed)
 98            {
 099                return;
 100            }
 101
 286102            DisposeTimer();
 103
 286104            _disposed = true;
 286105        }
 106    }
 107}