11
11
12
12
namespace Serilog . Sinks . Async . Tests
13
13
{
14
- public class BackgroundWorkerSinkSpec : IDisposable
14
+ public class BackgroundWorkerSinkSpec
15
15
{
16
16
readonly Logger _logger ;
17
17
readonly MemorySink _innerSink ;
18
- BackgroundWorkerSink _sink ;
19
18
20
19
public BackgroundWorkerSinkSpec ( )
21
20
{
22
21
_innerSink = new MemorySink ( ) ;
23
22
_logger = new LoggerConfiguration ( ) . WriteTo . Sink ( _innerSink ) . CreateLogger ( ) ;
24
- _sink = new BackgroundWorkerSink ( _logger , 10000 , false ) ;
25
- }
26
-
27
- public void Dispose ( )
28
- {
29
- _sink . Dispose ( ) ;
30
23
}
31
24
32
25
[ Fact ]
@@ -38,118 +31,134 @@ public void WhenCtorWithNullSink_ThenThrows()
38
31
[ Fact ]
39
32
public async Task WhenEmitSingle_ThenRelaysToInnerSink ( )
40
33
{
41
- var logEvent = CreateEvent ( ) ;
42
- _sink . Emit ( logEvent ) ;
34
+ using ( var sink = this . CreateSinkWithDefaultOptions ( ) )
35
+ {
36
+ var logEvent = CreateEvent ( ) ;
37
+
38
+ sink . Emit ( logEvent ) ;
43
39
44
- await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
40
+ await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
45
41
46
- Assert . Equal ( 1 , _innerSink . Events . Count ) ;
42
+ Assert . Equal ( 1 , _innerSink . Events . Count ) ;
43
+ }
47
44
}
48
45
49
46
[ Fact ]
50
47
public async Task WhenInnerEmitThrows_ThenContinuesRelaysToInnerSink ( )
51
48
{
52
- _innerSink . ThrowAfterCollecting = true ;
53
-
54
- var events = new List < LogEvent >
49
+ using ( var sink = this . CreateSinkWithDefaultOptions ( ) )
55
50
{
56
- CreateEvent ( ) ,
57
- CreateEvent ( ) ,
58
- CreateEvent ( )
59
- } ;
60
- events . ForEach ( e => _sink . Emit ( e ) ) ;
51
+ _innerSink . ThrowAfterCollecting = true ;
61
52
62
- await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
53
+ var events = new List < LogEvent >
54
+ {
55
+ CreateEvent ( ) ,
56
+ CreateEvent ( ) ,
57
+ CreateEvent ( )
58
+ } ;
59
+ events . ForEach ( e => sink . Emit ( e ) ) ;
60
+
61
+ await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
63
62
64
- Assert . Equal ( 3 , _innerSink . Events . Count ) ;
63
+ Assert . Equal ( 3 , _innerSink . Events . Count ) ;
64
+ }
65
65
}
66
66
67
67
[ Fact ]
68
68
public async Task WhenEmitMultipleTimes_ThenRelaysToInnerSink ( )
69
69
{
70
- var events = new List < LogEvent >
70
+ using ( var sink = this . CreateSinkWithDefaultOptions ( ) )
71
71
{
72
- CreateEvent ( ) ,
73
- CreateEvent ( ) ,
74
- CreateEvent ( )
75
- } ;
76
-
77
- events . ForEach ( e => { _sink . Emit ( e ) ; } ) ;
72
+ var events = new List < LogEvent >
73
+ {
74
+ CreateEvent ( ) ,
75
+ CreateEvent ( ) ,
76
+ CreateEvent ( )
77
+ } ;
78
+ events . ForEach ( e => { sink . Emit ( e ) ; } ) ;
78
79
79
- await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
80
+ await Task . Delay ( TimeSpan . FromSeconds ( 3 ) ) ;
80
81
81
- Assert . Equal ( 3 , _innerSink . Events . Count ) ;
82
+ Assert . Equal ( 3 , _innerSink . Events . Count ) ;
83
+ }
82
84
}
83
85
84
86
[ Fact ]
85
87
public async Task WhenQueueFull_ThenDropsEvents ( )
86
88
{
87
- _sink = new BackgroundWorkerSink ( _logger , 1 , false ) ;
88
-
89
- // Cause a delay when emmitting to the inner sink, allowing us to fill the queue to capacity
90
- // after the first event is popped
91
- _innerSink . DelayEmit = TimeSpan . FromMilliseconds ( 300 ) ;
92
-
93
- var events = new List < LogEvent >
89
+ using ( var sink = new BackgroundWorkerSink ( _logger , 1 , false ) )
94
90
{
95
- CreateEvent ( ) ,
96
- CreateEvent ( ) ,
97
- CreateEvent ( ) ,
98
- CreateEvent ( ) ,
99
- CreateEvent ( )
100
- } ;
101
- events . ForEach ( e =>
102
- {
103
- var sw = Stopwatch . StartNew ( ) ;
104
- _sink . Emit ( e ) ;
105
- sw . Stop ( ) ;
91
+ // Cause a delay when emmitting to the inner sink, allowing us to fill the queue to capacity
92
+ // after the first event is popped
93
+ _innerSink . DelayEmit = TimeSpan . FromMilliseconds ( 300 ) ;
94
+
95
+ var events = new List < LogEvent >
96
+ {
97
+ CreateEvent ( ) ,
98
+ CreateEvent ( ) ,
99
+ CreateEvent ( ) ,
100
+ CreateEvent ( ) ,
101
+ CreateEvent ( )
102
+ } ;
103
+ events . ForEach ( e =>
104
+ {
105
+ var sw = Stopwatch . StartNew ( ) ;
106
+ sink . Emit ( e ) ;
107
+ sw . Stop ( ) ;
106
108
107
- Assert . True ( sw . ElapsedMilliseconds < 200 , "Should not block the caller when the queue is full" ) ;
108
- } ) ;
109
+ Assert . True ( sw . ElapsedMilliseconds < 200 , "Should not block the caller when the queue is full" ) ;
110
+ } ) ;
109
111
110
- // If we *weren't* dropped events, the delay in the inner sink would mean the 5 events would take
111
- // at least 15 seconds to process
112
- await Task . Delay ( TimeSpan . FromSeconds ( 2 ) ) ;
112
+ // If we *weren't* dropped events, the delay in the inner sink would mean the 5 events would take
113
+ // at least 15 seconds to process
114
+ await Task . Delay ( TimeSpan . FromSeconds ( 2 ) ) ;
113
115
114
- // Events should be dropped
115
- Assert . Equal ( 2 , _innerSink . Events . Count ) ;
116
+ // Events should be dropped
117
+ Assert . Equal ( 2 , _innerSink . Events . Count ) ;
118
+ }
116
119
}
117
120
118
121
[ Fact ]
119
122
public async Task WhenQueueFull_ThenBlocks ( )
120
123
{
121
- _sink = new BackgroundWorkerSink ( _logger , 1 , true ) ;
122
-
123
- // Cause a delay when emmitting to the inner sink, allowing us to fill the queue to capacity
124
- // after the first event is popped
125
- _innerSink . DelayEmit = TimeSpan . FromMilliseconds ( 300 ) ;
126
-
127
- var events = new List < LogEvent >
124
+ using ( var sink = new BackgroundWorkerSink ( _logger , 1 , true ) )
128
125
{
129
- CreateEvent ( ) ,
130
- CreateEvent ( ) ,
131
- CreateEvent ( )
132
- } ;
126
+ // Cause a delay when emmitting to the inner sink, allowing us to fill the queue to capacity
127
+ // after the first event is popped
128
+ _innerSink . DelayEmit = TimeSpan . FromMilliseconds ( 300 ) ;
133
129
134
- int i = 0 ;
135
- events . ForEach ( e =>
136
- {
137
- var sw = Stopwatch . StartNew ( ) ;
138
- _sink . Emit ( e ) ;
139
- sw . Stop ( ) ;
140
-
141
- // Emit should return immediately the first time, since the queue is not yet full. On
142
- // subsequent calls, the queue should be full, so we should be blocked
143
- if ( i > 0 )
130
+ var events = new List < LogEvent >
144
131
{
145
- Assert . True ( sw . ElapsedMilliseconds > 200 , "Should block the caller when the queue is full" ) ;
146
- }
147
- } ) ;
132
+ CreateEvent ( ) ,
133
+ CreateEvent ( ) ,
134
+ CreateEvent ( )
135
+ } ;
148
136
149
- await Task . Delay ( TimeSpan . FromSeconds ( 2 ) ) ;
137
+ int i = 0 ;
138
+ events . ForEach ( e =>
139
+ {
140
+ var sw = Stopwatch . StartNew ( ) ;
141
+ sink . Emit ( e ) ;
142
+ sw . Stop ( ) ;
143
+
144
+ // Emit should return immediately the first time, since the queue is not yet full. On
145
+ // subsequent calls, the queue should be full, so we should be blocked
146
+ if ( i > 0 )
147
+ {
148
+ Assert . True ( sw . ElapsedMilliseconds > 200 , "Should block the caller when the queue is full" ) ;
149
+ }
150
+ } ) ;
151
+
152
+ await Task . Delay ( TimeSpan . FromSeconds ( 2 ) ) ;
153
+
154
+ // No events should be dropped
155
+ Assert . Equal ( 3 , _innerSink . Events . Count ) ;
156
+ }
157
+ }
150
158
151
- // No events should be dropped
152
- Assert . Equal ( 3 , _innerSink . Events . Count ) ;
159
+ private BackgroundWorkerSink CreateSinkWithDefaultOptions ( )
160
+ {
161
+ return new BackgroundWorkerSink ( _logger , 10000 , false ) ;
153
162
}
154
163
155
164
private static LogEvent CreateEvent ( )
0 commit comments