< Summary

Information
Class: Elsa.Resilience.Endpoints.SimulateResponse.SimulateResponseSessionStore
Assembly: Elsa.Resilience
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Resilience/Endpoints/SimulateResponse/SimulateResponseSessionStore.cs
Line coverage
95%
Covered lines: 22
Uncovered lines: 1
Coverable lines: 23
Total lines: 47
Line coverage: 95.6%
Branch coverage
92%
Covered branches: 13
Total branches: 14
Branch coverage: 92.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
TryGetNextIndex(...)90%101093.33%
PruneExpired(...)100%44100%
get_NextIndex()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Resilience/Endpoints/SimulateResponse/SimulateResponseSessionStore.cs

#LineLine coverage
 1using Elsa.Resilience.Options;
 2using Microsoft.Extensions.Options;
 3
 4namespace Elsa.Resilience.Endpoints.SimulateResponse;
 5
 146public class SimulateResponseSessionStore(IOptions<SimulateResponseOptions> options, TimeProvider timeProvider)
 7{
 148    private readonly Dictionary<string, SessionState> _sessions = new(StringComparer.Ordinal);
 149    private readonly object _lock = new();
 1410    private readonly SimulateResponseOptions _options = options.Value;
 11
 12    public bool TryGetNextIndex(string sessionId, int statusCodeCount, out int nextIndex)
 13    {
 1114        if (statusCodeCount <= 0)
 015            throw new ArgumentOutOfRangeException(nameof(statusCodeCount), "Status code count must be greater than zero.
 16
 1117        var now = timeProvider.GetUtcNow();
 1118        var expiresAt = now.Add(_options.SessionSlidingExpiration);
 19
 1120        lock (_lock)
 21        {
 1122            PruneExpired(now);
 23
 1124            nextIndex = _sessions.TryGetValue(sessionId, out var state) ? Math.Min(state.NextIndex, statusCodeCount - 1)
 25
 1126            if (nextIndex + 1 >= statusCodeCount)
 27            {
 328                _sessions.Remove(sessionId);
 329                return true;
 30            }
 31
 832            if (!_sessions.ContainsKey(sessionId) && _sessions.Count >= _options.SessionCapacity)
 133                return false;
 34
 735            _sessions[sessionId] = new SessionState(nextIndex + 1, expiresAt);
 736            return true;
 37        }
 1138    }
 39
 40    private void PruneExpired(DateTimeOffset now)
 41    {
 3742        foreach (var session in _sessions.Where(x => x.Value.ExpiresAt <= now).Select(x => x.Key).ToList())
 243            _sessions.Remove(session);
 1144    }
 45
 1846    private sealed record SessionState(int NextIndex, DateTimeOffset ExpiresAt);
 47}