< Summary

Information
Class: Elsa.Diagnostics.ConsoleLogs.Services.ElsaConsoleLogRecentBuffer
Assembly: Elsa.Diagnostics.ConsoleLogs
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/Services/ElsaConsoleLogRecentBuffer.cs
Line coverage
82%
Covered lines: 28
Uncovered lines: 6
Coverable lines: 34
Total lines: 69
Line coverage: 82.3%
Branch coverage
68%
Covered branches: 22
Total branches: 32
Branch coverage: 68.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Add(...)50%2283.33%
Query(...)100%44100%
Matches(...)65.38%512666.66%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Diagnostics.ConsoleLogs/Services/ElsaConsoleLogRecentBuffer.cs

#LineLine coverage
 1using ConsoleLogStreaming.Core.Options;
 2using Microsoft.Extensions.Options;
 3
 4namespace Elsa.Diagnostics.ConsoleLogs.Services;
 5
 6internal sealed class ElsaConsoleLogRecentBuffer
 7{
 98    private readonly object _lock = new();
 99    private readonly Queue<ConsoleLogLine> _lines = new();
 10    private readonly int _capacity;
 11    private readonly int _maxQuerySize;
 12
 913    public ElsaConsoleLogRecentBuffer(IOptions<ConsoleLogOptions> options)
 14    {
 915        _capacity = Math.Max(1, options.Value.RecentCapacity);
 916        _maxQuerySize = Math.Max(1, options.Value.MaxRecentQuerySize);
 917    }
 18
 19    public void Add(ConsoleLogLine line)
 20    {
 721        lock (_lock)
 22        {
 723            _lines.Enqueue(line);
 24
 725            while (_lines.Count > _capacity)
 026                _lines.Dequeue();
 727        }
 728    }
 29
 30    public IReadOnlyList<ConsoleLogLine> Query(ConsoleLogFilter filter)
 31    {
 32        ConsoleLogLine[] snapshot;
 33
 534        lock (_lock)
 535            snapshot = _lines.ToArray();
 36
 537        var limit = filter.Limit is > 0 ? Math.Min(filter.Limit.Value, _maxQuerySize) : _maxQuerySize;
 538        return snapshot
 539            .Where(line => Matches(line, filter))
 540            .TakeLast(limit)
 541            .ToArray();
 42    }
 43
 44    private static bool Matches(ConsoleLogLine line, ConsoleLogFilter filter)
 45    {
 546        if (!string.IsNullOrWhiteSpace(filter.SourceId) && !string.Equals(line.Source.Id, filter.SourceId, StringCompari
 047            return false;
 48
 549        if (filter.Stream.HasValue && line.Stream != filter.Stream.Value)
 050            return false;
 51
 552        if (!string.IsNullOrWhiteSpace(filter.Query) && !line.Text.Contains(filter.Query, StringComparison.OrdinalIgnore
 053            return false;
 54
 555        if (filter.From.HasValue && line.ReceivedAt < filter.From.Value)
 056            return false;
 57
 558        if (filter.To.HasValue && line.ReceivedAt > filter.To.Value)
 059            return false;
 60
 1961        foreach (var (key, value) in filter.Metadata)
 62        {
 563            if (!line.Metadata.TryGetValue(key, out var candidate) || !string.Equals(candidate, value, StringComparison.
 164                return false;
 65        }
 66
 467        return true;
 168    }
 69}