@@ -9,6 +9,9 @@ namespace Checkout
99 public sealed class LogProviderTests : IDisposable
1010 {
1111 private readonly ILoggerFactory _loggerFactory ;
12+
13+ private static readonly object RandLock = new object ( ) ;
14+ private static readonly Random Random = new Random ( ) ;
1215
1316 public LogProviderTests ( )
1417 {
@@ -25,14 +28,20 @@ public void ShouldGetLoggerReturnsValidLogger()
2528 public async Task ShouldCreateASingleLoggerInstanceForMultipleConcurrentRequests ( )
2629 {
2730 LogProvider . SetLogFactory ( _loggerFactory ) ;
28- Type [ ] loggerTypes = new [ ] { typeof ( LogProviderTests ) , typeof ( AnotherTestClass ) , typeof ( NoInitializedType ) } ;
31+ Type [ ] loggerTypes = { typeof ( LogProviderTests ) , typeof ( AnotherTestClass ) , typeof ( NoInitializedType ) } ;
32+
2933 Task < ILogger > [ ] createLoggerTasks = Enumerable . Range ( 1 , 50 )
3034 . Select ( async index =>
3135 {
32- int randomDelayMs = new Random ( ) . Next ( 1 , 5 ) ;
33- await Task . Delay ( randomDelayMs ) ;
36+ int delay ;
37+ lock ( RandLock )
38+ {
39+ delay = Random . Next ( 1 , 5 ) ;
40+ }
41+ await Task . Delay ( delay ) ;
3442 return await Task . FromResult ( LogProvider . GetLogger ( loggerTypes [ index % loggerTypes . Length ] ) ) ;
3543 } ) . ToArray ( ) ;
44+
3645 ILogger [ ] loggers = await Task . WhenAll ( createLoggerTasks ) ;
3746 Assert . Equal ( loggerTypes . Length , loggers . Distinct ( ) . Count ( ) ) ;
3847 }
@@ -54,6 +63,66 @@ public void ShouldNotThrowExceptionWhenSetLogFactoryWithNullParameter()
5463 {
5564 Assert . Null ( Record . Exception ( ( ) => LogProvider . SetLogFactory ( null ) ) ) ;
5665 }
66+
67+ [ Fact ]
68+ public void ShouldReplaceLoggerFactoryCorrectly ( )
69+ {
70+ var loggerBefore = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
71+
72+ var newFactory = LoggerFactory . Create ( builder => builder . AddFilter ( _ => false ) ) ;
73+ LogProvider . SetLogFactory ( newFactory ) ;
74+
75+ var loggerAfter = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
76+
77+ Assert . NotSame ( loggerBefore , loggerAfter ) ;
78+ }
79+
80+ [ Fact ]
81+ public void ShouldClearLoggersWhenFactoryChanges ( )
82+ {
83+ LogProvider . SetLogFactory ( _loggerFactory ) ;
84+ var logger1 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
85+
86+ var newFactory = new LoggerFactory ( ) ;
87+ LogProvider . SetLogFactory ( newFactory ) ;
88+ var logger2 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
89+
90+ Assert . NotSame ( logger1 , logger2 ) ;
91+ }
92+
93+ [ Fact ]
94+ public void ShouldReturnSameLoggerOnMultipleCalls ( )
95+ {
96+ LogProvider . SetLogFactory ( _loggerFactory ) ;
97+
98+ var logger1 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
99+ var logger2 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
100+
101+ Assert . Same ( logger1 , logger2 ) ;
102+ }
103+
104+ [ Fact ]
105+ public async Task ShouldNotThrowWhenCallingSetLogFactoryConcurrently ( )
106+ {
107+ var tasks = Enumerable . Range ( 0 , 10 ) . Select ( _ => Task . Run ( ( ) =>
108+ {
109+ LogProvider . SetLogFactory ( new LoggerFactory ( ) ) ;
110+ } ) ) ;
111+
112+ var exception = await Record . ExceptionAsync ( async ( ) => await Task . WhenAll ( tasks ) ) ;
113+
114+ Assert . Null ( exception ) ;
115+ }
116+
117+ [ Fact ]
118+ public void ShouldAllowMultipleNullLoggerFactoryAssignments ( )
119+ {
120+ LogProvider . SetLogFactory ( null ) ;
121+ LogProvider . SetLogFactory ( null ) ;
122+ var logger = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
123+
124+ Assert . NotNull ( logger ) ;
125+ }
57126
58127 public void Dispose ( )
59128 {
0 commit comments