This is an automated email from the ASF dual-hosted git repository.
freeandnil pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4net.git
The following commit(s) were added to refs/heads/master by this push:
new afebebae fixed flaky test
Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works (#277)
afebebae is described below
commit afebebae312eca70cd612f0f33d45d3019ee8b53
Author: Jan Friedrich <[email protected]>
AuthorDate: Tue Dec 9 09:00:02 2025 +0100
fixed flaky test Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works
(#277)
- failed when the minute changed unexpectedly
- now with completely deterministic dates
---
src/Directory.Build.props | 1 +
.../Integration/Log4NetIntegrationTests.cs | 62 ++++++++++++++++++----
src/log4net.Tests/Integration/MockDateTime.cs | 9 +---
.../Integration/log4net.maxsizeroll_date.config | 25 ---------
src/log4net.Tests/log4net.Tests.csproj | 17 +-----
5 files changed, 56 insertions(+), 58 deletions(-)
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 7f3ae8bb..370c0eb0 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -11,6 +11,7 @@
<RunAnalyzersDuringLiveAnalysis>true</RunAnalyzersDuringLiveAnalysis>
<_SkipUpgradeNetAnalyzersNuGetWarning>true</_SkipUpgradeNetAnalyzersNuGetWarning>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
+ <SatelliteResourceLanguages>en;en-US</SatelliteResourceLanguages>
</PropertyGroup>
<PropertyGroup Label="Package Versions">
<SystemConfigurationConfigurationManagerPackageVersion>4.5.0</SystemConfigurationConfigurationManagerPackageVersion>
diff --git a/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs
b/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs
index 9725c8eb..313c4eb5 100644
--- a/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs
+++ b/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs
@@ -23,8 +23,12 @@
using System.Linq;
using log4net.Appender;
using log4net.Config;
+using log4net.Core;
+using log4net.Layout;
using log4net.Repository;
+using log4net.Repository.Hierarchy;
using NUnit.Framework;
+using LoggerHierarchy = log4net.Repository.Hierarchy.Hierarchy;
namespace log4net.Tests.Integration
{
@@ -172,17 +176,24 @@ public void
Log4Net_WritesLogFile_WithMaxSizeRoll_Config_Works()
public void Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works()
{
DirectoryInfo logDir =
CreateLogDirectory("integrationTestLogDir_maxsizerolldate");
- (ILog log, ILoggerRepository repo) =
ArrangeLogger("log4net.maxsizeroll_date.config");
- MockDateTime mockDateTime = new();
-
repo.GetAppenders().OfType<RollingFileAppender>().First().DateTimeStrategy =
mockDateTime;
- // Write enough lines to trigger rolling by size and date
- for (int i = 1; i < 10000; ++i)
+ DateTime startDate = new(2025, 12, 08, 15, 55, 50);
+ MockDateTime mockDateTime = new(startDate); // start at the end of a
minute
+ (ILog log, ILoggerRepository repo) =
ArrangeCompositeLogger(mockDateTime);
+ // distribute 10.000 log entries over 60 seconds
+ TimeSpan stepIncrement = new(TimeSpan.FromSeconds(60).Ticks / 10000);
+ // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4
will survive
+ for (int i = 1; i < 1000; ++i)
{
- log.Debug($"DateRoll entry {i}");
- if (i % 5000 == 0)
- {
- mockDateTime.Offset = TimeSpan.FromMinutes(1); // allow time for
date to change if needed
- }
+ log.Debug($"DateRoll entry {i:D5}");
+ mockDateTime.Now += stepIncrement;
+ }
+ // switch to next minute to force date roll
+ mockDateTime.Now = startDate.AddSeconds(10);
+ // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4
will survive
+ for (int i = 1; i < 1000; ++i)
+ {
+ log.Debug($"DateRoll entry {i:D5}");
+ mockDateTime.Now += stepIncrement;
}
repo.Shutdown();
// Assert: rolled files exist (date+size pattern)
@@ -270,5 +281,36 @@ private static (ILog log, ILoggerRepository repo)
ArrangeLogger(string configFil
ILog log = LogManager.GetLogger(repo.Name, "IntegrationTestLogger");
return (log, repo);
}
+
+ private static (ILog log, ILoggerRepository repo)
ArrangeCompositeLogger(RollingFileAppender.IDateTime dateTime)
+ {
+ LoggerHierarchy repo =
(LoggerHierarchy)LogManager.CreateRepository(Guid.NewGuid().ToString());
+ PatternLayout layout = new() { ConversionPattern = "%d{yyyy/MM/dd
HH:mm:ss.fff} %m-%M%n" };
+ layout.ActivateOptions();
+ RollingFileAppender rollingAppender = new()
+ {
+ Name = "LogFileAppender",
+ File = "integrationTestLogDir_maxsizerolldate/.log",
+ AppendToFile = true,
+ RollingStyle = RollingFileAppender.RollingMode.Composite,
+ DatePattern = "HH-mm",
+ DateTimeStrategy = dateTime,
+ MaximumFileSize = "10KB",
+ MaxSizeRollBackups = 3,
+ StaticLogFileName = false,
+ CountDirection = 1,
+ PreserveLogFileNameExtension = true,
+ LockingModel = new FileAppender.NoLock(),
+ Layout = layout
+ };
+ rollingAppender.ActivateOptions();
+ repo.Configured = true;
+ Logger logger = (Logger)repo.GetLogger("IntegrationTestLogger");
+ logger.Level = Level.Debug;
+ logger.AddAppender(rollingAppender);
+ logger.Additivity = false;
+ return (log: new LogImpl(logger), repo);
+ }
+
}
}
\ No newline at end of file
diff --git a/src/log4net.Tests/Integration/MockDateTime.cs
b/src/log4net.Tests/Integration/MockDateTime.cs
index efa67d7a..f0bd6317 100644
--- a/src/log4net.Tests/Integration/MockDateTime.cs
+++ b/src/log4net.Tests/Integration/MockDateTime.cs
@@ -25,13 +25,8 @@ namespace log4net.Tests.Integration;
/// <summary>
/// Mock implementation of <see cref="RollingFileAppender.IDateTime"/>
/// </summary>
-internal sealed class MockDateTime : RollingFileAppender.IDateTime
+internal sealed class MockDateTime(DateTime now) :
RollingFileAppender.IDateTime
{
- /// <summary>
- /// Offset to apply to the current time.
- /// </summary>
- internal TimeSpan Offset { get; set; }
-
/// <inheritdoc/>
- public DateTime Now => DateTime.Now + Offset;
+ public DateTime Now { get; set; } = now;
}
\ No newline at end of file
diff --git a/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config
b/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config
deleted file mode 100644
index 2ea6bf4c..00000000
--- a/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
- <log4net>
- <appender name="LogFileAppender"
type="log4net.Appender.RollingFileAppender">
- <param name="File" value="integrationTestLogDir_maxsizerolldate/.log" />
- <param name="AppendToFile" value="true" />
- <param name="RollingStyle" value="Composite" />
- <param name="DatePattern" value="yyyy-MM-dd-mm" />
- <param name="MaximumFileSize" value="10KB" />
- <param name="MaxSizeRollBackups" value="3" />
- <param name="StaticLogFileName" value="false" />
- <param name="CountDirection" value="1" />
- <param name="PreserveLogFileNameExtension" value="true"/>
- <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
- <layout type="log4net.Layout.PatternLayout">
- <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss.fff}
[%-5p] %m (%M)%n"/>
- </layout>
- </appender>
-
- <logger name="IntegrationTestLogger">
- <level value="debug" />
- <appender-ref ref="LogFileAppender" />
- </logger>
- </log4net>
-</configuration>
\ No newline at end of file
diff --git a/src/log4net.Tests/log4net.Tests.csproj
b/src/log4net.Tests/log4net.Tests.csproj
index 4a1895ed..368fd27e 100644
--- a/src/log4net.Tests/log4net.Tests.csproj
+++ b/src/log4net.Tests/log4net.Tests.csproj
@@ -35,22 +35,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk"
Version="$(MicrosoftNetTestSdkPackageVersion)" />
</ItemGroup>
<ItemGroup>
- <None Update="Integration\log4net.maxsizeroll.config">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </None>
- <None Update="Integration\log4net.maxsizeroll_date.config">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </None>
- <None Update="Integration\log4net.no_file_name.config">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </None>
- <None Update="Integration\log4net.roll.config">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </None>
- <None Update="Integration\log4net.roll.config.xml">
- <CopyToOutputDirectory>Always</CopyToOutputDirectory>
- </None>
- <None Update="Integration\log4net.integration.basic.config">
+ <None Update="Integration\*.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>