Skip to content

Commit

Permalink
chore: Share logger implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
HofmeisterAn committed Sep 18, 2024
1 parent a2151a7 commit 630a073
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 72 deletions.
2 changes: 1 addition & 1 deletion src/Testcontainers.Xunit/ContainerFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ public class ContainerFixture<TBuilderEntity, TContainerEntity>(IMessageSink mes
/// </summary>
protected IMessageSink MessageSink { get; } = messageSink;

protected override ILogger Logger { get; } = new MessageSinkLogger(messageSink);
protected override ILogger Logger { get; } = new XunitLoggerProvider(messageSink).CreateLogger("testcontainers.org");
}
2 changes: 1 addition & 1 deletion src/Testcontainers.Xunit/ContainerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public abstract class ContainerTest<TBuilderEntity, TContainerEntity>(ITestOutpu
/// </summary>
protected ITestOutputHelper TestOutputHelper { get; } = testOutputHelper;

protected override ILogger Logger { get; } = new TestOutputLogger(testOutputHelper);
protected override ILogger Logger { get; } = new XunitLoggerProvider(testOutputHelper).CreateLogger("testcontainers.org");

protected override TBuilderEntity Configure(TBuilderEntity builder) => configure != null ? configure(builder) : builder;
}
20 changes: 0 additions & 20 deletions src/Testcontainers.Xunit/Logger.cs

This file was deleted.

21 changes: 0 additions & 21 deletions src/Testcontainers.Xunit/MessageSinkLogger.cs

This file was deleted.

8 changes: 0 additions & 8 deletions src/Testcontainers.Xunit/NullScope.cs

This file was deleted.

21 changes: 0 additions & 21 deletions src/Testcontainers.Xunit/TestOutputLogger.cs

This file was deleted.

95 changes: 95 additions & 0 deletions src/Testcontainers.Xunit/XunitLoggerProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
namespace Testcontainers.Xunit;

internal sealed class XunitLoggerProvider : ILoggerProvider
{
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();

private readonly ITestOutputHelper _testOutputHelper;

public XunitLoggerProvider(IMessageSink messageSink)
{
_testOutputHelper = new MessageSinkTestOutputHelper(messageSink);
}

public XunitLoggerProvider(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
}

public void Dispose()
{
}

public ILogger CreateLogger(string categoryName)
{
return new XunitLogger(_stopwatch, _testOutputHelper, categoryName);
}

private sealed class MessageSinkTestOutputHelper : ITestOutputHelper
{
private readonly IMessageSink _messageSink;

#if XUNIT_V3
public string Output => throw new NotImplementedException();
#endif

public MessageSinkTestOutputHelper(IMessageSink messageSink)
{
_messageSink = messageSink;
}

public void WriteLine(string message)
{
_messageSink.OnMessage(new DiagnosticMessage(message));
}

public void WriteLine(string format, params object[] args)
{
_messageSink.OnMessage(new DiagnosticMessage(format, args));
}
}

private sealed class XunitLogger : ILogger
{
private readonly Stopwatch _stopwatch;

private readonly ITestOutputHelper _testOutputHelper;

private readonly string _categoryName;

public XunitLogger(Stopwatch stopwatch, ITestOutputHelper testOutputHelper, string categoryName)
{
_stopwatch = stopwatch;
_testOutputHelper = testOutputHelper;
_categoryName = categoryName;
}

public IDisposable BeginScope<TState>(TState state)
{
return Disposable.Instance;
}

public bool IsEnabled(LogLevel logLevel)
{
return logLevel != LogLevel.None;
}

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
_testOutputHelper.WriteLine("[{0} {1:hh\\:mm\\:ss\\.ff}] {2}", _categoryName, _stopwatch.Elapsed, formatter.Invoke(state, exception));
}

private sealed class Disposable : IDisposable
{
private Disposable()
{
}

public static IDisposable Instance { get; } = new Disposable();

public void Dispose()
{
}
}
}
}

0 comments on commit 630a073

Please sign in to comment.