This is an automated email from the ASF dual-hosted git repository. freeandnil pushed a commit to branch Feature/fixed-flaky-test-Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works in repository https://gitbox.apache.org/repos/asf/logging-log4net.git
commit 3e2cf05a6143322299f75df357cf9114e1b66453 Author: Jan Friedrich <[email protected]> AuthorDate: Mon Dec 8 17:34:05 2025 +0100 fixed flaky test Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works - 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>
