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>

Reply via email to