< Summary

Information
Class: LOCKnet.Core.Security.ActivityMonitor
Assembly: LOCKnet.Core
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/Security/ActivityMonitor.cs
Line coverage
100%
Covered lines: 48
Uncovered lines: 0
Coverable lines: 48
Total lines: 94
Line coverage: 100%
Branch coverage
94%
Covered branches: 17
Total branches: 18
Branch coverage: 94.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Timeout()100%11100%
set_Timeout(...)75%4485.71%
get_IsRunning()100%11100%
get_LastActivity()100%11100%
Start()100%22100%
Stop()100%22100%
RecordActivity()100%22100%
ResetTimer()50%22100%
OnTimeout(...)100%22100%
Dispose()100%44100%

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Core/Security/ActivityMonitor.cs

#LineLine coverage
 1namespace LOCKnet.Core.Security;
 2
 3/// <summary>
 4/// Implementierung von <see cref="IActivityMonitor"/>.
 5/// Verwendet einen <see cref="System.Threading.Timer"/> — kein UI-Thread nötig.
 6/// Bei Timeout wird <see cref="ISessionManager.Lock"/> aufgerufen.
 7/// </summary>
 8public sealed class ActivityMonitor : IActivityMonitor
 9{
 10  private readonly ISessionManager _session;
 11  private System.Threading.Timer? _timer;
 3212  private TimeSpan _timeout = TimeSpan.FromSeconds(60);
 13  private volatile bool _running;
 14  private bool _disposed;
 15
 16  /// <summary>
 17  /// Initialisiert eine neue Instanz von <see cref="ActivityMonitor"/>.
 18  /// </summary>
 19  /// <param name="session">Die Sitzung, die bei Timeout gesperrt wird.</param>
 3220  public ActivityMonitor(ISessionManager session)
 3221  {
 3222    ArgumentNullException.ThrowIfNull(session);
 3223    _session = session;
 3224  }
 25
 26  /// <inheritdoc/>
 27  public TimeSpan Timeout
 28  {
 329    get => _timeout;
 30    set
 2931    {
 2932      if (value <= TimeSpan.Zero)
 233        throw new ArgumentOutOfRangeException(nameof(value), "Timeout muss positiv sein.");
 2734      _timeout = value;
 2735      if (_running)
 136        ResetTimer();
 2737    }
 38  }
 39
 40  /// <inheritdoc/>
 1141  public bool IsRunning => _running;
 42
 43  /// <inheritdoc/>
 5144  public DateTimeOffset LastActivity { get; private set; } = DateTimeOffset.UtcNow;
 45
 46  /// <inheritdoc/>
 47  public void Start()
 1448  {
 1449    ObjectDisposedException.ThrowIf(_disposed, this);
 1450    if (_running) return;
 51
 1252    LastActivity = DateTimeOffset.UtcNow;
 1253    _running = true;
 1254    _timer = new System.Threading.Timer(OnTimeout, null, _timeout, System.Threading.Timeout.InfiniteTimeSpan);
 1355  }
 56
 57  /// <inheritdoc/>
 58  public void Stop()
 3559  {
 3560    _running = false;
 3561    _timer?.Change(System.Threading.Timeout.InfiniteTimeSpan, System.Threading.Timeout.InfiniteTimeSpan);
 3562  }
 63
 64  /// <inheritdoc/>
 65  public void RecordActivity()
 566  {
 567    if (_running)
 268    {
 269      LastActivity = DateTimeOffset.UtcNow;
 270      ResetTimer();
 271    }
 572  }
 73
 74  private void ResetTimer()
 375  {
 376    _timer?.Change(_timeout, System.Threading.Timeout.InfiniteTimeSpan);
 377  }
 78
 79  private void OnTimeout(object? state)
 180  {
 181    if (!_running) return;
 182    _session.Lock();
 183  }
 84
 85  /// <inheritdoc/>
 86  public void Dispose()
 1487  {
 1588    if (_disposed) return;
 1389    _disposed = true;
 1390    Stop();
 1391    _timer?.Dispose();
 1392    _timer = null;
 1493  }
 94}