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