Skip to content

Commit d6a3fe7

Browse files
authored
Add TimeProvider support (#912)
Add support for overriding the time with `TimeProvider` when targeting `net8.0`.
1 parent ddb9211 commit d6a3fe7

File tree

7 files changed

+68
-1
lines changed

7 files changed

+68
-1
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#nullable enable
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#nullable enable
2+
MartinCostello.Logging.XUnit.XUnitLoggerOptions.TimeProvider.get -> System.TimeProvider!
3+
MartinCostello.Logging.XUnit.XUnitLoggerOptions.TimeProvider.set -> void
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#nullable enable
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#nullable enable
2+
MartinCostello.Logging.XUnit.XUnitLoggerOptions.TimeProvider.get -> System.TimeProvider!
3+
MartinCostello.Logging.XUnit.XUnitLoggerOptions.TimeProvider.set -> void

src/Shared/XUnitLogger.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ public partial class XUnitLogger : ILogger
3939
/// </summary>
4040
private readonly string _timestampFormat;
4141

42+
#if NET8_0_OR_GREATER
43+
44+
/// <summary>
45+
/// The time provider used in log messages.
46+
/// </summary>
47+
private readonly TimeProvider _timeProvider;
48+
49+
#endif
50+
4251
/// <summary>
4352
/// Gets or sets the filter to use.
4453
/// </summary>
@@ -57,6 +66,12 @@ private XUnitLogger(string name, XUnitLoggerOptions? options)
5766
_messageSinkMessageFactory = options?.MessageSinkMessageFactory ?? (static (message) => new DiagnosticMessage(message));
5867
_timestampFormat = options?.TimestampFormat ?? "u";
5968
IncludeScopes = options?.IncludeScopes ?? false;
69+
#if NET8_0_OR_GREATER
70+
_timeProvider = options?.TimeProvider ?? TimeProvider.System;
71+
Clock = () => _timeProvider.GetLocalNow();
72+
#else
73+
Clock = static () => DateTimeOffset.Now;
74+
#endif
6075
}
6176

6277
/// <summary>
@@ -84,7 +99,7 @@ private XUnitLogger(string name, XUnitLoggerOptions? options)
8499
/// <summary>
85100
/// Gets or sets a delegate representing the system clock.
86101
/// </summary>
87-
internal Func<DateTimeOffset> Clock { get; set; } = static () => DateTimeOffset.Now;
102+
internal Func<DateTimeOffset> Clock { get; set; }
88103

89104
/// <inheritdoc />
90105
public IDisposable? BeginScope<TState>(TState state)

src/Shared/XUnitLoggerOptions.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,13 @@ public XUnitLoggerOptions()
3838
/// </summary>
3939
[StringSyntax(StringSyntaxAttribute.DateTimeFormat)]
4040
public string? TimestampFormat { get; set; }
41+
42+
#if NET8_0_OR_GREATER
43+
44+
/// <summary>
45+
/// Gets or sets the time provider used in log messages. Defaults to <see cref="TimeProvider.System"/>.
46+
/// </summary>
47+
public TimeProvider TimeProvider { get; set; } = TimeProvider.System;
48+
49+
#endif
4150
}

tests/Shared/XUnitLoggerTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,41 @@ public static void XUnitLogger_Log_Logs_Message_If_Scopes_Included_And_There_Is_
659659
outputHelper.Received(1).WriteLine(expected);
660660
}
661661

662+
#if NET8_0_OR_GREATER
663+
664+
[Fact]
665+
public static void XUnitLogger_Log_Logs_Message_With_TimeProvider()
666+
{
667+
// Arrange
668+
var outputHelper = Substitute.For<ITestOutputHelper>();
669+
string name = "MyName";
670+
671+
var timeProvider = Substitute.For<TimeProvider>();
672+
timeProvider.LocalTimeZone.Returns(TimeZoneInfo.FindSystemTimeZoneById("Europe/London"));
673+
timeProvider.GetUtcNow().Returns(new DateTimeOffset(2019, 05, 12, 13, 47, 41, 123, 456, TimeSpan.Zero));
674+
675+
var options = new XUnitLoggerOptions()
676+
{
677+
Filter = FilterTrue,
678+
TimeProvider = timeProvider,
679+
};
680+
681+
var logger = new XUnitLogger(name, outputHelper, options);
682+
683+
string expected = string.Join(
684+
Environment.NewLine,
685+
"[2019-05-12 13:47:41Z] info: MyName[85]",
686+
" Message|True|False");
687+
688+
// Act
689+
logger.Log(LogLevel.Information, new EventId(85), "Martin", null, Formatter);
690+
691+
// Assert
692+
outputHelper.Received(1).WriteLine(expected);
693+
}
694+
695+
#endif
696+
662697
private static DateTimeOffset StaticClock() => new(2018, 08, 19, 17, 12, 16, TimeSpan.FromHours(1));
663698

664699
private static DiagnosticMessage DiagnosticMessageFactory(string message) => new(message);

0 commit comments

Comments
 (0)