elsa-core/test/unit/Elsa.Diagnostics.ConsoleLogs.UnitTests/Redaction/ConsoleLogProviderRedactionTests.cs
Sipke Schoorstra 8e301d4e1e
[codex] Scope console logs to workflow instances (#7535)
* Avoid null endpoint DTO metadata in tests

* Enforce console logs hub read permission

* Remove unused console logs hub import

* Support mapped endpoint metadata in auth tests

* Reduce console log capture throughput impact

* Address Copilot console logs review

* Refactor task scheduling to support tenant-level background work and enhance logging functionality.

* Introduce ConsoleStreamHook for stdout/stderr tee and enhance logging validation. Adjust test cases and startup warnings for distributed lock provider usage.

* Refactor console logging pipeline with capture optimization and new ConsoleLogsHost; update tests accordingly.

* Add Ansi SGR parser for console logs and associated unit tests

* Remove ANSI color renderings and parsers; integrate ConsoleLogScopeAccessor for improved logging context with workflow instance ID support.

* Address console logs code quality feedback

* Address PR review feedback

* Preserve console logs extension points

* Stabilize console logs host lifecycle

* Address final automated review comments

* Tighten console log capture shutdown

* Address console log review feedback

* Address follow-up review feedback

* Cover final review feedback

* Avoid recursive console provider initialization

* Guard console host lease shutdown

* Preserve console log scope and provider lifetime

* Correlate console log scope fallback

* Tighten console scope correlation

* Expose host services during provider construction

* Redact ANSI-normalized console lines
2026-05-25 11:49:51 +02:00

82 lines
2.8 KiB
C#

using Elsa.Diagnostics.ConsoleLogs.Contracts;
using Elsa.Diagnostics.ConsoleLogs.Services;
namespace Elsa.Diagnostics.ConsoleLogs.UnitTests.Redaction;
[Collection(ConsoleHostStateCollection.Name)]
public class ConsoleLogProviderRedactionTests : IAsyncLifetime
{
public async Task InitializeAsync()
{
await ConsoleLogsHost.ShutdownAsync();
ConsoleStreamHook.Uninstall();
}
public async Task DisposeAsync()
{
await ConsoleLogsHost.ShutdownAsync();
ConsoleStreamHook.Uninstall();
}
[Fact]
public async Task CaptureTee_PublishesRedactedLinesToProvider()
{
var originalOut = Console.Out;
var provider = new CapturingProvider();
var options = Microsoft.Extensions.Options.Options.Create(new ConsoleLogsOptions());
try
{
ConsoleStreamHook.Uninstall();
Console.SetOut(TextWriter.Null);
await using var capture = new ConsoleCaptureTee(
provider,
new ConsoleLogSourceRegistry(options),
new ConsoleLogRedactor(options),
new ConsoleLineFormatter(options),
new ConsoleLogScopeAccessor(),
options);
Console.WriteLine(string.Concat("pass", "word", "=", "sample-value"));
await WaitForLineAsync(provider);
Assert.Equal("[Redacted]", Assert.Single(provider.Lines).Text);
}
finally
{
ConsoleStreamHook.Uninstall();
Console.SetOut(originalOut);
}
}
private static async Task WaitForLineAsync(CapturingProvider provider)
{
var deadline = DateTimeOffset.UtcNow.AddSeconds(2);
while (provider.Lines.Count == 0 && DateTimeOffset.UtcNow < deadline)
await Task.Delay(10);
}
private sealed class CapturingProvider : IConsoleLogProvider
{
public List<ConsoleLogLine> Lines { get; } = [];
public ValueTask PublishAsync(ConsoleLogLine line, CancellationToken cancellationToken = default)
{
lock (Lines)
Lines.Add(line);
return ValueTask.CompletedTask;
}
public ValueTask<RecentConsoleLogsResult> GetRecentAsync(ConsoleLogFilter filter, CancellationToken cancellationToken = default) => ValueTask.FromResult(new RecentConsoleLogsResult(Lines));
public async IAsyncEnumerable<ConsoleLogStreamItem> SubscribeAsync(ConsoleLogFilter filter, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
await Task.CompletedTask;
yield break;
}
public ValueTask<IReadOnlyCollection<ConsoleLogSource>> ListSourcesAsync(CancellationToken cancellationToken = default) => ValueTask.FromResult<IReadOnlyCollection<ConsoleLogSource>>([]);
}
}