Skip to content

Commit edcd424

Browse files
author
evgenyfedorov2
committed
More tests
1 parent f6a2dec commit edcd424

File tree

10 files changed

+505
-24
lines changed

10 files changed

+505
-24
lines changed

src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Buffering/IncomingRequestLogBufferHolder.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
namespace Microsoft.AspNetCore.Diagnostics.Buffering;
88

9-
internal sealed class IncomingRequestLogBufferHolder
9+
internal sealed class IncomingRequestLogBufferHolder : IDisposable
1010
{
1111
private readonly ConcurrentDictionary<string, IncomingRequestLogBuffer> _buffers = new();
12+
private bool _disposed;
1213

1314
public IncomingRequestLogBuffer GetOrAdd(string category, Func<string, IncomingRequestLogBuffer> valueFactory) =>
1415
_buffers.GetOrAdd(category, valueFactory);
@@ -20,5 +21,20 @@ public void Flush()
2021
buffer.Flush();
2122
}
2223
}
24+
25+
public void Dispose()
26+
{
27+
if (_disposed)
28+
{
29+
return;
30+
}
31+
32+
_disposed = true;
33+
34+
foreach (IncomingRequestLogBuffer buffer in _buffers.Values)
35+
{
36+
buffer.Dispose();
37+
}
38+
}
2339
}
2440
#endif

src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Buffering/PerRequestLogBufferManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ public override bool TryEnqueue<TState>(IBufferedLogger bufferedLogger, in LogEn
4444
}
4545

4646
string category = logEntry.Category;
47-
IncomingRequestLogBufferHolder? bufferHolder = httpContext.RequestServices.GetService<IncomingRequestLogBufferHolder>();
47+
IncomingRequestLogBufferHolder? bufferHolder =
48+
httpContext.RequestServices.GetService<IncomingRequestLogBufferHolder>();
4849
IncomingRequestLogBuffer? buffer = bufferHolder?.GetOrAdd(category, _ =>
4950
new IncomingRequestLogBuffer(bufferedLogger, category, _ruleSelector, _options));
5051

src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Buffering/PerRequestLogBufferingConfigureOptions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public PerRequestLogBufferingConfigureOptions(IConfiguration configuration)
1919

2020
public void Configure(PerRequestLogBufferingOptions options)
2121
{
22-
if (_configuration == null)
22+
if (_configuration is null)
2323
{
2424
return;
2525
}
@@ -36,6 +36,10 @@ public void Configure(PerRequestLogBufferingOptions options)
3636
return;
3737
}
3838

39+
options.MaxLogRecordSizeInBytes = parsedOptions.MaxLogRecordSizeInBytes;
40+
options.MaxPerRequestBufferSizeInBytes = parsedOptions.MaxPerRequestBufferSizeInBytes;
41+
options.AutoFlushDuration = parsedOptions.AutoFlushDuration;
42+
3943
foreach (LogBufferingFilterRule rule in parsedOptions.Rules)
4044
{
4145
options.Rules.Add(rule);

src/Libraries/Microsoft.Extensions.Telemetry/Buffering/GlobalLogBufferingConfigureOptions.cs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,17 @@ public void Configure(GlobalLogBufferingOptions options)
3030
return;
3131
}
3232

33-
var parsedOptions = section.Get<GlobalLogBufferingOptions>();
33+
GlobalLogBufferingOptions? parsedOptions = section.Get<GlobalLogBufferingOptions>();
3434
if (parsedOptions is null)
3535
{
3636
return;
3737
}
3838

39-
if (parsedOptions.MaxLogRecordSizeInBytes > 0)
40-
{
41-
options.MaxLogRecordSizeInBytes = parsedOptions.MaxLogRecordSizeInBytes;
42-
}
43-
44-
if (parsedOptions.MaxBufferSizeInBytes > 0)
45-
{
46-
options.MaxBufferSizeInBytes = parsedOptions.MaxBufferSizeInBytes;
47-
}
39+
options.MaxLogRecordSizeInBytes = parsedOptions.MaxLogRecordSizeInBytes;
40+
options.MaxBufferSizeInBytes = parsedOptions.MaxBufferSizeInBytes;
41+
options.AutoFlushDuration = parsedOptions.AutoFlushDuration;
4842

