* 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
82 lines
2.8 KiB
C#
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>>([]);
|
|
}
|
|
}
|