Added test to check LocalMutex LockStrategy actually perform lock

Project: http://git-wip-us.apache.org/repos/asf/logging-log4net/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4net/commit/1782679c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4net/tree/1782679c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4net/diff/1782679c

Branch: refs/heads/feature/rfa-configurable-rolling-mutex
Commit: 1782679c94fe90ca8d9248cee5850d05b1bd6ad1
Parents: f22025f
Author: Andrei Stryia <andrei_str...@epam.com>
Authored: Mon Oct 1 15:46:35 2018 +0300
Committer: Andrei Stryia <andrei_str...@epam.com>
Committed: Mon Oct 1 15:46:35 2018 +0300

----------------------------------------------------------------------
 tests/src/Appender/RollingFileAppenderTest.cs | 62 +++++++++++++++++++++-
 1 file changed, 60 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/1782679c/tests/src/Appender/RollingFileAppenderTest.cs
----------------------------------------------------------------------
diff --git a/tests/src/Appender/RollingFileAppenderTest.cs 
b/tests/src/Appender/RollingFileAppenderTest.cs
index 46bce8d..b9c2ed0 100644
--- a/tests/src/Appender/RollingFileAppenderTest.cs
+++ b/tests/src/Appender/RollingFileAppenderTest.cs
@@ -32,6 +32,8 @@ using log4net.Util;
 
 using NUnit.Framework;
 using System.Globalization;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace log4net.Tests.Appender
 {
@@ -1453,19 +1455,21 @@ namespace log4net.Tests.Appender
                        LoggerManager.RepositorySelector = new 
DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
                }
 
-               private static void AssertFileEquals(string filename, string 
contents)
+               private static void AssertFileEquals(string filename, string 
contents, bool cleanup = true)
                {
 #if NETSTANDARD1_3
                        StreamReader sr = new StreamReader(File.Open(filename, 
FileMode.Open));
 #else
                        StreamReader sr = new StreamReader(filename);
 #endif
+
                        string logcont = sr.ReadToEnd();
                        sr.Close();
 
                        Assert.AreEqual(contents, logcont, "Log contents is not 
what is expected");
 
-                       File.Delete(filename);
+                       if (cleanup)
+                               File.Delete(filename);
                }
 
                /// <summary>
@@ -1776,6 +1780,60 @@ namespace log4net.Tests.Appender
                        Assert.IsEmpty(sh.Message);
                }
 
+#if !NETCF
+               /// <summary>
+               /// Verifies that the local mutex  rolling lock strategy works
+               /// </summary>
+               [Test]
+               public void TestRollingLockStrategyLocalMutex()
+               {
+                       String filename = c_fileName;
+                       SilentErrorHandler sh = new SilentErrorHandler();
+
+                       ILogger log = CreateLogger(filename, new 
FileAppender.MinimalLock(), sh, maxFileSize: 1, maxSizeRollBackups: 2, 
rollingLockStrategy: RollingFileAppender.RollingLockStrategyKind.LocalMutex);
+                       RollingFileAppender appender = (RollingFileAppender) 
log.Repository.GetAppenders()[0];
+
+                       Mutex syncObject = null;
+                       try
+                       {
+                               syncObject = new Mutex(false, 
appender.File.Replace("\\", "_").Replace(":", "_").Replace("/", "_"));
+                               syncObject.WaitOne();
+
+                               // Logger should acquire Mutex in different 
thread
+                               var write1 = Task.Factory.StartNew(()=> 
Assert.DoesNotThrow(delegate { log.Log(GetType(), Level.Info, "1", null); }));
+                               // Wait some time 
+                               WaitForStart(write1);
+
+                               // Since Mutex already locked, log file should 
be empty
+                               AssertFileEquals(filename, string.Empty, 
cleanup: false);
+
+                               syncObject.ReleaseMutex();
+                               write1.Wait();
+
+                               DestroyLogger();
+                               AssertFileEquals(filename, "1" + 
Environment.NewLine);
+                               Assert.IsEmpty(sh.Message);
+                       }
+                       finally
+                       {
+                               if (syncObject != null)
+                               {
+                                       syncObject.Dispose();
+                               }
+
+                       }
+               }
+               private void WaitForStart(Task write1)
+               {
+                       while (write1.Status != TaskStatus.Running)
+                       {
+                               Thread.Sleep(100);
+                       }
+
+                       Thread.Sleep(800);
+               }
+#endif
+
                /// <summary>
                /// Tests the count up case, with infinite max backups , to see 
that
                /// initialization of the rolling file appender results in the 
expected value

Reply via email to