49-
foreach (var rule in parsedOptions.Rules)
43+
foreach (LogBufferingFilterRule rule in parsedOptions.Rules)
5044
{
5145
options.Rules.Add(rule);
5246
}

test/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware.Tests/Buffering/PerIncomingRequestLoggingBuilderExtensionsTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,27 @@ public void WhenIConfigurationProvided_RegistersInDI()
6060
Assert.NotNull(options.CurrentValue);
6161
Assert.Equivalent(expectedData, options.CurrentValue.Rules);
6262
}
63+
64+
[Fact]
65+
public void WhenConfigurationActionProvided_RegistersInDI()
66+
{
67+
List<LogBufferingFilterRule> expectedData =
68+
[
69+
new(categoryName: "Program.MyLogger", logLevel: LogLevel.Information, eventId: 1, eventName: "number one"),
70+
new(logLevel: LogLevel.Information),
71+
];
72+
var serviceCollection = new ServiceCollection();
73+
serviceCollection.AddLogging(b => b.AddPerIncomingRequestBuffer(options =>
74+
{
75+
options.Rules.Add(new LogBufferingFilterRule(categoryName: "Program.MyLogger",
76+
logLevel: LogLevel.Information, eventId: 1, eventName: "number one"));
77+
options.Rules.Add(new LogBufferingFilterRule(logLevel: LogLevel.Information));
78+
}));
79+
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
80+
var options = serviceProvider.GetService<IOptionsMonitor<PerRequestLogBufferingOptions>>();
81+
Assert.NotNull(options);
82+
Assert.NotNull(options.CurrentValue);
83+
Assert.Equivalent(expectedData, options.CurrentValue.Rules);
84+
}
6385
}
6486
#endif
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
#if NET9_0_OR_GREATER
4+
5+
using System.Collections.Generic;
6+
using Microsoft.AspNetCore.Diagnostics.Buffering;
7+
using Microsoft.Extensions.Configuration;
8+
using Microsoft.Extensions.Logging;
9+
using Xunit;
10+
11+
namespace Microsoft.Extensions.Diagnostics.Buffering.Test;
12+
13+
public class PerRequestLogBufferingOptionsConfigureOptionsTests
14+
{
15+
[Fact]
16+
public void Configure_WhenConfigurationIsNull_DoesNotModifyOptions()
17+
{
18+
// Arrange
19+
var options = new PerRequestLogBufferingOptions();
20+
var configureOptions = new PerRequestLogBufferingConfigureOptions(null!);
21+
22+
// Act
23+
configureOptions.Configure(options);
24+
25+
// Assert
26+
Assert.Equivalent(new PerRequestLogBufferingOptions(), options);
27+
}
28+
29+
[Fact]
30+
public void Configure_WhenSectionDoesNotExist_DoesNotModifyOptions()
31+
{
32+
// Arrange
33+
var options = new PerRequestLogBufferingOptions();
34+
IConfigurationRoot configuration = new ConfigurationBuilder().Build();
35+
var configureOptions = new PerRequestLogBufferingConfigureOptions(configuration);
36+
37+
// Act
38+
configureOptions.Configure(options);
39+
40+
// Assert
41+
Assert.Equivalent(new PerRequestLogBufferingOptions(), options);
42+
}
43+
44+
[Fact]
45+
public void Configure_WhenSectionContainsInvalidPropertyNames_DoesNotModifyOptions()
46+
{
47+
// Arrange
48+
var configValues = new Dictionary<string, string?>
49+
{
50+
["GlobalLogBuffering"] = "1",
51+
};
52+
53+
IConfigurationRoot configuration = new ConfigurationBuilder()
54+
.AddInMemoryCollection(configValues)
55+
.Build();
56+
57+
var options = new PerRequestLogBufferingOptions();
58+
var configureOptions = new PerRequestLogBufferingConfigureOptions(configuration);
59+
60+
// Act
61+
configureOptions.Configure(options);
62+
63+
// Assert
64+
Assert.Equivalent(new PerRequestLogBufferingOptions(), options);
65+
}
66+
67+
[Fact]
68+
public void Configure_WithValidConfiguration_UpdatesOptions()
69+
{
70+
// Arrange
71+
var configValues = new Dictionary<string, string?>
72+
{
73+
["PerIncomingRequestLogBuffering:MaxLogRecordSizeInBytes"] = "1024",
74+
["PerIncomingRequestLogBuffering:MaxPerRequestBufferSizeInBytes"] = "4096",
75+
["PerIncomingRequestLogBuffering:Rules:0:CategoryName"] = "TestCategory",
76+
["PerIncomingRequestLogBuffering:Rules:0:LogLevel"] = "Information"
77+
};
78+
79+
IConfigurationRoot configuration = new ConfigurationBuilder()
80+
.AddInMemoryCollection(configValues)
81+
.Build();
82+
83+
var options = new PerRequestLogBufferingOptions();
84+
var configureOptions = new PerRequestLogBufferingConfigureOptions(configuration);
85+
86+
// Act
87+
configureOptions.Configure(options);
88+
89+
// Assert
90+
Assert.Equal(1024, options.MaxLogRecordSizeInBytes);
91+
Assert.Equal(4096, options.MaxPerRequestBufferSizeInBytes);
92+
Assert.Single(options.Rules);
93+
Assert.Equal("TestCategory", options.Rules[0].CategoryName);
94+
Assert.Equal(LogLevel.Information, options.Rules[0].LogLevel);
95+
}
96+
97+
[Fact]
98+
public void Configure_WithMultipleRules_AddsAllRules()
99+
{
100+
// Arrange
101+
var configValues = new Dictionary<string, string?>
102+
{
103+
["PerIncomingRequestLogBuffering:Rules:0:CategoryName"] = "Category1",
104+
["PerIncomingRequestLogBuffering:Rules:0:LogLevel"] = "Warning",
105+
["PerIncomingRequestLogBuffering:Rules:1:CategoryName"] = "Category2",
106+
["PerIncomingRequestLogBuffering:Rules:1:LogLevel"] = "Error"
107+
};
108+
109+
IConfigurationRoot configuration = new ConfigurationBuilder()
110+
.AddInMemoryCollection(configValues)
111+
.Build();
112+
113+
var options = new PerRequestLogBufferingOptions();
114+
var configureOptions = new PerRequestLogBufferingConfigureOptions(configuration);
115+
116+
// Act
117+
configureOptions.Configure(options);
118+
119+
// Assert
120+
Assert.Equal(2, options.Rules.Count);
121+
Assert.Equal("Category1", options.Rules[0].CategoryName);
122+
Assert.Equal(LogLevel.Warning, options.Rules[0].LogLevel);
123+
Assert.Equal("Category2", options.Rules[1].CategoryName);
124+
Assert.Equal(LogLevel.Error, options.Rules[1].LogLevel);
125+
}
126+
}
127+
#endif
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
#if NET9_0_OR_GREATER
5+
using System.Collections.Generic;
6+
using Microsoft.Extensions.Diagnostics.Buffering;
7+
using Xunit;
8+
9+
namespace Microsoft.AspNetCore.Diagnostics.Buffering.Test;
10+
11+
public class PerRequestLogBufferingOptionsCustomValidatorTests
12+
{
13+
[Fact]
14+
public void GivenInvalidCategory_Fails()
15+
{
16+
var validator = new PerRequestLogBufferingOptionsCustomValidator();
17+
var options = new PerRequestLogBufferingOptions
18+
{
19+
Rules = new List<LogBufferingFilterRule>
20+
{
21+
new LogBufferingFilterRule(categoryName: "**")
22+
},
23+
};
24+
25+
var validationResult = validator.Validate(string.Empty, options);
26+
27+
Assert.True(validationResult.Failed, validationResult.FailureMessage);
28+
Assert.Contains(nameof(options.Rules), validationResult.FailureMessage);
29+
}
30+
}
31+
#endif

0 commit comments

Comments
 (0)