66
77namespace Checkout
88{
9+ [ Collection ( "NonParallel" ) ]
910 public sealed class LogProviderTests : IDisposable
1011 {
1112 private readonly ILoggerFactory _loggerFactory ;
13+
14+ private static readonly object RandLock = new object ( ) ;
15+ private static readonly Random Random = new Random ( ) ;
1216
1317 public LogProviderTests ( )
1418 {
@@ -25,14 +29,20 @@ public void ShouldGetLoggerReturnsValidLogger()
2529 public async Task ShouldCreateASingleLoggerInstanceForMultipleConcurrentRequests ( )
2630 {
2731 LogProvider . SetLogFactory ( _loggerFactory ) ;
28- Type [ ] loggerTypes = new [ ] { typeof ( LogProviderTests ) , typeof ( AnotherTestClass ) , typeof ( NoInitializedType ) } ;
32+ Type [ ] loggerTypes = { typeof ( LogProviderTests ) , typeof ( AnotherTestClass ) , typeof ( NoInitializedType ) } ;
33+
2934 Task < ILogger > [ ] createLoggerTasks = Enumerable . Range ( 1 , 50 )
3035 . Select ( async index =>
3136 {
32- int randomDelayMs = new Random ( ) . Next ( 1 , 5 ) ;
33- await Task . Delay ( randomDelayMs ) ;
37+ int delay ;
38+ lock ( RandLock )
39+ {
40+ delay = Random . Next ( 1 , 5 ) ;
41+ }
42+ await Task . Delay ( delay ) ;
3443 return await Task . FromResult ( LogProvider . GetLogger ( loggerTypes [ index % loggerTypes . Length ] ) ) ;
3544 } ) . ToArray ( ) ;
45+
3646 ILogger [ ] loggers = await Task . WhenAll ( createLoggerTasks ) ;
3747 Assert . Equal ( loggerTypes . Length , loggers . Distinct ( ) . Count ( ) ) ;
3848 }
@@ -54,6 +64,66 @@ public void ShouldNotThrowExceptionWhenSetLogFactoryWithNullParameter()
5464 {
5565 Assert . Null ( Record . Exception ( ( ) => LogProvider . SetLogFactory ( null ) ) ) ;
5666 }
67+
68+ [ Fact ]
69+ public void ShouldReplaceLoggerFactoryCorrectly ( )
70+ {
71+ var loggerBefore = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
72+
73+ var newFactory = LoggerFactory . Create ( builder => builder . AddFilter ( _ => false ) ) ;
74+ LogProvider . SetLogFactory ( newFactory ) ;
75+
76+ var loggerAfter = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
77+
78+ Assert . NotSame ( loggerBefore , loggerAfter ) ;
79+ }
80+
81+ [ Fact ]
82+ public void ShouldClearLoggersWhenFactoryChanges ( )
83+ {
84+ LogProvider . SetLogFactory ( _loggerFactory ) ;
85+ var logger1 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
86+
87+ var newFactory = new LoggerFactory ( ) ;
88+ LogProvider . SetLogFactory ( newFactory ) ;
89+ var logger2 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
90+
91+ Assert . NotSame ( logger1 , logger2 ) ;
92+ }
93+
94+ [ Fact ]
95+ public void ShouldReturnSameLoggerOnMultipleCalls ( )
96+ {
97+ LogProvider . SetLogFactory ( _loggerFactory ) ;
98+
99+ var logger1 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
100+ var logger2 = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
101+
102+ Assert . Same ( logger1 , logger2 ) ;
103+ }
104+
105+ [ Fact ]
106+ public async Task ShouldNotThrowWhenCallingSetLogFactoryConcurrently ( )
107+ {
108+ var tasks = Enumerable . Range ( 0 , 10 ) . Select ( _ => Task . Run ( ( ) =>
109+ {
110+ LogProvider . SetLogFactory ( new LoggerFactory ( ) ) ;
111+ } ) ) ;
112+
113+ var exception = await Record . ExceptionAsync ( async ( ) => await Task . WhenAll ( tasks ) ) ;
114+
115+ Assert . Null ( exception ) ;
116+ }
117+
118+ [ Fact ]
119+ public void ShouldAllowMultipleNullLoggerFactoryAssignments ( )
120+ {
121+ LogProvider . SetLogFactory ( null ) ;
122+ LogProvider . SetLogFactory ( null ) ;
123+ var logger = LogProvider . GetLogger ( typeof ( LogProviderTests ) ) ;
124+
125+ Assert . NotNull ( logger ) ;
126+ }
57127
58128 public void Dispose ( )
59129 {
0 commit comments