@@ -127,16 +127,65 @@ public void LoggerProviderBuilderConfigureResourceBuilderTests()
127
127
Assert . Contains ( provider . Resource . Attributes , value => value . Key == "key1" && ( string ) value . Value == "value1" ) ;
128
128
}
129
129
130
+ [ Fact ]
131
+ public void LoggerProviderBuilderUsingDependencyInjectionTest ( )
132
+ {
133
+ using var provider = Sdk . CreateLoggerProviderBuilder ( )
134
+ . AddProcessor < CustomProcessor > ( )
135
+ . AddProcessor < CustomProcessor > ( )
136
+ . Build ( ) as LoggerProviderSdk ;
137
+
138
+ Assert . NotNull ( provider ) ;
139
+
140
+ var processors = ( ( IServiceProvider ) provider . OwnedServiceProvider ! ) . GetServices < CustomProcessor > ( ) ;
141
+
142
+ // Note: Two "Add" calls but it is a singleton so only a single registration is produced
143
+ Assert . Single ( processors ) ;
144
+
145
+ var processor = provider . Processor as CompositeProcessor < LogRecord > ;
146
+
147
+ Assert . NotNull ( processor ) ;
148
+
149
+ // Note: Two "Add" calls due yield two processors added to provider, even though they are the same
150
+ Assert . True ( processor . Head . Value is CustomProcessor ) ;
151
+ Assert . True ( processor . Head . Next ? . Value is CustomProcessor ) ;
152
+ }
153
+
130
154
[ Fact ]
131
155
public void LoggerProviderBuilderAddProcessorTest ( )
132
156
{
133
- List < CustomProcessor > processors = new ( ) ;
157
+ List < CustomProcessor > processorsToAdd = new ( )
158
+ {
159
+ new CustomProcessor ( )
160
+ {
161
+ Name = "A" ,
162
+ } ,
163
+ new CustomProcessor ( )
164
+ {
165
+ Name = "B" ,
166
+ } ,
167
+ new CustomProcessor ( )
168
+ {
169
+ Name = "C" ,
170
+ } ,
171
+ } ;
134
172
135
- using ( var provider = Sdk . CreateLoggerProviderBuilder ( )
136
- . AddProcessor < CustomProcessor > ( )
137
- . AddProcessor ( sp => new CustomProcessor ( ) )
138
- . AddProcessor ( new CustomProcessor ( ) )
139
- . Build ( ) as LoggerProviderSdk )
173
+ var builder = Sdk . CreateLoggerProviderBuilder ( ) ;
174
+ foreach ( var processor in processorsToAdd )
175
+ {
176
+ builder . AddProcessor ( processor ) ;
177
+ }
178
+
179
+ List < CustomProcessor > expectedProcessors = new ( )
180
+ {
181
+ processorsToAdd . First ( p => p . Name == "A" ) ,
182
+ processorsToAdd . First ( p => p . Name == "B" ) ,
183
+ processorsToAdd . First ( p => p . Name == "C" ) ,
184
+ } ;
185
+
186
+ List < CustomProcessor > actualProcessors = new ( ) ;
187
+
188
+ using ( var provider = builder . Build ( ) as LoggerProviderSdk )
140
189
{
141
190
Assert . NotNull ( provider ) ;
142
191
Assert . NotNull ( provider . Processor ) ;
@@ -151,16 +200,106 @@ public void LoggerProviderBuilderAddProcessorTest()
151
200
var processor = current . Value as CustomProcessor ;
152
201
Assert . NotNull ( processor ) ;
153
202
154
- processors . Add ( processor ) ;
203
+ actualProcessors . Add ( processor ) ;
155
204
Assert . False ( processor . Disposed ) ;
156
205
157
206
current = current . Next ;
158
207
}
208
+
209
+ Assert . Equal ( expectedProcessors , actualProcessors ) ;
210
+ }
211
+
212
+ foreach ( var processor in actualProcessors )
213
+ {
214
+ Assert . True ( processor . Disposed ) ;
215
+ }
216
+ }
217
+
218
+ [ Fact ]
219
+ public void LoggerProviderBuilderAddProcessorWithWeightTest ( )
220
+ {
221
+ List < CustomProcessor > processorsToAdd = new ( )
222
+ {
223
+ new CustomProcessor ( )
224
+ {
225
+ Name = "C" ,
226
+ PipelineWeight = 0 ,
227
+ } ,
228
+ new CustomProcessor ( )
229
+ {
230
+ Name = "E" ,
231
+ PipelineWeight = 10_000 ,
232
+ } ,
233
+ new CustomProcessor ( )
234
+ {
235
+ Name = "B" ,
236
+ PipelineWeight = - 10_000 ,
237
+ } ,
238
+ new CustomProcessor ( )
239
+ {
240
+ Name = "F" ,
241
+ PipelineWeight = int . MaxValue ,
242
+ } ,
243
+ new CustomProcessor ( )
244
+ {
245
+ Name = "A" ,
246
+ PipelineWeight = int . MinValue ,
247
+ } ,
248
+ new CustomProcessor ( )
249
+ {
250
+ Name = "D" ,
251
+ PipelineWeight = 0 ,
252
+ } ,
253
+ } ;
254
+
255
+ var builder = Sdk . CreateLoggerProviderBuilder ( ) ;
256
+ foreach ( var processor in processorsToAdd )
257
+ {
258
+ builder . AddProcessor ( processor ) ;
159
259
}
160
260
161
- Assert . Equal ( 3 , processors . Count ) ;
261
+ List < CustomProcessor > expectedProcessors = new ( )
262
+ {
263
+ processorsToAdd . First ( p => p . Name == "A" ) ,
264
+ processorsToAdd . First ( p => p . Name == "B" ) ,
265
+ processorsToAdd . First ( p => p . Name == "C" ) ,
266
+ processorsToAdd . First ( p => p . Name == "D" ) ,
267
+ processorsToAdd . First ( p => p . Name == "E" ) ,
268
+ processorsToAdd . First ( p => p . Name == "F" ) ,
269
+ } ;
270
+
271
+ List < CustomProcessor > actualProcessors = new ( ) ;
272
+
273
+ using ( var provider = builder . Build ( ) as LoggerProviderSdk )
274
+ {
275
+ Assert . NotNull ( provider ) ;
276
+ Assert . NotNull ( provider . Processor ) ;
277
+
278
+ var compositeProcessor = provider . Processor as CompositeProcessor < LogRecord > ;
279
+
280
+ Assert . NotNull ( compositeProcessor ) ;
281
+
282
+ var lastWeight = int . MinValue ;
283
+ var current = compositeProcessor . Head ;
284
+ while ( current != null )
285
+ {
286
+ var processor = current . Value as CustomProcessor ;
287
+ Assert . NotNull ( processor ) ;
288
+
289
+ actualProcessors . Add ( processor ) ;
290
+ Assert . False ( processor . Disposed ) ;
291
+
292
+ Assert . True ( processor . PipelineWeight >= lastWeight ) ;
293
+
294
+ lastWeight = processor . PipelineWeight ;
295
+
296
+ current = current . Next ;
297
+ }
298
+
299
+ Assert . Equal ( expectedProcessors , actualProcessors ) ;
300
+ }
162
301
163
- foreach ( var processor in processors )
302
+ foreach ( var processor in actualProcessors )
164
303
{
165
304
Assert . True ( processor . Disposed ) ;
166
305
}
@@ -187,6 +326,7 @@ public void Dispose()
187
326
188
327
private sealed class CustomProcessor : BaseProcessor < LogRecord >
189
328
{
329
+ public string ? Name ;
190
330
public bool Disposed ;
191
331
192
332
protected override void Dispose ( bool disposing )
0 commit comments