Merge pull request #81 from BipulRaman/master
Enforcing TLS 1.2
diff --git a/src/integration-testing/log4net-672/Program.cs b/src/integration-testing/log4net-672/Program.cs
index 64be479..79f4761 100644
--- a/src/integration-testing/log4net-672/Program.cs
+++ b/src/integration-testing/log4net-672/Program.cs
@@ -1,102 +1,91 @@
using System;
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Reflection;
-using System.Xml;
using log4net;
using log4net.Config;
-using log4net.Core;
-if (true)
+const int NO_ERROR = 0;
+const int MISSING_LOGS = 1;
+const int OVERWRITTEN_LOGS = 2;
+
+var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath;
+var appFolder = Path.GetDirectoryName(appPath);
+if (appFolder is null)
{
- var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath;
- var appFolder = Path.GetDirectoryName(appPath);
- if (appFolder is null)
- {
- throw new InvalidOperationException(
- $"Can't determine app folder for {appPath}"
- );
- }
+ throw new InvalidOperationException(
+ $"Can't determine app folder for {appPath}"
+ );
+}
- var configFile = Path.Combine(appFolder, "log4net.config");
- if (!File.Exists(configFile))
- {
- throw new InvalidOperationException($"log4net.config not found at {configFile}");
- }
+var logFolder = Path.Combine(appFolder, "Logs");
+if (Directory.Exists(logFolder))
+{
+ Directory.Delete(logFolder, recursive: true);
+}
+var configFile = Path.Combine(appFolder, "log4net.config");
+if (!File.Exists(configFile))
+{
+ throw new InvalidOperationException($"log4net.config not found at {configFile}");
+}
+
+var logCount = 10;
+var identifiers = new List<Guid>();
+for (var i = 0; i < 10; i++)
+{
+ var identifier = Guid.NewGuid();
+ identifiers.Add(identifier);
+ var logged = LogWith(identifier, logCount);
+ if (logged != logCount)
+ {
+ Die($"Missing logs immediately for '{identifier}' - found {logged}/{logCount}", MISSING_LOGS);
+ }
+}
+
+foreach (var identifier in identifiers)
+{
+ var logged = CountIdentifierInLogs(identifier);
+ if (logged != logCount)
+ {
+ Die($"Logs have been overwritten for '{identifier}' - found {logged}/{logCount}", OVERWRITTEN_LOGS);
+ }
+}
+
+Console.WriteLine("All good: LOG4NET-672 is resolved");
+return NO_ERROR;
+
+void Die(string message, int exitCode)
+{
+ Console.Error.WriteLine(message);
+ Environment.Exit(exitCode);
+}
+
+int CountIdentifierInLogs(Guid id)
+{
+ return Directory.EnumerateFiles("Logs").Select(
+ filePath => CountIdentifierInFile(id, filePath)
+ ).Sum();
+}
+
+int CountIdentifierInFile(Guid id, string filePath)
+{
+ var contents = File.ReadAllLines(filePath);
+ return contents.Count(line => line.Contains(id.ToString()));
+}
+
+int LogWith(Guid identifier, int howManyLogs)
+{
var info = new FileInfo(configFile);
-
XmlConfigurator.Configure(info);
-
var logger = LogManager.GetLogger("main");
- for (var i = 0; i < 10; i++)
+ for (var i = 0; i < howManyLogs; i++)
{
- logger.Info($"test log {i}");
+ logger.Info($"test log {i} [{identifier}]");
}
LogManager.Flush(int.MaxValue);
-}
-
-// Sample.Main();
-//
-// public class Sample
-// {
-// private const string filename = "sampledata.xml";
-//
-// public static void Main()
-// {
-//
-// XmlTextWriter writer = new XmlTextWriter (filename, null);
-// //Use indenting for readability.
-// writer.Formatting = Formatting.Indented;
-//
-// writer.WriteComment("sample XML fragment");
-//
-// //Write an element (this one is the root).
-// writer.WriteStartElement("bookstore");
-//
-// //Write the namespace declaration.
-// writer.WriteAttributeString("xmlns", "bk", null, "log4net");
-//
-// writer.WriteStartElement("book");
-//
-// //Lookup the prefix and then write the ISBN attribute.
-// string prefix = writer.LookupPrefix("urn:samples");
-// writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
-// writer.WriteString("1-861003-78");
-// writer.WriteEndAttribute();
-//
-// //Write the title.
-// writer.WriteStartElement("title");
-// writer.WriteString("The Handmaid's Tale");
-// writer.WriteEndElement();
-//
-// //Write the price.
-// writer.WriteElementString("price", "19.95");
-//
-// //Write the style element.
-// writer.WriteStartElement(prefix, "style", "urn:samples");
-// writer.WriteString("hardcover");
-// writer.WriteEndElement();
-//
-// //Write the end tag for the book element.
-// writer.WriteEndElement();
-//
-// //Write the close tag for the root element.
-// writer.WriteEndElement();
-//
-// //Write the XML to file and close the writer.
-// writer.Flush();
-// writer.Close();
-//
-// //Read the file back in and parse to ensure well formed XML.
-// XmlDocument doc = new XmlDocument();
-// //Preserve white space for readability.
-// doc.PreserveWhitespace = true;
-// //Load the file
-// doc.Load(filename);
-//
-// //Write the XML content to the console.
-// Console.Write(doc.InnerXml);
-// }
-// }
+ return CountIdentifierInLogs(identifier);
+}
\ No newline at end of file
diff --git a/src/integration-testing/log4net-672/log4net-672.csproj b/src/integration-testing/log4net-672/log4net-672.csproj
index e0ac350..5a134f9 100644
--- a/src/integration-testing/log4net-672/log4net-672.csproj
+++ b/src/integration-testing/log4net-672/log4net-672.csproj
@@ -20,4 +20,8 @@
</None>
</ItemGroup>
+ <ItemGroup>
+ <PackageReference Include="PeanutButter.EasyArgs" Version="2.0.63" />
+ </ItemGroup>
+
</Project>
diff --git a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
index 7280eec..d6cee4b 100644
--- a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
+++ b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
@@ -1,4 +1,5 @@
#region Apache License
+
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
@@ -15,6 +16,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//
+
#endregion
using System;
@@ -23,1679 +25,1734 @@
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
-
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using log4net.Util;
-
using NUnit.Framework;
using System.Globalization;
namespace log4net.Tests.Appender
{
- /// <summary>
- /// Used for internal unit testing the <see cref="RollingFileAppender"/> class.
- /// </summary>
- [TestFixture]
- public class RollingFileAppenderTest
- {
- private const string c_fileName = "test_41d3d834_4320f4da.log";
- private const string c_testMessage98Chars = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567";
- private const string c_testMessage99Chars = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678";
- private const int c_iMaximumFileSize = 450; // in bytes
- private int _iMessagesLoggedThisFile = 0;
- private int _iMessagesLogged = 0;
- private int _iCountDirection = 0;
- private int _MaxSizeRollBackups = 3;
- private CountingAppender _caRoot;
- private Logger _root;
+ /// <summary>
+ /// Used for internal unit testing the <see cref="RollingFileAppender"/> class.
+ /// </summary>
+ [TestFixture]
+ public class RollingFileAppenderTest
+ {
+ private const string c_fileName = "test_41d3d834_4320f4da.log";
+
+ private const string c_testMessage98Chars =
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567";
+
+ private const string c_testMessage99Chars =
+ "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678";
+
+ private const int c_iMaximumFileSize = 450; // in bytes
+ private int _iMessagesLoggedThisFile = 0;
+ private int _iMessagesLogged = 0;
+ private int _iCountDirection = 0;
+ private int _MaxSizeRollBackups = 3;
+ private CountingAppender _caRoot;
+ private Logger _root;
#if !NETSTANDARD1_3
- private CultureInfo _currentCulture;
- private CultureInfo _currentUICulture;
+ private CultureInfo _currentCulture;
+ private CultureInfo _currentUICulture;
#endif
- private class SilentErrorHandler : IErrorHandler
- {
- private StringBuilder m_buffer = new StringBuilder();
+ private class SilentErrorHandler : IErrorHandler
+ {
+ private StringBuilder m_buffer = new StringBuilder();
- public string Message
- {
- get { return m_buffer.ToString(); }
- }
-
- public void Error(string message)
- {
- m_buffer.Append(message + "\n");
- }
-
- public void Error(string message, Exception e)
- {
- m_buffer.Append(message + "\n" + e.Message + "\n");
- }
-
- public void Error(string message, Exception e, ErrorCode errorCode)
- {
- m_buffer.Append(message + "\n" + e.Message + "\n");
- }
- }
-
- /// <summary>
- /// Sets up variables used for the tests
- /// </summary>
- private void InitializeVariables()
- {
- _iMessagesLoggedThisFile = 0;
- _iMessagesLogged = 0;
- _iCountDirection = +1; // Up
- _MaxSizeRollBackups = 3;
- }
-
- /// <summary>
- /// Shuts down any loggers in the hierarchy, along
- /// with all appenders, and deletes any test files used
- /// for logging.
- /// </summary>
- private static void ResetAndDeleteTestFiles()
- {
- // Regular users should not use the clear method lightly!
- Utils.GetRepository().ResetConfiguration();
- Utils.GetRepository().Shutdown();
- ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
-
- DeleteTestFiles();
- }
-
- /// <summary>
- /// Any initialization that happens before each test can
- /// go here
- /// </summary>
- [SetUp]
- public void SetUp()
- {
- ResetAndDeleteTestFiles();
- InitializeVariables();
-
-#if !NETSTANDARD1_3
- // set correct thread culture
- _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
- _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
- System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
-#endif
- }
-
- /// <summary>
- /// Any steps that happen after each test go here
- /// </summary>
- [TearDown]
- public void TearDown()
- {
- ResetAndDeleteTestFiles();
-
-#if !NETSTANDARD1_3
- // restore previous culture
- System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
- System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
-#endif
- }
-
- /// <summary>
- /// Finds the number of files that match the base file name,
- /// and matches the result against an expected count
- /// </summary>
- /// <param name="iExpectedCount"></param>
- private static void VerifyFileCount(int iExpectedCount)
- {
- VerifyFileCount(iExpectedCount, false);
- }
- /// <summary>
- /// Finds the number of files that match the base file name,
- /// and matches the result against an expected count
- /// </summary>
- /// <param name="iExpectedCount"></param>
- private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension)
- {
- ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension);
- Assert.IsNotNull(alFiles);
- Assert.AreEqual(iExpectedCount, alFiles.Count);
- }
-
- /// <summary>
- /// Creates a file with the given number, and the shared base file name
- /// </summary>
- /// <param name="iFileNumber"></param>
- private static void CreateFile(int iFileNumber)
- {
- FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber));
-
- FileStream fileStream = null;
- try
- {
- fileStream = fileInfo.Create();
- }
- finally
- {
- if (null != fileStream)
- {
- try
- {
- fileStream.Close();
- }
- catch
- {
- }
- }
- }
- }
-
- /// <summary>
- /// Verifies that the code correctly loads all filenames
- /// </summary>
- [Test]
- public void TestGetExistingFiles()
- {
- VerifyFileCount(0);
- CreateFile(0);
- VerifyFileCount(1);
- CreateFile(1);
- VerifyFileCount(2);
- }
-
- [Test]
- public void RollingCombinedWithPreserveExtension()
+ public string Message
{
- _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
- _root.Level = Level.All;
- PatternLayout patternLayout = new PatternLayout();
- patternLayout.ActivateOptions();
-
- RollingFileAppender roller = new RollingFileAppender();
- roller.StaticLogFileName = false;
- roller.Layout = patternLayout;
- roller.AppendToFile = true;
- roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
- roller.DatePattern = "dd_MM_yyyy";
- roller.MaxSizeRollBackups = 1;
- roller.CountDirection = 1;
- roller.PreserveLogFileNameExtension = true;
- roller.MaximumFileSize = "10KB";
- roller.File = c_fileName;
- roller.ActivateOptions();
- _root.AddAppender(roller);
-
- _root.Repository.Configured = true;
-
- for (int i = 0; i < 1000; i++)
- {
- StringBuilder s = new StringBuilder();
- for (int j = 50; j < 100; j++)
- {
- if (j > 50) {
- s.Append(" ");
- }
- s.Append(j);
- }
- _root.Log(Level.Debug, s.ToString(), null);
- }
- VerifyFileCount(2, true);
+ get { return m_buffer.ToString(); }
}
- /// <summary>
- /// Removes all test files that exist
- /// </summary>
- private static void DeleteTestFiles()
- {
- ArrayList alFiles = GetExistingFiles(c_fileName);
- alFiles.AddRange(GetExistingFiles(c_fileName, true));
- foreach(string sFile in alFiles)
- {
- try
- {
- Debug.WriteLine("Deleting test file " + sFile);
- File.Delete(sFile);
- }
- catch(Exception ex)
- {
- Debug.WriteLine("Exception while deleting test file " + ex);
- }
- }
- }
+ public void Error(string message)
+ {
+ m_buffer.Append(message + "\n");
+ }
- ///// <summary>
- ///// Generates a file name associated with the count.
- ///// </summary>
- ///// <param name="iFileCount"></param>
- ///// <returns></returns>
- //private string MakeFileName(int iFileCount)
- //{
- // return MakeFileName(_fileName, iFileCount);
- //}
+ public void Error(string message, Exception e)
+ {
+ m_buffer.Append(message + "\n" + e.Message + "\n");
+ }
- /// <summary>
- /// Generates a file name associated with the count, using
- /// the base file name.
- /// </summary>
- /// <param name="sBaseFile"></param>
- /// <param name="iFileCount"></param>
- /// <returns></returns>
- private static string MakeFileName(string sBaseFile, int iFileCount)
- {
- if (0 == iFileCount)
- {
- return sBaseFile;
- }
- return sBaseFile + "." + iFileCount;
- }
+ public void Error(string message, Exception e, ErrorCode errorCode)
+ {
+ m_buffer.Append(message + "\n" + e.Message + "\n");
+ }
+ }
- /// <summary>
- /// Returns a RollingFileAppender using all the internal settings for maximum
- /// file size and number of backups
- /// </summary>
- /// <returns></returns>
- private RollingFileAppender CreateAppender()
- {
- return CreateAppender(new FileAppender.ExclusiveLock());
- }
+ /// <summary>
+ /// Sets up variables used for the tests
+ /// </summary>
+ private void InitializeVariables()
+ {
+ _iMessagesLoggedThisFile = 0;
+ _iMessagesLogged = 0;
+ _iCountDirection = +1; // Up
+ _MaxSizeRollBackups = 3;
+ }
- /// <summary>
- /// Returns a RollingFileAppender using all the internal settings for maximum
- /// file size and number of backups
- /// </summary>
- /// <param name="lockModel">The locking model to test</param>
- /// <returns></returns>
- private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel)
- {
- //
- // Use a basic pattern that
- // includes just the message and a CR/LF.
- //
- PatternLayout layout = new PatternLayout("%m%n");
+ /// <summary>
+ /// Shuts down any loggers in the hierarchy, along
+ /// with all appenders, and deletes any test files used
+ /// for logging.
+ /// </summary>
+ private static void ResetAndDeleteTestFiles()
+ {
+ // Regular users should not use the clear method lightly!
+ Utils.GetRepository().ResetConfiguration();
+ Utils.GetRepository().Shutdown();
+ ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
- //
- // Create the new appender
- //
- RollingFileAppender appender = new RollingFileAppender();
- appender.Layout = layout;
- appender.File = c_fileName;
- appender.Encoding = Encoding.ASCII;
- appender.MaximumFileSize = c_iMaximumFileSize.ToString();
- appender.MaxSizeRollBackups = _MaxSizeRollBackups;
- appender.CountDirection = _iCountDirection;
- appender.RollingStyle = RollingFileAppender.RollingMode.Size;
- appender.LockingModel = lockModel;
+ DeleteTestFiles();
+ }
- appender.ActivateOptions();
+ /// <summary>
+ /// Any initialization that happens before each test can
+ /// go here
+ /// </summary>
+ [SetUp]
+ public void SetUp()
+ {
+ ResetAndDeleteTestFiles();
+ InitializeVariables();
- return appender;
- }
+#if !NETSTANDARD1_3
+ // set correct thread culture
+ _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+ _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
+ System.Threading.Thread.CurrentThread.CurrentCulture =
+ System.Threading.Thread.CurrentThread.CurrentUICulture =
+ System.Globalization.CultureInfo.InvariantCulture;
+#endif
+ }
- /// <summary>
- /// Used for test purposes, a table of these objects can be used to identify
- /// any existing files and their expected length.
- /// </summary>
- public class RollFileEntry
- {
- /// <summary>
- /// Stores the name of the file
- /// </summary>
- private string m_fileName;
+ /// <summary>
+ /// Any steps that happen after each test go here
+ /// </summary>
+ [TearDown]
+ public void TearDown()
+ {
+ ResetAndDeleteTestFiles();
- /// <summary>
- /// The expected length of the file
- /// </summary>
- private long m_fileLength;
+#if !NETSTANDARD1_3
+ // restore previous culture
+ System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
+ System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
+#endif
+ }
- /// <summary>
- /// Default constructor
- /// </summary>
- public RollFileEntry()
- {
- }
+ /// <summary>
+ /// Finds the number of files that match the base file name,
+ /// and matches the result against an expected count
+ /// </summary>
+ /// <param name="iExpectedCount"></param>
+ private static void VerifyFileCount(int iExpectedCount)
+ {
+ VerifyFileCount(iExpectedCount, false);
+ }
- /// <summary>
- /// Constructor used when the fileInfo and expected length are known
- /// </summary>
- /// <param name="fileName"></param>
- /// <param name="fileLength"></param>
- public RollFileEntry(string fileName, long fileLength)
- {
- m_fileName = fileName;
- m_fileLength = fileLength;
- }
+ /// <summary>
+ /// Finds the number of files that match the base file name,
+ /// and matches the result against an expected count
+ /// </summary>
+ /// <param name="iExpectedCount"></param>
+ private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension)
+ {
+ ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension);
+ Assert.IsNotNull(alFiles);
+ Assert.AreEqual(iExpectedCount, alFiles.Count);
+ }
- /// <summary>
- /// Stores the name of the file
- /// </summary>
- public string FileName
- {
- get { return m_fileName; }
- }
+ /// <summary>
+ /// Creates a file with the given number, and the shared base file name
+ /// </summary>
+ /// <param name="iFileNumber"></param>
+ private static void CreateFile(int iFileNumber)
+ {
+ FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber));
- /// <summary>
- /// The expected length of the file
- /// </summary>
- public long FileLength
- {
- get { return m_fileLength; }
- }
- }
+ FileStream fileStream = null;
+ try
+ {
+ fileStream = fileInfo.Create();
+ }
+ finally
+ {
+ if (null != fileStream)
+ {
+ try
+ {
+ fileStream.Close();
+ }
+ catch
+ {
+ }
+ }
+ }
+ }
- /// <summary>
- /// Used for table-driven testing. This class holds information that can be used
- /// for testing of file rolling.
- /// </summary>
- public class RollConditions
- {
- /// <summary>
- /// A table of entries showing files that should exist and their expected sizes
- /// before logging is called
- /// </summary>
- private RollFileEntry[] m_preLogFileEntries;
+ /// <summary>
+ /// Verifies that the code correctly loads all filenames
+ /// </summary>
+ [Test]
+ public void TestGetExistingFiles()
+ {
+ VerifyFileCount(0);
+ CreateFile(0);
+ VerifyFileCount(1);
+ CreateFile(1);
+ VerifyFileCount(2);
+ }
- /// <summary>
- /// A table of entries showing files that should exist and their expected sizes
- /// after a message is logged
- /// </summary>
- private RollFileEntry[] m_postLogFileEntries;
+ [Test]
+ public void RollingCombinedWithPreserveExtension()
+ {
+ _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+ _root.Level = Level.All;
+ PatternLayout patternLayout = new PatternLayout();
+ patternLayout.ActivateOptions();
- /// <summary>
- /// Constructor, taking all required parameters
- /// </summary>
- /// <param name="preLogFileEntries"></param>
- /// <param name="postLogFileEntries"></param>
- public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries)
- {
- m_preLogFileEntries = preLogFileEntries;
- m_postLogFileEntries = postLogFileEntries;
- }
+ RollingFileAppender roller = new RollingFileAppender();
+ roller.StaticLogFileName = false;
+ roller.Layout = patternLayout;
+ roller.AppendToFile = true;
+ roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
+ roller.DatePattern = "dd_MM_yyyy";
+ roller.MaxSizeRollBackups = 1;
+ roller.CountDirection = 1;
+ roller.PreserveLogFileNameExtension = true;
+ roller.MaximumFileSize = "10KB";
+ roller.File = c_fileName;
+ roller.ActivateOptions();
+ _root.AddAppender(roller);
- /// <summary>
- /// A table of entries showing files that should exist and their expected sizes
- /// before logging is called
- /// </summary>
- public RollFileEntry[] GetPreLogFileEntries()
- {
- return m_preLogFileEntries;
- }
+ _root.Repository.Configured = true;
- /// <summary>
- /// A table of entries showing files that should exist and their expected sizes
- /// after a message is logged
- /// </summary>
- public RollFileEntry[] GetPostLogFileEntries()
- {
- return m_postLogFileEntries;
- }
- }
+ for (int i = 0; i < 1000; i++)
+ {
+ StringBuilder s = new StringBuilder();
+ for (int j = 50; j < 100; j++)
+ {
+ if (j > 50)
+ {
+ s.Append(" ");
+ }
- private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting, string sFileName, FileInfo file, RollFileEntry entry)
- {
- Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName);
- Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch");
- // Remove this file from the list
- alExisting.Remove(sFileName);
- }
+ s.Append(j);
+ }
- /// <summary>
- /// Checks that all the expected files exist, and only the expected files. Also
- /// verifies the length of all files against the expected length
- /// </summary>
- /// <param name="sBaseFileName"></param>
- /// <param name="fileEntries"></param>
- private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries)
- {
- ArrayList alExisting = GetExistingFiles(sBaseFileName);
- if (null != fileEntries)
- {
- // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length );
- foreach(RollFileEntry rollFile in fileEntries)
- {
- string sFileName = rollFile.FileName;
- FileInfo file = new FileInfo(sFileName);
+ _root.Log(Level.Debug, s.ToString(), null);
+ }
- if (rollFile.FileLength > 0)
- {
- Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName);
- VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
- }
- else
- {
- // If length is 0, file may not exist yet. If file exists, make sure length
- // is zero. If file doesn't exist, this is OK
+ VerifyFileCount(2, true);
+ }
- if (file.Exists)
- {
- VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
- }
- }
- }
- }
- else
- {
- Assert.AreEqual(0, alExisting.Count);
- }
+ /// <summary>
+ /// Removes all test files that exist
+ /// </summary>
+ private static void DeleteTestFiles()
+ {
+ ArrayList alFiles = GetExistingFiles(c_fileName);
+ alFiles.AddRange(GetExistingFiles(c_fileName, true));
+ foreach (string sFile in alFiles)
+ {
+ try
+ {
+ Debug.WriteLine("Deleting test file " + sFile);
+ File.Delete(sFile);
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("Exception while deleting test file " + ex);
+ }
+ }
+ }
- // This check ensures no extra files matching the wildcard pattern exist.
- // We only want the files we expect, and no others
- Assert.AreEqual(0, alExisting.Count);
- }
+ ///// <summary>
+ ///// Generates a file name associated with the count.
+ ///// </summary>
+ ///// <param name="iFileCount"></param>
+ ///// <returns></returns>
+ //private string MakeFileName(int iFileCount)
+ //{
+ // return MakeFileName(_fileName, iFileCount);
+ //}
- /// <summary>
- /// Called before logging a message to check that all the expected files exist,
- /// and only the expected files. Also verifies the length of all files against
- /// the expected length
- /// </summary>
- /// <param name="sBaseFileName"></param>
- /// <param name="entry"></param>
- private static void VerifyPreConditions(string sBaseFileName, RollConditions entry)
- {
- VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries());
- }
+ /// <summary>
+ /// Generates a file name associated with the count, using
+ /// the base file name.
+ /// </summary>
+ /// <param name="sBaseFile"></param>
+ /// <param name="iFileCount"></param>
+ /// <returns></returns>
+ private static string MakeFileName(string sBaseFile, int iFileCount)
+ {
+ if (0 == iFileCount)
+ {
+ return sBaseFile;
+ }
- /// <summary>
- /// Called after logging a message to check that all the expected files exist,
- /// and only the expected files. Also verifies the length of all files against
- /// the expected length
- /// </summary>
- /// <param name="sBaseFileName"></param>
- /// <param name="entry"></param>
- private static void VerifyPostConditions(string sBaseFileName, RollConditions entry)
- {
- VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries());
- }
+ return sBaseFile + "." + iFileCount;
+ }
- /// <summary>
- /// Logs a message, verifying the expected message counts against the
- /// current running totals.
- /// </summary>
- /// <param name="entry"></param>
- /// <param name="sMessageToLog"></param>
- private void LogMessage(RollConditions entry, string sMessageToLog)
- {
- Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++);
- _root.Log(Level.Debug, sMessageToLog, null);
- Assert.AreEqual(_caRoot.Counter, _iMessagesLogged);
- _iMessagesLoggedThisFile++;
- }
+ /// <summary>
+ /// Returns a RollingFileAppender using all the internal settings for maximum
+ /// file size and number of backups
+ /// </summary>
+ /// <returns></returns>
+ private RollingFileAppender CreateAppender()
+ {
+ return CreateAppender(new FileAppender.ExclusiveLock());
+ }
- //private void DumpFileEntry( RollFileEntry entry )
- //{
- // System.Diagnostics.Debug.WriteLine( "\tfile name: " + entry.FileName );
- // System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength );
- //}
+ /// <summary>
+ /// Returns a RollingFileAppender using all the internal settings for maximum
+ /// file size and number of backups
+ /// </summary>
+ /// <param name="lockModel">The locking model to test</param>
+ /// <returns></returns>
+ private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel)
+ {
+ //
+ // Use a basic pattern that
+ // includes just the message and a CR/LF.
+ //
+ PatternLayout layout = new PatternLayout("%m%n");
- //private void DumpTableEntry( RollConditions entry )
- //{
- // System.Diagnostics.Debug.WriteLine( "Pre-Conditions" );
- // foreach( RollFileEntry file in entry.GetPreLogFileEntries() )
- // {
- // DumpFileEntry( file );
- // }
- // System.Diagnostics.Debug.WriteLine( "Post-Conditions" );
- // foreach( RollFileEntry file in entry.GetPostLogFileEntries() )
- // {
- // DumpFileEntry( file );
- // }
- // // System.Diagnostics.Debug.WriteLine("");
- //}
+ //
+ // Create the new appender
+ //
+ RollingFileAppender appender = new RollingFileAppender();
+ appender.Layout = layout;
+ appender.File = c_fileName;
+ appender.Encoding = Encoding.ASCII;
+ appender.MaximumFileSize = c_iMaximumFileSize.ToString();
+ appender.MaxSizeRollBackups = _MaxSizeRollBackups;
+ appender.CountDirection = _iCountDirection;
+ appender.RollingStyle = RollingFileAppender.RollingMode.Size;
+ appender.LockingModel = lockModel;
- /// <summary>
- /// Runs through all table entries, logging messages. Before each message is logged,
- /// pre-conditions are checked to ensure the expected files exist and they are the
- /// expected size. After logging, verifies the same.
- /// </summary>
- /// <param name="sBaseFileName"></param>
- /// <param name="entries"></param>
- /// <param name="sMessageToLog"></param>
- private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog)
- {
- for(int i = 0; i < entries.Length; i++)
- {
- RollConditions entry = entries[i];
+ appender.ActivateOptions();
- // System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions");
- // DumpTableEntry( entry );
- // System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions");
- VerifyPreConditions(sBaseFileName, entry);
- // System.Diagnostics.Debug.WriteLine( i + ": Logging message");
- LogMessage(entry, sMessageToLog);
- // System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions");
- VerifyPostConditions(sBaseFileName, entry);
- // System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n");
- }
- }
+ return appender;
+ }
+
+ /// <summary>
+ /// Used for test purposes, a table of these objects can be used to identify
+ /// any existing files and their expected length.
+ /// </summary>
+ public class RollFileEntry
+ {
+ /// <summary>
+ /// Stores the name of the file
+ /// </summary>
+ private string m_fileName;
+
+ /// <summary>
+ /// The expected length of the file
+ /// </summary>
+ private long m_fileLength;
+
+ /// <summary>
+ /// Default constructor
+ /// </summary>
+ public RollFileEntry()
+ {
+ }
+
+ /// <summary>
+ /// Constructor used when the fileInfo and expected length are known
+ /// </summary>
+ /// <param name="fileName"></param>
+ /// <param name="fileLength"></param>
+ public RollFileEntry(string fileName, long fileLength)
+ {
+ m_fileName = fileName;
+ m_fileLength = fileLength;
+ }
+
+ /// <summary>
+ /// Stores the name of the file
+ /// </summary>
+ public string FileName
+ {
+ get { return m_fileName; }
+ }
+
+ /// <summary>
+ /// The expected length of the file
+ /// </summary>
+ public long FileLength
+ {
+ get { return m_fileLength; }
+ }
+ }
+
+ /// <summary>
+ /// Used for table-driven testing. This class holds information that can be used
+ /// for testing of file rolling.
+ /// </summary>
+ public class RollConditions
+ {
+ /// <summary>
+ /// A table of entries showing files that should exist and their expected sizes
+ /// before logging is called
+ /// </summary>
+ private RollFileEntry[] m_preLogFileEntries;
+
+ /// <summary>
+ /// A table of entries showing files that should exist and their expected sizes
+ /// after a message is logged
+ /// </summary>
+ private RollFileEntry[] m_postLogFileEntries;
+
+ /// <summary>
+ /// Constructor, taking all required parameters
+ /// </summary>
+ /// <param name="preLogFileEntries"></param>
+ /// <param name="postLogFileEntries"></param>
+ public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries)
+ {
+ m_preLogFileEntries = preLogFileEntries;
+ m_postLogFileEntries = postLogFileEntries;
+ }
+
+ /// <summary>
+ /// A table of entries showing files that should exist and their expected sizes
+ /// before logging is called
+ /// </summary>
+ public RollFileEntry[] GetPreLogFileEntries()
+ {
+ return m_preLogFileEntries;
+ }
+
+ /// <summary>
+ /// A table of entries showing files that should exist and their expected sizes
+ /// after a message is logged
+ /// </summary>
+ public RollFileEntry[] GetPostLogFileEntries()
+ {
+ return m_postLogFileEntries;
+ }
+ }
+
+ private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting,
+ string sFileName,
+ FileInfo file,
+ RollFileEntry entry)
+ {
+ Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName);
+ Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch");
+ // Remove this file from the list
+ alExisting.Remove(sFileName);
+ }
+
+ /// <summary>
+ /// Checks that all the expected files exist, and only the expected files. Also
+ /// verifies the length of all files against the expected length
+ /// </summary>
+ /// <param name="sBaseFileName"></param>
+ /// <param name="fileEntries"></param>
+ private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries)
+ {
+ ArrayList alExisting = GetExistingFiles(sBaseFileName);
+ if (null != fileEntries)
+ {
+ // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length );
+ foreach (RollFileEntry rollFile in fileEntries)
+ {
+ string sFileName = rollFile.FileName;
+ FileInfo file = new FileInfo(sFileName);
+
+ if (rollFile.FileLength > 0)
+ {
+ Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName);
+ VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
+ }
+ else
+ {
+ // If length is 0, file may not exist yet. If file exists, make sure length
+ // is zero. If file doesn't exist, this is OK
+
+ if (file.Exists)
+ {
+ VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
+ }
+ }
+ }
+ }
+ else
+ {
+ Assert.AreEqual(0, alExisting.Count);
+ }
+
+ // This check ensures no extra files matching the wildcard pattern exist.
+ // We only want the files we expect, and no others
+ Assert.AreEqual(0, alExisting.Count);
+ }
+
+ /// <summary>
+ /// Called before logging a message to check that all the expected files exist,
+ /// and only the expected files. Also verifies the length of all files against
+ /// the expected length
+ /// </summary>
+ /// <param name="sBaseFileName"></param>
+ /// <param name="entry"></param>
+ private static void VerifyPreConditions(string sBaseFileName, RollConditions entry)
+ {
+ VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries());
+ }
+
+ /// <summary>
+ /// Called after logging a message to check that all the expected files exist,
+ /// and only the expected files. Also verifies the length of all files against
+ /// the expected length
+ /// </summary>
+ /// <param name="sBaseFileName"></param>
+ /// <param name="entry"></param>
+ private static void VerifyPostConditions(string sBaseFileName, RollConditions entry)
+ {
+ VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries());
+ }
+
+ /// <summary>
+ /// Logs a message, verifying the expected message counts against the
+ /// current running totals.
+ /// </summary>
+ /// <param name="entry"></param>
+ /// <param name="sMessageToLog"></param>
+ private void LogMessage(RollConditions entry, string sMessageToLog)
+ {
+ Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++);
+ _root.Log(Level.Debug, sMessageToLog, null);
+ Assert.AreEqual(_caRoot.Counter, _iMessagesLogged);
+ _iMessagesLoggedThisFile++;
+ }
+
+ //private void DumpFileEntry( RollFileEntry entry )
+ //{
+ // System.Diagnostics.Debug.WriteLine( "\tfile name: " + entry.FileName );
+ // System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength );
+ //}
+
+ //private void DumpTableEntry( RollConditions entry )
+ //{
+ // System.Diagnostics.Debug.WriteLine( "Pre-Conditions" );
+ // foreach( RollFileEntry file in entry.GetPreLogFileEntries() )
+ // {
+ // DumpFileEntry( file );
+ // }
+ // System.Diagnostics.Debug.WriteLine( "Post-Conditions" );
+ // foreach( RollFileEntry file in entry.GetPostLogFileEntries() )
+ // {
+ // DumpFileEntry( file );
+ // }
+ // // System.Diagnostics.Debug.WriteLine("");
+ //}
+
+ /// <summary>
+ /// Runs through all table entries, logging messages. Before each message is logged,
+ /// pre-conditions are checked to ensure the expected files exist and they are the
+ /// expected size. After logging, verifies the same.
+ /// </summary>
+ /// <param name="sBaseFileName"></param>
+ /// <param name="entries"></param>
+ /// <param name="sMessageToLog"></param>
+ private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog)
+ {
+ for (int i = 0; i < entries.Length; i++)
+ {
+ RollConditions entry = entries[i];
+
+ // System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions");
+ // DumpTableEntry( entry );
+ // System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions");
+ VerifyPreConditions(sBaseFileName, entry);
+ // System.Diagnostics.Debug.WriteLine( i + ": Logging message");
+ LogMessage(entry, sMessageToLog);
+ // System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions");
+ VerifyPostConditions(sBaseFileName, entry);
+ // System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n");
+ }
+ }
private static readonly int s_Newline_Length = Environment.NewLine.Length;
- /// <summary>
- /// Returns the number of bytes logged per message, including
- /// any newline characters in addition to the message length.
- /// </summary>
- /// <param name="sMessage"></param>
- /// <returns></returns>
- private static int TotalMessageLength(string sMessage)
- {
+ /// <summary>
+ /// Returns the number of bytes logged per message, including
+ /// any newline characters in addition to the message length.
+ /// </summary>
+ /// <param name="sMessage"></param>
+ /// <returns></returns>
+ private static int TotalMessageLength(string sMessage)
+ {
return sMessage.Length + s_Newline_Length;
- }
+ }
- /// <summary>
- /// Determines how many messages of a fixed length can be logged
- /// to a single file before the file rolls.
- /// </summary>
- /// <param name="iMessageLength"></param>
- /// <returns></returns>
- private static int MessagesPerFile(int iMessageLength)
- {
- int iMessagesPerFile = c_iMaximumFileSize / iMessageLength;
+ /// <summary>
+ /// Determines how many messages of a fixed length can be logged
+ /// to a single file before the file rolls.
+ /// </summary>
+ /// <param name="iMessageLength"></param>
+ /// <returns></returns>
+ private static int MessagesPerFile(int iMessageLength)
+ {
+ int iMessagesPerFile = c_iMaximumFileSize / iMessageLength;
- //
- // RollingFileAppender checks for wrap BEFORE logging,
- // so we will actually get one more message per file than
- // we would otherwise.
- //
- if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize)
- {
- iMessagesPerFile++;
- }
+ //
+ // RollingFileAppender checks for wrap BEFORE logging,
+ // so we will actually get one more message per file than
+ // we would otherwise.
+ //
+ if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize)
+ {
+ iMessagesPerFile++;
+ }
- return iMessagesPerFile;
- }
+ return iMessagesPerFile;
+ }
- /// <summary>
- /// Determines the name of the current file
- /// </summary>
- /// <returns></returns>
- private static string GetCurrentFile()
- {
- // Current file name is always the base file name when
- // counting. Dates will need a different approach
- return c_fileName;
- }
+ /// <summary>
+ /// Determines the name of the current file
+ /// </summary>
+ /// <returns></returns>
+ private static string GetCurrentFile()
+ {
+ // Current file name is always the base file name when
+ // counting. Dates will need a different approach
+ return c_fileName;
+ }
- /// <summary>
- /// Turns a group of file names into an array of file entries that include the name
- /// and a size. This is useful for assigning the properties of backup files, when
- /// the length of the files are all the same size due to a fixed message length.
- /// </summary>
- /// <param name="sBackupGroup"></param>
- /// <param name="iBackupFileLength"></param>
- /// <returns></returns>
- private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength)
- {
- string[] sFiles = sBackupGroup.Split(' ');
+ /// <summary>
+ /// Turns a group of file names into an array of file entries that include the name
+ /// and a size. This is useful for assigning the properties of backup files, when
+ /// the length of the files are all the same size due to a fixed message length.
+ /// </summary>
+ /// <param name="sBackupGroup"></param>
+ /// <param name="iBackupFileLength"></param>
+ /// <returns></returns>
+ private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength)
+ {
+ string[] sFiles = sBackupGroup.Split(' ');
- ArrayList alEntries = new ArrayList();
+ ArrayList alEntries = new ArrayList();
- for(int i = 0; i < sFiles.Length; i++)
- {
- // Weed out any whitespace entries from the array
- if (sFiles[i].Trim().Length > 0)
- {
- alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength));
- }
- }
+ for (int i = 0; i < sFiles.Length; i++)
+ {
+ // Weed out any whitespace entries from the array
+ if (sFiles[i].Trim().Length > 0)
+ {
+ alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength));
+ }
+ }
- return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry));
- }
+ return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry));
+ }
- /// <summary>
- /// Finds the iGroup group in the string (comma separated groups)
- /// </summary>
- /// <param name="sBackupGroups"></param>
- /// <param name="iGroup"></param>
- /// <returns></returns>
- private static string GetBackupGroup(string sBackupGroups, int iGroup)
- {
- string[] sGroups = sBackupGroups.Split(',');
- return sGroups[iGroup];
- }
+ /// <summary>
+ /// Finds the iGroup group in the string (comma separated groups)
+ /// </summary>
+ /// <param name="sBackupGroups"></param>
+ /// <param name="iGroup"></param>
+ /// <returns></returns>
+ private static string GetBackupGroup(string sBackupGroups, int iGroup)
+ {
+ string[] sGroups = sBackupGroups.Split(',');
+ return sGroups[iGroup];
+ }
- ///// <summary>
- ///// Builds a collection of file entries based on the file names
- ///// specified in a groups string and the max file size from the
- ///// stats object
- ///// </summary>
- ///// <param name="sBackupGroups"></param>
- ///// <param name="stats"></param>
- ///// <returns></returns>
- //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats )
- //{
- // if (0 == stats.NumberOfFileRolls )
- // {
- // return null; // first round has no previous backups
- // }
- // string sGroup;
- // if (0 == stats.MessagesThisFile )
- // {
- // // first file has special pattern...since rolling doesn't occur when message
- // // is logged, rather before next message is logged.
- // if (stats.NumberOfFileRolls <= 1 )
- // {
- // return null;
- // }
- // // Use backup files from previous round. The minus 2 is because we have already
- // // rolled, and the first round uses null instead of the string
- // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 );
- // }
- // else
- // {
- // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 );
- // }
- // return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize );
- //}
+ ///// <summary>
+ ///// Builds a collection of file entries based on the file names
+ ///// specified in a groups string and the max file size from the
+ ///// stats object
+ ///// </summary>
+ ///// <param name="sBackupGroups"></param>
+ ///// <param name="stats"></param>
+ ///// <returns></returns>
+ //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats )
+ //{
+ // if (0 == stats.NumberOfFileRolls )
+ // {
+ // return null; // first round has no previous backups
+ // }
+ // string sGroup;
+ // if (0 == stats.MessagesThisFile )
+ // {
+ // // first file has special pattern...since rolling doesn't occur when message
+ // // is logged, rather before next message is logged.
+ // if (stats.NumberOfFileRolls <= 1 )
+ // {
+ // return null;
+ // }
+ // // Use backup files from previous round. The minus 2 is because we have already
+ // // rolled, and the first round uses null instead of the string
+ // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 );
+ // }
+ // else
+ // {
+ // sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 );
+ // }
+ // return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize );
+ //}
- /// <summary>
- /// Builds a collection of file entries based on the file names
- /// specified in a groups string and the max file size from the
- /// stats object
- /// </summary>
- /// <param name="sBackupGroups"></param>
- /// <param name="stats"></param>
- /// <returns></returns>
- private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats)
- {
- if (0 == stats.NumberOfFileRolls)
- {
- return null; // first round has no previous backups
- }
- string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1);
- return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize);
- }
+ /// <summary>
+ /// Builds a collection of file entries based on the file names
+ /// specified in a groups string and the max file size from the
+ /// stats object
+ /// </summary>
+ /// <param name="sBackupGroups"></param>
+ /// <param name="stats"></param>
+ /// <returns></returns>
+ private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats)
+ {
+ if (0 == stats.NumberOfFileRolls)
+ {
+ return null; // first round has no previous backups
+ }
+ string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1);
+ return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize);
+ }
- /// <summary>
- /// This class holds information that is used while we are generating
- /// test data sets
- /// </summary>
- public class RollingStats
- {
- private int iTotalMessageLength;
- private int iMessagesPerFile;
- private int iMessagesThisFile;
- private int iNumberOfFileRolls;
- /// <summary>
- /// Number of total bytes a log file can reach.
- /// </summary>
- public int MaximumFileSize
- {
- get { return TotalMessageLength * MessagesPerFile; }
- }
+ /// <summary>
+ /// This class holds information that is used while we are generating
+ /// test data sets
+ /// </summary>
+ public class RollingStats
+ {
+ private int iTotalMessageLength;
+ private int iMessagesPerFile;
+ private int iMessagesThisFile;
+ private int iNumberOfFileRolls;
- /// <summary>
- /// The length of a message, including any CR/LF characters.
- /// This length assumes all messages are a fixed length for
- /// test purposes.
- /// </summary>
- public int TotalMessageLength
- {
- get { return iTotalMessageLength; }
- set { iTotalMessageLength = value; }
- }
+ /// <summary>
+ /// Number of total bytes a log file can reach.
+ /// </summary>
+ public int MaximumFileSize
+ {
+ get { return TotalMessageLength * MessagesPerFile; }
+ }
- /// <summary>
- /// A count of the number of messages that are logged to each
- /// file.
- /// </summary>
- public int MessagesPerFile
- {
- get { return iMessagesPerFile; }
- set { iMessagesPerFile = value; }
- }
+ /// <summary>
+ /// The length of a message, including any CR/LF characters.
+ /// This length assumes all messages are a fixed length for
+ /// test purposes.
+ /// </summary>
+ public int TotalMessageLength
+ {
+ get { return iTotalMessageLength; }
+ set { iTotalMessageLength = value; }
+ }
- /// <summary>
- /// Counts how many messages have been logged to the current file
- /// </summary>
- public int MessagesThisFile
- {
- get { return iMessagesThisFile; }
- set { iMessagesThisFile = value; }
- }
+ /// <summary>
+ /// A count of the number of messages that are logged to each
+ /// file.
+ /// </summary>
+ public int MessagesPerFile
+ {
+ get { return iMessagesPerFile; }
+ set { iMessagesPerFile = value; }
+ }
- /// <summary>
- /// Counts how many times a file roll has occurred
- /// </summary>
- public int NumberOfFileRolls
- {
- get { return iNumberOfFileRolls; }
- set { iNumberOfFileRolls = value; }
- }
- }
+ /// <summary>
+ /// Counts how many messages have been logged to the current file
+ /// </summary>
+ public int MessagesThisFile
+ {
+ get { return iMessagesThisFile; }
+ set { iMessagesThisFile = value; }
+ }
- /// <summary>
- /// The stats are used to keep track of progress while we are algorithmically
- /// generating a table of pre/post condition tests for file rolling.
- /// </summary>
- /// <param name="sTestMessage"></param>
- /// <returns></returns>
- private static RollingStats InitializeStats(string sTestMessage)
- {
- RollingStats rollingStats = new RollingStats();
+ /// <summary>
+ /// Counts how many times a file roll has occurred
+ /// </summary>
+ public int NumberOfFileRolls
+ {
+ get { return iNumberOfFileRolls; }
+ set { iNumberOfFileRolls = value; }
+ }
+ }
- rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage);
- rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength);
- rollingStats.MessagesThisFile = 0;
- rollingStats.NumberOfFileRolls = 0;
+ /// <summary>
+ /// The stats are used to keep track of progress while we are algorithmically
+ /// generating a table of pre/post condition tests for file rolling.
+ /// </summary>
+ /// <param name="sTestMessage"></param>
+ /// <returns></returns>
+ private static RollingStats InitializeStats(string sTestMessage)
+ {
+ RollingStats rollingStats = new RollingStats();
- return rollingStats;
- }
+ rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage);
+ rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength);
+ rollingStats.MessagesThisFile = 0;
+ rollingStats.NumberOfFileRolls = 0;
- /// <summary>
- /// Takes an existing array of RollFileEntry objects, creates a new array one element
- /// bigger, and appends the final element to the end. If the existing entries are
- /// null (no entries), then a one-element array is returned with the final element
- /// as the only entry.
- /// </summary>
- /// <param name="existing"></param>
- /// <param name="final"></param>
- /// <returns></returns>
- private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final)
- {
- int iLength = 1;
- if (null != existing)
- {
- iLength += existing.Length;
- }
- RollFileEntry[] combined = new RollFileEntry[iLength];
- if (null != existing)
- {
- Array.Copy(existing, 0, combined, 0, existing.Length);
- }
- combined[iLength - 1] = final;
- return combined;
- }
+ return rollingStats;
+ }
- /// <summary>
- /// Generates the pre and post condition arrays from an array of backup files and the
- /// current file / next file.
- /// </summary>
- /// <param name="sBackupFiles"></param>
- /// <param name="preCondition"></param>
- /// <param name="current"></param>
- /// <param name="currentNext"></param>
- /// <param name="rollingStats"></param>
- /// <returns></returns>
- private static RollConditions BuildTableEntry(string sBackupFiles, RollConditions preCondition, RollFileEntry current, RollFileEntry currentNext, RollingStats rollingStats)
- {
- RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats);
- RollFileEntry[] post = AddFinalElement(backupsPost, currentNext);
- if (null == preCondition)
- {
- return new RollConditions(AddFinalElement(null, current), post);
- }
- return new RollConditions(preCondition.GetPostLogFileEntries(), post);
- }
+ /// <summary>
+ /// Takes an existing array of RollFileEntry objects, creates a new array one element
+ /// bigger, and appends the final element to the end. If the existing entries are
+ /// null (no entries), then a one-element array is returned with the final element
+ /// as the only entry.
+ /// </summary>
+ /// <param name="existing"></param>
+ /// <param name="final"></param>
+ /// <returns></returns>
+ private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final)
+ {
+ int iLength = 1;
+ if (null != existing)
+ {
+ iLength += existing.Length;
+ }
- /// <summary>
- /// Returns a RollFileEntry that represents the next state of the current file,
- /// based on the current state. When the current state would roll, the next
- /// entry is the current file wrapped to 0 bytes. Otherwise, the next state
- /// is the post-condition passed in as the currentNext parameter
- /// </summary>
- /// <param name="rollingStats"></param>
- /// <param name="currentNext"></param>
- /// <returns></returns>
- private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext)
- {
- rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1;
- if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile)
- {
- rollingStats.MessagesThisFile = 0;
- rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1;
+ RollFileEntry[] combined = new RollFileEntry[iLength];
+ if (null != existing)
+ {
+ Array.Copy(existing, 0, combined, 0, existing.Length);
+ }
- return new RollFileEntry(GetCurrentFile(), 0);
- }
- else
- {
- return currentNext;
- }
- }
+ combined[iLength - 1] = final;
+ return combined;
+ }
- /// <summary>
- /// Callback point for the regular expression parser. Turns
- /// the number into a file name.
- /// </summary>
- /// <param name="match"></param>
- /// <returns></returns>
- private static string NumberedNameMaker(Match match)
- {
- Int32 iValue = Int32.Parse(match.Value);
- return MakeFileName(c_fileName, iValue);
- }
+ /// <summary>
+ /// Generates the pre and post condition arrays from an array of backup files and the
+ /// current file / next file.
+ /// </summary>
+ /// <param name="sBackupFiles"></param>
+ /// <param name="preCondition"></param>
+ /// <param name="current"></param>
+ /// <param name="currentNext"></param>
+ /// <param name="rollingStats"></param>
+ /// <returns></returns>
+ private static RollConditions BuildTableEntry(string sBackupFiles,
+ RollConditions preCondition,
+ RollFileEntry current,
+ RollFileEntry currentNext,
+ RollingStats rollingStats)
+ {
+ RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats);
+ RollFileEntry[] post = AddFinalElement(backupsPost, currentNext);
+ if (null == preCondition)
+ {
+ return new RollConditions(AddFinalElement(null, current), post);
+ }
- /// <summary>
- /// Parses a numeric list of files, turning them into file names.
- /// Calls back to a method that does the actual replacement, turning
- /// the numeric value into a filename.
- /// </summary>
- /// <param name="sBackupInfo"></param>
- /// <param name="evaluator"></param>
- /// <returns></returns>
- private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator)
- {
- Regex regex = new Regex(@"\d+");
- return regex.Replace(sBackupInfo, evaluator);
- }
+ return new RollConditions(preCondition.GetPostLogFileEntries(), post);
+ }
- /// <summary>
- /// Makes test entries used for verifying counted file names
- /// </summary>
- /// <param name="sTestMessage">A message to log repeatedly</param>
- /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
- /// that results after each message is logged</param>
- /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
- /// <returns></returns>
- private static RollConditions[] MakeNumericTestEntries(string sTestMessage, string sBackupInfo, int iMessagesToLog)
- {
- return MakeTestEntries(
- sTestMessage,
- sBackupInfo,
- iMessagesToLog,
- new MatchEvaluator(NumberedNameMaker));
- }
+ /// <summary>
+ /// Returns a RollFileEntry that represents the next state of the current file,
+ /// based on the current state. When the current state would roll, the next
+ /// entry is the current file wrapped to 0 bytes. Otherwise, the next state
+ /// is the post-condition passed in as the currentNext parameter
+ /// </summary>
+ /// <param name="rollingStats"></param>
+ /// <param name="currentNext"></param>
+ /// <returns></returns>
+ private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext)
+ {
+ rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1;
+ if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile)
+ {
+ rollingStats.MessagesThisFile = 0;
+ rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1;
- /// <summary>
- /// This routine takes a list of backup file names and a message that will be logged
- /// repeatedly, and generates a collection of objects containing pre-condition and
- /// post-condition information. This pre/post information shows the names and expected
- /// file sizes for all files just before and just after a message is logged.
- /// </summary>
- /// <param name="sTestMessage">A message to log repeatedly</param>
- /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
- /// that results after each message is logged</param>
- /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
- /// <param name="evaluator">Function that can turn a number into a filename</param>
- /// <returns></returns>
- private static RollConditions[] MakeTestEntries(string sTestMessage, string sBackupInfo, int iMessagesToLog, MatchEvaluator evaluator)
- {
- string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator);
+ return new RollFileEntry(GetCurrentFile(), 0);
+ }
+ else
+ {
+ return currentNext;
+ }
+ }
- RollConditions[] table = new RollConditions[iMessagesToLog];
+ /// <summary>
+ /// Callback point for the regular expression parser. Turns
+ /// the number into a file name.
+ /// </summary>
+ /// <param name="match"></param>
+ /// <returns></returns>
+ private static string NumberedNameMaker(Match match)
+ {
+ Int32 iValue = Int32.Parse(match.Value);
+ return MakeFileName(c_fileName, iValue);
+ }
- RollingStats rollingStats = InitializeStats(sTestMessage);
+ /// <summary>
+ /// Parses a numeric list of files, turning them into file names.
+ /// Calls back to a method that does the actual replacement, turning
+ /// the numeric value into a filename.
+ /// </summary>
+ /// <param name="sBackupInfo"></param>
+ /// <param name="evaluator"></param>
+ /// <returns></returns>
+ private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator)
+ {
+ Regex regex = new Regex(@"\d+");
+ return regex.Replace(sBackupInfo, evaluator);
+ }
- RollConditions preCondition = null;
- rollingStats.MessagesThisFile = 0;
+ /// <summary>
+ /// Makes test entries used for verifying counted file names
+ /// </summary>
+ /// <param name="sTestMessage">A message to log repeatedly</param>
+ /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
+ /// that results after each message is logged</param>
+ /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
+ /// <returns></returns>
+ private static RollConditions[] MakeNumericTestEntries(string sTestMessage,
+ string sBackupInfo,
+ int iMessagesToLog)
+ {
+ return MakeTestEntries(
+ sTestMessage,
+ sBackupInfo,
+ iMessagesToLog,
+ new MatchEvaluator(NumberedNameMaker));
+ }
- RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0);
- for(int i = 0; i < iMessagesToLog; i++)
- {
- RollFileEntry currentNext = new RollFileEntry(
- GetCurrentFile(),
- (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength);
+ /// <summary>
+ /// This routine takes a list of backup file names and a message that will be logged
+ /// repeatedly, and generates a collection of objects containing pre-condition and
+ /// post-condition information. This pre/post information shows the names and expected
+ /// file sizes for all files just before and just after a message is logged.
+ /// </summary>
+ /// <param name="sTestMessage">A message to log repeatedly</param>
+ /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
+ /// that results after each message is logged</param>
+ /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
+ /// <param name="evaluator">Function that can turn a number into a filename</param>
+ /// <returns></returns>
+ private static RollConditions[] MakeTestEntries(string sTestMessage,
+ string sBackupInfo,
+ int iMessagesToLog,
+ MatchEvaluator evaluator)
+ {
+ string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator);
- table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats);
- preCondition = table[i];
+ RollConditions[] table = new RollConditions[iMessagesToLog];
- //System.Diagnostics.Debug.WriteLine( "Message " + i );
- //DumpTableEntry( table[i] );
+ RollingStats rollingStats = InitializeStats(sTestMessage);
- currentFile = MoveNextEntry(rollingStats, currentNext);
- }
+ RollConditions preCondition = null;
+ rollingStats.MessagesThisFile = 0;
- return table;
- }
+ RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0);
+ for (int i = 0; i < iMessagesToLog; i++)
+ {
+ RollFileEntry currentNext = new RollFileEntry(
+ GetCurrentFile(),
+ (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength);
- /// <summary>
- /// Uses the externally defined rolling table to verify rolling names/sizes
- /// </summary>
- /// <remarks>
- /// Pattern is: check pre-conditions. Log messages, checking size of current file.
- /// when size exceeds limit, check post conditions. Can determine from message the
- /// number of messages N that will cause a roll to occur. Challenge is to verify the
- /// expected files, their sizes, and the names. For a message of length L, the backups
- /// will be of size (N * L), and the current file will be of size (K * L), where K is
- /// the number of messages that have been logged to this file.
- ///
- /// File sizes can be checked algorithmically.
- ///
- /// File names are generated using a table driven algorithm, where a number is turned into
- /// the actual filename.
- ///
- /// The entries are comma-separated, with spaces between the names. Each comma indicates
- /// a 'roll', and the group between commas indicates the numbers for all backup files that
- /// occur as a result of the roll. It is assumed that no backup files exist before a roll
- /// occurs
- /// </remarks>
- /// <param name="table"></param>
- private void VerifyRolling(RollConditions[] table)
- {
- ConfigureRootAppender();
- RollFromTableEntries(c_fileName, table, GetTestMessage());
- }
+ table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats);
+ preCondition = table[i];
- /// <summary>
- /// Validates rolling using a fixed number of backup files, with
- /// count direction set to up, so that newer files have higher counts.
- /// Newest = N, Oldest = N-K, where K is the number of backups to allow
- /// and N is the number of times rolling has occurred.
- /// </summary>
- [Test]
- public void TestRollingCountUpFixedBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5";
+ //System.Diagnostics.Debug.WriteLine( "Message " + i );
+ //DumpTableEntry( table[i] );
- //
- // Count Up
- //
- _iCountDirection = +1;
+ currentFile = MoveNextEntry(rollingStats, currentNext);
+ }
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ return table;
+ }
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ /// <summary>
+ /// Uses the externally defined rolling table to verify rolling names/sizes
+ /// </summary>
+ /// <remarks>
+ /// Pattern is: check pre-conditions. Log messages, checking size of current file.
+ /// when size exceeds limit, check post conditions. Can determine from message the
+ /// number of messages N that will cause a roll to occur. Challenge is to verify the
+ /// expected files, their sizes, and the names. For a message of length L, the backups
+ /// will be of size (N * L), and the current file will be of size (K * L), where K is
+ /// the number of messages that have been logged to this file.
+ ///
+ /// File sizes can be checked algorithmically.
+ ///
+ /// File names are generated using a table driven algorithm, where a number is turned into
+ /// the actual filename.
+ ///
+ /// The entries are comma-separated, with spaces between the names. Each comma indicates
+ /// a 'roll', and the group between commas indicates the numbers for all backup files that
+ /// occur as a result of the roll. It is assumed that no backup files exist before a roll
+ /// occurs
+ /// </remarks>
+ /// <param name="table"></param>
+ private void VerifyRolling(RollConditions[] table)
+ {
+ ConfigureRootAppender();
+ RollFromTableEntries(c_fileName, table, GetTestMessage());
+ }
- /// <summary>
- /// Validates rolling using an infinite number of backup files, with
- /// count direction set to up, so that newer files have higher counts.
- /// Newest = N, Oldest = 1, where N is the number of times rolling has
- /// occurred.
- /// </summary>
- [Test]
- public void TestRollingCountUpInfiniteBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
+ /// <summary>
+ /// Validates rolling using a fixed number of backup files, with
+ /// count direction set to up, so that newer files have higher counts.
+ /// Newest = N, Oldest = N-K, where K is the number of backups to allow
+ /// and N is the number of times rolling has occurred.
+ /// </summary>
+ [Test]
+ public void TestRollingCountUpFixedBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5";
- //
- // Count Up
- //
- _iCountDirection = +1;
+ //
+ // Count Up
+ //
+ _iCountDirection = +1;
- //
- // Infinite backups
- //
- _MaxSizeRollBackups = -1;
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ /// <summary>
+ /// Validates rolling using an infinite number of backup files, with
+ /// count direction set to up, so that newer files have higher counts.
+ /// Newest = N, Oldest = 1, where N is the number of times rolling has
+ /// occurred.
+ /// </summary>
+ [Test]
+ public void TestRollingCountUpInfiniteBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
- /// <summary>
- /// Validates rolling with no backup files, with count direction set to up.
- /// Only the current file should be present, wrapping to 0 bytes once the
- /// previous file fills up.
- /// </summary>
- [Test]
- public void TestRollingCountUpZeroBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = ", , , , ";
+ //
+ // Count Up
+ //
+ _iCountDirection = +1;
+
+ //
+ // Infinite backups
+ //
+ _MaxSizeRollBackups = -1;
+
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
+
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
+
+ /// <summary>
+ /// Validates rolling with no backup files, with count direction set to up.
+ /// Only the current file should be present, wrapping to 0 bytes once the
+ /// previous file fills up.
+ /// </summary>
+ [Test]
+ public void TestRollingCountUpZeroBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = ", , , , ";
- //
- // Count Up
- //
- _iCountDirection = +1;
+ //
+ // Count Up
+ //
+ _iCountDirection = +1;
- //
- // No backups
- //
- _MaxSizeRollBackups = 0;
+ //
+ // No backups
+ //
+ _MaxSizeRollBackups = 0;
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
- /// <summary>
- /// Validates rolling using a fixed number of backup files, with
- /// count direction set to down, so that older files have higher counts.
- /// Newest = 1, Oldest = N, where N is the number of backups to allow
- /// </summary>
- [Test]
- public void TestRollingCountDownFixedBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3";
+ /// <summary>
+ /// Validates rolling using a fixed number of backup files, with
+ /// count direction set to down, so that older files have higher counts.
+ /// Newest = 1, Oldest = N, where N is the number of backups to allow
+ /// </summary>
+ [Test]
+ public void TestRollingCountDownFixedBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3";
- //
- // Count Up
- //
- _iCountDirection = -1;
+ //
+ // Count Up
+ //
+ _iCountDirection = -1;
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
- /// <summary>
- /// Validates rolling using an infinite number of backup files, with
- /// count direction set to down, so that older files have higher counts.
- /// Newest = 1, Oldest = N, where N is the number of times rolling has
- /// occurred
- /// </summary>
- [Test]
- public void TestRollingCountDownInfiniteBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
+ /// <summary>
+ /// Validates rolling using an infinite number of backup files, with
+ /// count direction set to down, so that older files have higher counts.
+ /// Newest = 1, Oldest = N, where N is the number of times rolling has
+ /// occurred
+ /// </summary>
+ [Test]
+ public void TestRollingCountDownInfiniteBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
- //
- // Count Down
- //
- _iCountDirection = -1;
+ //
+ // Count Down
+ //
+ _iCountDirection = -1;
- //
- // Infinite backups
- //
- _MaxSizeRollBackups = -1;
+ //
+ // Infinite backups
+ //
+ _MaxSizeRollBackups = -1;
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
- /// <summary>
- /// Validates rolling with no backup files, with count direction set to down.
- /// Only the current file should be present, wrapping to 0 bytes once the
- /// previous file fills up.
- /// </summary>
- [Test]
- public void TestRollingCountDownZeroBackups()
- {
- //
- // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
- // oldest, and 3 is the newest
- //
- string sBackupInfo = ", , , , ";
+ /// <summary>
+ /// Validates rolling with no backup files, with count direction set to down.
+ /// Only the current file should be present, wrapping to 0 bytes once the
+ /// previous file fills up.
+ /// </summary>
+ [Test]
+ public void TestRollingCountDownZeroBackups()
+ {
+ //
+ // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+ // oldest, and 3 is the newest
+ //
+ string sBackupInfo = ", , , , ";
- //
- // Count Up
- //
- _iCountDirection = -1;
+ //
+ // Count Up
+ //
+ _iCountDirection = -1;
- //
- // No backups
- //
- _MaxSizeRollBackups = 0;
+ //
+ // No backups
+ //
+ _MaxSizeRollBackups = 0;
- //
- // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
- // bytes for current file as messages are logged.
- //
- int iMessagesToLog = 30;
+ //
+ // Log 30 messages. This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500
+ // bytes for current file as messages are logged.
+ //
+ int iMessagesToLog = 30;
- VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
- }
+ VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+ }
- /// <summary>
- /// Configures the root appender for counting and rolling
- /// </summary>
- private void ConfigureRootAppender()
- {
- _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
- _root.Level = Level.Debug;
- _caRoot = new CountingAppender();
- _root.AddAppender(_caRoot);
- Assert.AreEqual(_caRoot.Counter, 0);
+ /// <summary>
+ /// Configures the root appender for counting and rolling
+ /// </summary>
+ private void ConfigureRootAppender()
+ {
+ _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+ _root.Level = Level.Debug;
+ _caRoot = new CountingAppender();
+ _root.AddAppender(_caRoot);
+ Assert.AreEqual(_caRoot.Counter, 0);
- //
- // Set the root appender with a RollingFileAppender
- //
- _root.AddAppender(CreateAppender());
+ //
+ // Set the root appender with a RollingFileAppender
+ //
+ _root.AddAppender(CreateAppender());
- _root.Repository.Configured = true;
- }
+ _root.Repository.Configured = true;
+ }
- /// <summary>
- /// Verifies that the current backup index is detected correctly when initializing
- /// </summary>
- /// <param name="sBaseFile"></param>
- /// <param name="alFiles"></param>
- /// <param name="iExpectedCurSizeRollBackups"></param>
- private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile, ArrayList alFiles, int iExpectedCurSizeRollBackups)
- {
- InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"), iExpectedCurSizeRollBackups);
- }
+ /// <summary>
+ /// Verifies that the current backup index is detected correctly when initializing
+ /// </summary>
+ /// <param name="sBaseFile"></param>
+ /// <param name="alFiles"></param>
+ /// <param name="iExpectedCurSizeRollBackups"></param>
+ private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile,
+ ArrayList alFiles,
+ int iExpectedCurSizeRollBackups)
+ {
+ InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"),
+ iExpectedCurSizeRollBackups);
+ }
- /// <summary>
- /// Tests that the current backup index is 0 when no
- /// existing files are seen
- /// </summary>
- [Test]
- public void TestInitializeRollBackups1()
- {
- string sBaseFile = "LogFile.log";
- ArrayList arrFiles = new ArrayList();
- arrFiles.Add("junk1");
- arrFiles.Add("junk1.log");
- arrFiles.Add("junk2.log");
- arrFiles.Add("junk.log.1");
- arrFiles.Add("junk.log.2");
+ /// <summary>
+ /// Tests that the current backup index is 0 when no
+ /// existing files are seen
+ /// </summary>
+ [Test]
+ public void TestInitializeRollBackups1()
+ {
+ string sBaseFile = "LogFile.log";
+ ArrayList arrFiles = new ArrayList();
+ arrFiles.Add("junk1");
+ arrFiles.Add("junk1.log");
+ arrFiles.Add("junk2.log");
+ arrFiles.Add("junk.log.1");
+ arrFiles.Add("junk.log.2");
- int iExpectedCurSizeRollBackups = 0;
- VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups);
- }
+ int iExpectedCurSizeRollBackups = 0;
+ VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups);
+ }
- /// <summary>
- /// Verifies that files are detected when the base file is specified
- /// </summary>
- /// <param name="sBaseFile"></param>
- private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile)
- {
- ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2");
+ /// <summary>
+ /// Verifies that files are detected when the base file is specified
+ /// </summary>
+ /// <param name="sBaseFile"></param>
+ private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile)
+ {
+ ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2");
- int iExpectedCurSizeRollBackups = 2;
- VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups);
- }
+ int iExpectedCurSizeRollBackups = 2;
+ VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountUpFixed()
- {
- ArrayList alFiles = MakeTestDataFromString("3,4,5");
- int iExpectedValue = 5;
- InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpFixed()
+ {
+ ArrayList alFiles = MakeTestDataFromString("3,4,5");
+ int iExpectedValue = 5;
+ InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountUpFixed2()
- {
- ArrayList alFiles = MakeTestDataFromString("0,3");
- int iExpectedValue = 3;
- InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpFixed2()
+ {
+ ArrayList alFiles = MakeTestDataFromString("0,3");
+ int iExpectedValue = 3;
+ InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
+ }
- /// <summary>
- /// Verifies that count stays at 0 for the zero backups case
- /// when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountUpZeroBackups()
- {
- ArrayList alFiles = MakeTestDataFromString("0,3");
- int iExpectedValue = 0;
- InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue);
- }
+ /// <summary>
+ /// Verifies that count stays at 0 for the zero backups case
+ /// when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpZeroBackups()
+ {
+ ArrayList alFiles = MakeTestDataFromString("0,3");
+ int iExpectedValue = 0;
+ InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue);
+ }
- /// <summary>
- /// Verifies that count stays at 0 for the zero backups case
- /// when counting down
- /// </summary>
- [Test]
- public void TestInitializeCountDownZeroBackups()
- {
- ArrayList alFiles = MakeTestDataFromString("0,3");
- int iExpectedValue = 0;
- InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue);
- }
+ /// <summary>
+ /// Verifies that count stays at 0 for the zero backups case
+ /// when counting down
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownZeroBackups()
+ {
+ ArrayList alFiles = MakeTestDataFromString("0,3");
+ int iExpectedValue = 0;
+ InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed()
- {
- ArrayList alFiles = MakeTestDataFromString("4,5,6");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed()
+ {
+ ArrayList alFiles = MakeTestDataFromString("4,5,6");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed2()
- {
- ArrayList alFiles = MakeTestDataFromString("1,5,6");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed2()
+ {
+ ArrayList alFiles = MakeTestDataFromString("1,5,6");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed3()
- {
- ArrayList alFiles = MakeTestDataFromString("2,5,6");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed3()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,5,6");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed4()
- {
- ArrayList alFiles = MakeTestDataFromString("3,5,6");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed4()
+ {
+ ArrayList alFiles = MakeTestDataFromString("3,5,6");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed5()
- {
- ArrayList alFiles = MakeTestDataFromString("1,2,3");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed5()
+ {
+ ArrayList alFiles = MakeTestDataFromString("1,2,3");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed6()
- {
- ArrayList alFiles = MakeTestDataFromString("1,2");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed6()
+ {
+ ArrayList alFiles = MakeTestDataFromString("1,2");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// </summary>
- [Test]
- public void TestInitializeCountDownFixed7()
- {
- ArrayList alFiles = MakeTestDataFromString("2,3");
- VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownFixed7()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,3");
+ VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+ }
- private static void InitializeAndVerifyExpectedValue(ArrayList alFiles, string sBaseFile, RollingFileAppender rfa, int iExpectedValue)
- {
- InitializeRollBackups(rfa, sBaseFile, alFiles);
- Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa));
- }
+ private static void InitializeAndVerifyExpectedValue(ArrayList alFiles,
+ string sBaseFile,
+ RollingFileAppender rfa,
+ int iExpectedValue)
+ {
+ InitializeRollBackups(rfa, sBaseFile, alFiles);
+ Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa));
+ }
- /// <summary>
- /// Tests the count down case, with infinite max backups, to see that
- /// initialization of the rolling file appender results in the expected value
- /// </summary>
- /// <param name="alFiles"></param>
- /// <param name="sBaseFile"></param>
- /// <param name="iExpectedValue"></param>
- private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue)
- {
- InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue);
- }
+ /// <summary>
+ /// Tests the count down case, with infinite max backups, to see that
+ /// initialization of the rolling file appender results in the expected value
+ /// </summary>
+ /// <param name="alFiles"></param>
+ /// <param name="sBaseFile"></param>
+ /// <param name="iExpectedValue"></param>
+ private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles,
+ string sBaseFile,
+ int iExpectedValue)
+ {
+ InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue);
+ }
- /// <summary>
- /// Creates a RollingFileAppender with the desired values, where the
- /// values are passed as a comma separated string, with 3 parameters,
- /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection
- /// </summary>
- /// <param name="sParams"></param>
- /// <returns></returns>
- private static RollingFileAppender CreateRollingFileAppender(string sParams)
- {
- string[] asParams = sParams.Split(',');
- if (null == asParams || asParams.Length != 3)
- {
- throw new ArgumentOutOfRangeException(sParams, sParams, "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection");
- }
+ /// <summary>
+ /// Creates a RollingFileAppender with the desired values, where the
+ /// values are passed as a comma separated string, with 3 parameters,
+ /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection
+ /// </summary>
+ /// <param name="sParams"></param>
+ /// <returns></returns>
+ private static RollingFileAppender CreateRollingFileAppender(string sParams)
+ {
+ string[] asParams = sParams.Split(',');
+ if (null == asParams || asParams.Length != 3)
+ {
+ throw new ArgumentOutOfRangeException(sParams, sParams,
+ "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection");
+ }
- RollingFileAppender rfa = new RollingFileAppender();
- rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
- SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim()));
- SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim()));
- rfa.CountDirection = Int32.Parse(asParams[2].Trim());
+ RollingFileAppender rfa = new RollingFileAppender();
+ rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
+ SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim()));
+ SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim()));
+ rfa.CountDirection = Int32.Parse(asParams[2].Trim());
- return rfa;
- }
+ return rfa;
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting down
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountDownInfinite()
- {
- ArrayList alFiles = MakeTestDataFromString("2,3");
- VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting down
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownInfinite()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,3");
+ VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting down
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountDownInfinite2()
- {
- ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
- VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting down
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownInfinite2()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
+ VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting down
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountDownInfinite3()
- {
- ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
- VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting down
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountDownInfinite3()
+ {
+ ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
+ VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountUpInfinite()
- {
- ArrayList alFiles = MakeTestDataFromString("2,3");
- VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpInfinite()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,3");
+ VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountUpInfinite2()
- {
- ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
- VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpInfinite2()
+ {
+ ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
+ VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
+ }
- /// <summary>
- /// Verifies that count goes to the highest when counting up
- /// and infinite backups are selected
- /// </summary>
- [Test]
- public void TestInitializeCountUpInfinite3()
- {
- ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
- VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
- }
+ /// <summary>
+ /// Verifies that count goes to the highest when counting up
+ /// and infinite backups are selected
+ /// </summary>
+ [Test]
+ public void TestInitializeCountUpInfinite3()
+ {
+ ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
+ VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
+ }
- /// <summary>
- /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
- /// </summary>
- /// <param name="filename">The filename to log to</param>
- /// <param name="lockModel">The locking model to use.</param>
- /// <param name="handler">The error handler to use.</param>
- /// <returns>A configured ILogger</returns>
- private static ILogger CreateLogger(string filename, FileAppender.LockingModelBase lockModel, IErrorHandler handler)
- {
- return CreateLogger(filename, lockModel, handler, 100000, 0);
- }
+ /// <summary>
+ /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
+ /// </summary>
+ /// <param name="filename">The filename to log to</param>
+ /// <param name="lockModel">The locking model to use.</param>
+ /// <param name="handler">The error handler to use.</param>
+ /// <returns>A configured ILogger</returns>
+ private static ILogger CreateLogger(string filename,
+ FileAppender.LockingModelBase lockModel,
+ IErrorHandler handler)
+ {
+ return CreateLogger(filename, lockModel, handler, 100000, 0);
+ }
- /// <summary>
- /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
- /// </summary>
- /// <param name="filename">The filename to log to</param>
- /// <param name="lockModel">The locking model to use.</param>
- /// <param name="handler">The error handler to use.</param>
- /// <param name="maxFileSize">Maximum file size for roll</param>
- /// <param name="maxSizeRollBackups">Maximum number of roll backups</param>
- /// <returns>A configured ILogger</returns>
- private static ILogger CreateLogger(string filename, FileAppender.LockingModelBase lockModel, IErrorHandler handler, int maxFileSize, int maxSizeRollBackups)
- {
- Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
+ /// <summary>
+ /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
+ /// </summary>
+ /// <param name="filename">The filename to log to</param>
+ /// <param name="lockModel">The locking model to use.</param>
+ /// <param name="handler">The error handler to use.</param>
+ /// <param name="maxFileSize">Maximum file size for roll</param>
+ /// <param name="maxSizeRollBackups">Maximum number of roll backups</param>
+ /// <returns>A configured ILogger</returns>
+ private static ILogger CreateLogger(string filename,
+ FileAppender.LockingModelBase lockModel,
+ IErrorHandler handler,
+ int maxFileSize,
+ int maxSizeRollBackups)
+ {
+ Repository.Hierarchy.Hierarchy h =
+ (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
- RollingFileAppender appender = new RollingFileAppender();
- appender.File = filename;
- appender.AppendToFile = false;
- appender.CountDirection = 0;
- appender.RollingStyle = RollingFileAppender.RollingMode.Size;
- appender.MaxFileSize = maxFileSize;
- appender.Encoding = Encoding.ASCII;
- appender.ErrorHandler = handler;
- appender.MaxSizeRollBackups = maxSizeRollBackups;
- if (lockModel != null)
- {
- appender.LockingModel = lockModel;
- }
+ RollingFileAppender appender = new RollingFileAppender();
+ appender.File = filename;
+ appender.AppendToFile = false;
+ appender.CountDirection = 0;
+ appender.RollingStyle = RollingFileAppender.RollingMode.Size;
+ appender.MaxFileSize = maxFileSize;
+ appender.Encoding = Encoding.ASCII;
+ appender.ErrorHandler = handler;
+ appender.MaxSizeRollBackups = maxSizeRollBackups;
+ if (lockModel != null)
+ {
+ appender.LockingModel = lockModel;
+ }
- PatternLayout layout = new PatternLayout();
- layout.ConversionPattern = "%m%n";
- layout.ActivateOptions();
+ PatternLayout layout = new PatternLayout();
+ layout.ConversionPattern = "%m%n";
+ layout.ActivateOptions();
- appender.Layout = layout;
- appender.ActivateOptions();
+ appender.Layout = layout;
+ appender.ActivateOptions();
- h.Root.AddAppender(appender);
- h.Configured = true;
+ h.Root.AddAppender(appender);
+ h.Configured = true;
- ILogger log = h.GetLogger("Logger");
- return log;
- }
+ ILogger log = h.GetLogger("Logger");
+ return log;
+ }
- /// <summary>
- /// Destroys the logger hierarchy created by <see cref="RollingFileAppenderTest.CreateLogger"/>
- /// </summary>
- private static void DestroyLogger()
- {
- Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
- h.ResetConfiguration();
- //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
- LoggerManager.RepositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
- }
+ /// <summary>
+ /// Destroys the logger hierarchy created by <see cref="RollingFileAppenderTest.CreateLogger"/>
+ /// </summary>
+ private static void DestroyLogger()
+ {
+ Repository.Hierarchy.Hierarchy h =
+ (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
+ h.ResetConfiguration();
+ //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
+ 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)
{
FileInfo fileinfo = new FileInfo(filename);
- StreamReader sr = new StreamReader(fileinfo.OpenRead());
- string logcont = sr.ReadToEnd();
- sr.Close();
+ StreamReader sr = new StreamReader(fileinfo.OpenRead());
+ string logcont = sr.ReadToEnd();
+ sr.Close();
- Assert.AreEqual(contents, logcont, "Log contents is not what is expected");
+ Assert.AreEqual(contents, logcont, "Log contents is not what is expected");
- File.Delete(filename);
- }
+ File.Delete(filename);
+ }
- /// <summary>
- /// Verifies that logging a message actually produces output
- /// </summary>
- [Test]
- public void TestLogOutput()
- {
- string filename ="test_simple.log";
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
+ /// <summary>
+ /// Verifies that logging a message actually produces output
+ /// </summary>
+ [Test]
+ public void TestLogOutput()
+ {
+ string filename = "test_simple.log";
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
- AssertFileEquals(filename, "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
- Assert.AreEqual("", sh.Message, "Unexpected error message");
- }
+ AssertFileEquals(filename,
+ "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+ Assert.AreEqual("", sh.Message, "Unexpected error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a locked file fails gracefully
- /// </summary>
- [Test]
- public void TestExclusiveLockFails()
- {
- string filename ="test_exclusive_lock_fails.log";
+ /// <summary>
+ /// Verifies that attempting to log to a locked file fails gracefully
+ /// </summary>
+ [Test]
+ public void TestExclusiveLockFails()
+ {
+ string filename = "test_exclusive_lock_fails.log";
- FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+ FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
- fs.Close();
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
+ fs.Close();
- AssertFileEquals(filename, "Test");
- Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file", "Expecting an error message");
- }
+ AssertFileEquals(filename, "Test");
+ Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file",
+ "Expecting an error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a locked file recovers if the lock is released
- /// </summary>
- [Test]
- public void TestExclusiveLockRecovers()
- {
- string filename ="test_exclusive_lock_recovers.log";
+ /// <summary>
+ /// Verifies that attempting to log to a locked file recovers if the lock is released
+ /// </summary>
+ [Test]
+ public void TestExclusiveLockRecovers()
+ {
+ string filename = "test_exclusive_lock_recovers.log";
- FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+ FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
- fs.Close();
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
+ fs.Close();
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
- AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
- Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
- }
+ AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+ Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+ "Expecting an error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a file with ExclusiveLock really locks the file
- /// </summary>
- [Test]
- public void TestExclusiveLockLocks()
- {
- string filename ="test_exclusive_lock_locks.log";
- bool locked = false;
+ /// <summary>
+ /// Verifies that attempting to log to a file with ExclusiveLock really locks the file
+ /// </summary>
+ [Test]
+ public void TestExclusiveLockLocks()
+ {
+ string filename = "test_exclusive_lock_locks.log";
+ bool locked = false;
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
- try
- {
- FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
- fs.Close();
- }
- catch(IOException e1)
- {
+ try
+ {
+ FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+ fs.Close();
+ }
+ catch (IOException e1)
+ {
#if MONO
Assert.AreEqual("Sharing violation on path ", e1.Message.Substring(0, 26), "Unexpected exception");
#else
- Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35), "Unexpected exception");
+ Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35),
+ "Unexpected exception");
#endif
- locked = true;
- }
+ locked = true;
+ }
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
- Assert.IsTrue(locked, "File was not locked");
+ Assert.IsTrue(locked, "File was not locked");
#if !MONO || MONO_3_5 || MONO_4_0 // at least on Linux with Mono 2.4 exclusive locking doesn't work as one would expect
- AssertFileEquals(filename, "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+ AssertFileEquals(filename,
+ "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
#endif
- Assert.AreEqual("", sh.Message, "Unexpected error message");
- }
+ Assert.AreEqual("", sh.Message, "Unexpected error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a locked file fails gracefully
- /// </summary>
- [Test]
- public void TestMinimalLockFails()
- {
- string filename ="test_minimal_lock_fails.log";
+ /// <summary>
+ /// Verifies that attempting to log to a locked file fails gracefully
+ /// </summary>
+ [Test]
+ public void TestMinimalLockFails()
+ {
+ string filename = "test_minimal_lock_fails.log";
- FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+ FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
- fs.Close();
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
+ fs.Close();
- AssertFileEquals(filename, "Test");
- Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
- }
+ AssertFileEquals(filename, "Test");
+ Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+ "Expecting an error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a locked file recovers if the lock is released
- /// </summary>
- [Test]
- public void TestMinimalLockRecovers()
- {
- string filename ="test_minimal_lock_recovers.log";
+ /// <summary>
+ /// Verifies that attempting to log to a locked file recovers if the lock is released
+ /// </summary>
+ [Test]
+ public void TestMinimalLockRecovers()
+ {
+ string filename = "test_minimal_lock_recovers.log";
- FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+ FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
- fs.Close();
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
+ fs.Close();
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
- AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
- Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
- }
+ AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+ Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+ "Expecting an error message");
+ }
- /// <summary>
- /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file
- /// </summary>
- [Test]
- public void TestMinimalLockUnlocks()
- {
- string filename ="test_minimal_lock_unlocks.log";
- bool locked;
+ /// <summary>
+ /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file
+ /// </summary>
+ [Test]
+ public void TestMinimalLockUnlocks()
+ {
+ string filename = "test_minimal_lock_unlocks.log";
+ bool locked;
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
- log.Log(GetType(), Level.Info, "This is a message", null);
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+ log.Log(GetType(), Level.Info, "This is a message", null);
- locked = true;
- FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None);
- fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
- fs.Close();
+ locked = true;
+ FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None);
+ fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
+ fs.Close();
- log.Log(GetType(), Level.Info, "This is a message 2", null);
- DestroyLogger();
+ log.Log(GetType(), Level.Info, "This is a message 2", null);
+ DestroyLogger();
- Assert.IsTrue(locked, "File was not locked");
- AssertFileEquals(filename, "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
- Assert.AreEqual("", sh.Message, "Unexpected error message");
- }
+ Assert.IsTrue(locked, "File was not locked");
+ AssertFileEquals(filename,
+ "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
+ Environment.NewLine);
+ Assert.AreEqual("", sh.Message, "Unexpected error message");
+ }
#if !NETCF
/// <summary>
/// Verifies that attempting to log to a locked file fails gracefully
/// </summary>
[Test]
- public void TestInterProcessLockFails() {
- string filename ="test_interprocess_lock_fails.log";
+ public void TestInterProcessLockFails()
+ {
+ string filename = "test_interprocess_lock_fails.log";
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
@@ -1708,15 +1765,17 @@
fs.Close();
AssertFileEquals(filename, "Test");
- Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
+ Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+ "Expecting an error message");
}
/// <summary>
/// Verifies that attempting to log to a locked file recovers if the lock is released
/// </summary>
[Test]
- public void TestInterProcessLockRecovers() {
- string filename ="test_interprocess_lock_recovers.log";
+ public void TestInterProcessLockRecovers()
+ {
+ string filename = "test_interprocess_lock_recovers.log";
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
@@ -1729,15 +1788,17 @@
DestroyLogger();
AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
- Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30), "Expecting an error message");
+ Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+ "Expecting an error message");
}
/// <summary>
/// Verifies that attempting to log to a file with InterProcessLock really locks the file
/// </summary>
[Test]
- public void TestInterProcessLockUnlocks() {
- string filename ="test_interprocess_lock_unlocks.log";
+ public void TestInterProcessLockUnlocks()
+ {
+ string filename = "test_interprocess_lock_unlocks.log";
bool locked;
SilentErrorHandler sh = new SilentErrorHandler();
@@ -1753,306 +1814,329 @@
DestroyLogger();
Assert.IsTrue(locked, "File was not locked");
- AssertFileEquals(filename, "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+ AssertFileEquals(filename,
+ "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
+ Environment.NewLine);
Assert.AreEqual("", sh.Message, "Unexpected error message");
}
- /// <summary>
- /// Verifies that rolling file works
- /// </summary>
- [Test]
- public void TestInterProcessLockRoll()
- {
- string filename ="test_interprocess_lock_roll.log";
+ /// <summary>
+ /// Verifies that rolling file works
+ /// </summary>
+ [Test]
+ public void TestInterProcessLockRoll()
+ {
+ string filename = "test_interprocess_lock_roll.log";
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2);
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2);
- Assert.DoesNotThrow(delegate { log.Log(GetType(), Level.Info, "A", null); });
- Assert.DoesNotThrow(delegate { log.Log(GetType(), Level.Info, "A", null); });
-
- DestroyLogger();
+ Assert.DoesNotThrow(delegate
+ {
+ log.Log(GetType(), Level.Info, "A", null);
+ });
+ Assert.DoesNotThrow(delegate
+ {
+ log.Log(GetType(), Level.Info, "A", null);
+ });
- AssertFileEquals(filename, "A" + Environment.NewLine);
- AssertFileEquals(filename + ".1", "A" + Environment.NewLine);
- Assert.IsEmpty(sh.Message);
- }
+ DestroyLogger();
+
+ AssertFileEquals(filename, "A" + Environment.NewLine);
+ AssertFileEquals(filename + ".1", "A" + Environment.NewLine);
+ Assert.IsEmpty(sh.Message);
+ }
#endif
/// <summary>
- /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour
- /// </summary>
- [Test]
- public void TestDefaultLockingModel()
- {
- string filename ="test_default.log";
+ /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour
+ /// </summary>
+ [Test]
+ public void TestDefaultLockingModel()
+ {
+ string filename = "test_default.log";
- SilentErrorHandler sh = new SilentErrorHandler();
- ILogger log = CreateLogger(filename, null, sh);
+ SilentErrorHandler sh = new SilentErrorHandler();
+ ILogger log = CreateLogger(filename, null, sh);
- IAppender[] appenders = log.Repository.GetAppenders();
- Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured");
+ IAppender[] appenders = log.Repository.GetAppenders();
+ Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured");
- RollingFileAppender rfa = (RollingFileAppender)(appenders[0]);
- Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(), "The LockingModel is of an unexpected type");
+ RollingFileAppender rfa = (RollingFileAppender)(appenders[0]);
+ Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(),
+ "The LockingModel is of an unexpected type");
- DestroyLogger();
- }
+ DestroyLogger();
+ }
- /// <summary>
- /// Tests the count up case, with infinite max backups , to see that
- /// initialization of the rolling file appender results in the expected value
- /// </summary>
- /// <param name="alFiles"></param>
- /// <param name="sBaseFile"></param>
- /// <param name="iExpectedValue"></param>
- private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue)
- {
- InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue);
- }
+ /// <summary>
+ /// Tests the count up case, with infinite max backups , to see that
+ /// initialization of the rolling file appender results in the expected value
+ /// </summary>
+ /// <param name="alFiles"></param>
+ /// <param name="sBaseFile"></param>
+ /// <param name="iExpectedValue"></param>
+ private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles,
+ string sBaseFile,
+ int iExpectedValue)
+ {
+ InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue);
+ }
- /// <summary>
- /// Tests the count down case, with max backups limited to 3, to see that
- /// initialization of the rolling file appender results in the expected value
- /// </summary>
- /// <param name="alFiles"></param>
- /// <param name="sBaseFile"></param>
- /// <param name="iExpectedValue"></param>
- private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles, string sBaseFile, int iExpectedValue)
- {
- InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue);
- }
+ /// <summary>
+ /// Tests the count down case, with max backups limited to 3, to see that
+ /// initialization of the rolling file appender results in the expected value
+ /// </summary>
+ /// <param name="alFiles"></param>
+ /// <param name="sBaseFile"></param>
+ /// <param name="iExpectedValue"></param>
+ private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles,
+ string sBaseFile,
+ int iExpectedValue)
+ {
+ InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue);
+ }
- /// <summary>
- /// Turns a string of comma separated numbers into a collection of filenames
- /// generated from the numbers.
- ///
- /// Defaults to filename in _fileName variable.
- ///
- /// </summary>
- /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
- /// <returns></returns>
- private static ArrayList MakeTestDataFromString(string sFileNumbers)
- {
- return MakeTestDataFromString(c_fileName, sFileNumbers);
- }
+ /// <summary>
+ /// Turns a string of comma separated numbers into a collection of filenames
+ /// generated from the numbers.
+ ///
+ /// Defaults to filename in _fileName variable.
+ ///
+ /// </summary>
+ /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
+ /// <returns></returns>
+ private static ArrayList MakeTestDataFromString(string sFileNumbers)
+ {
+ return MakeTestDataFromString(c_fileName, sFileNumbers);
+ }
- /// <summary>
- /// Turns a string of comma separated numbers into a collection of filenames
- /// generated from the numbers
- ///
- /// Uses the input filename.
- /// </summary>
- /// <param name="sFileName">Name of file to combine with numbers when generating counted file names</param>
- /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
- /// <returns></returns>
- private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers)
- {
- ArrayList alFiles = new ArrayList();
+ /// <summary>
+ /// Turns a string of comma separated numbers into a collection of filenames
+ /// generated from the numbers
+ ///
+ /// Uses the input filename.
+ /// </summary>
+ /// <param name="sFileName">Name of file to combine with numbers when generating counted file names</param>
+ /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
+ /// <returns></returns>
+ private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers)
+ {
+ ArrayList alFiles = new ArrayList();
- string[] sNumbers = sFileNumbers.Split(',');
- foreach(string sNumber in sNumbers)
- {
- Int32 iValue = Int32.Parse(sNumber.Trim());
- alFiles.Add(MakeFileName(sFileName, iValue));
- }
+ string[] sNumbers = sFileNumbers.Split(',');
+ foreach (string sNumber in sNumbers)
+ {
+ Int32 iValue = Int32.Parse(sNumber.Trim());
+ alFiles.Add(MakeFileName(sFileName, iValue));
+ }
- return alFiles;
- }
+ return alFiles;
+ }
- /// <summary>
- /// Tests that the current backup index is correctly detected
- /// for a file with no extension
- /// </summary>
- [Test]
- public void TestInitializeRollBackups2()
- {
- VerifyInitializeRollBackupsFromBaseFile("LogFile");
- }
+ /// <summary>
+ /// Tests that the current backup index is correctly detected
+ /// for a file with no extension
+ /// </summary>
+ [Test]
+ public void TestInitializeRollBackups2()
+ {
+ VerifyInitializeRollBackupsFromBaseFile("LogFile");
+ }
- /// <summary>
- /// Tests that the current backup index is correctly detected
- /// for a file with a .log extension
- /// </summary>
- [Test]
- public void TestInitializeRollBackups3()
- {
- VerifyInitializeRollBackupsFromBaseFile("LogFile.log");
- }
+ /// <summary>
+ /// Tests that the current backup index is correctly detected
+ /// for a file with a .log extension
+ /// </summary>
+ [Test]
+ public void TestInitializeRollBackups3()
+ {
+ VerifyInitializeRollBackupsFromBaseFile("LogFile.log");
+ }
- /// <summary>
- /// Makes sure that the initialization can detect the backup
- /// number correctly.
- /// </summary>
- /// <param name="iBackups"></param>
- /// <param name="iMaxSizeRollBackups"></param>
- public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups)
- {
- string sBaseFile = "LogFile.log";
- ArrayList arrFiles = new ArrayList();
- arrFiles.Add("junk1");
- for(int i = 0; i < iBackups; i++)
- {
- arrFiles.Add(MakeFileName(sBaseFile, i));
- }
- RollingFileAppender rfa = new RollingFileAppender();
- rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
- SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups);
- SetFieldCurSizeRollBackups(rfa, 0);
- InitializeRollBackups(rfa, sBaseFile, arrFiles);
+ /// <summary>
+ /// Makes sure that the initialization can detect the backup
+ /// number correctly.
+ /// </summary>
+ /// <param name="iBackups"></param>
+ /// <param name="iMaxSizeRollBackups"></param>
+ public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups)
+ {
+ string sBaseFile = "LogFile.log";
+ ArrayList arrFiles = new ArrayList();
+ arrFiles.Add("junk1");
+ for (int i = 0; i < iBackups; i++)
+ {
+ arrFiles.Add(MakeFileName(sBaseFile, i));
+ }
- // iBackups / Meaning
- // 0 = none
- // 1 = file.log
- // 2 = file.log.1
- // 3 = file.log.2
- if (0 == iBackups ||
- 1 == iBackups)
- {
- Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa));
- }
- else
- {
- Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa));
- }
- }
+ RollingFileAppender rfa = new RollingFileAppender();
+ rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
+ SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups);
+ SetFieldCurSizeRollBackups(rfa, 0);
+ InitializeRollBackups(rfa, sBaseFile, arrFiles);
- /// <summary>
- /// Tests that the current backup index is correctly detected,
- /// and gets no bigger than the max backups setting
- /// </summary>
- [Test]
- public void TestInitializeRollBackups4()
- {
- const int iMaxRollBackups = 5;
- VerifyInitializeRollBackups(0, iMaxRollBackups);
- VerifyInitializeRollBackups(1, iMaxRollBackups);
- VerifyInitializeRollBackups(2, iMaxRollBackups);
- VerifyInitializeRollBackups(3, iMaxRollBackups);
- VerifyInitializeRollBackups(4, iMaxRollBackups);
- VerifyInitializeRollBackups(5, iMaxRollBackups);
- VerifyInitializeRollBackups(6, iMaxRollBackups);
- // Final we cap out at the max value
- VerifyInitializeRollBackups(7, iMaxRollBackups);
- VerifyInitializeRollBackups(8, iMaxRollBackups);
- }
+ // iBackups / Meaning
+ // 0 = none
+ // 1 = file.log
+ // 2 = file.log.1
+ // 3 = file.log.2
+ if (0 == iBackups ||
+ 1 == iBackups)
+ {
+ Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa));
+ }
+ else
+ {
+ Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa));
+ }
+ }
- /// <summary>
- ///
- /// </summary>
- [Test, Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")]
- public void TestInitialization3()
- {
- }
+ /// <summary>
+ /// Tests that the current backup index is correctly detected,
+ /// and gets no bigger than the max backups setting
+ /// </summary>
+ [Test]
+ public void TestInitializeRollBackups4()
+ {
+ const int iMaxRollBackups = 5;
+ VerifyInitializeRollBackups(0, iMaxRollBackups);
+ VerifyInitializeRollBackups(1, iMaxRollBackups);
+ VerifyInitializeRollBackups(2, iMaxRollBackups);
+ VerifyInitializeRollBackups(3, iMaxRollBackups);
+ VerifyInitializeRollBackups(4, iMaxRollBackups);
+ VerifyInitializeRollBackups(5, iMaxRollBackups);
+ VerifyInitializeRollBackups(6, iMaxRollBackups);
+ // Final we cap out at the max value
+ VerifyInitializeRollBackups(7, iMaxRollBackups);
+ VerifyInitializeRollBackups(8, iMaxRollBackups);
+ }
- /// <summary>
- ///
- /// </summary>
- [Test, Ignore("Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")]
- public void TestInitialization4()
- {
- }
+ /// <summary>
+ ///
+ /// </summary>
+ [Test,
+ Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")]
+ public void TestInitialization3()
+ {
+ }
- /// <summary>
- ///
- /// </summary>
- [Test, Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")]
- public void TestInitialization5()
- {
- }
+ /// <summary>
+ ///
+ /// </summary>
+ [Test,
+ Ignore(
+ "Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")]
+ public void TestInitialization4()
+ {
+ }
- /// <summary>
- ///
- /// </summary>
- [Test, Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")]
- public void TestInitialization6()
- {
- }
+ /// <summary>
+ ///
+ /// </summary>
+ [Test,
+ Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")]
+ public void TestInitialization5()
+ {
+ }
- /// <summary>
- ///
- /// </summary>
- [Test, Ignore("Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")]
- public void TestInitialization7()
- {
- }
+ /// <summary>
+ ///
+ /// </summary>
+ [Test,
+ Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")]
+ public void TestInitialization6()
+ {
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ [Test,
+ Ignore(
+ "Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")]
+ public void TestInitialization7()
+ {
+ }
- //
- // Helper functions to dig into the appender
- //
+ //
+ // Helper functions to dig into the appender
+ //
- private static ArrayList GetExistingFiles(string baseFilePath)
- {
- return GetExistingFiles(baseFilePath, false);
- }
- private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension)
- {
- RollingFileAppender appender = new RollingFileAppender();
- appender.PreserveLogFileNameExtension = preserveLogFileNameExtension;
- appender.SecurityContext = NullSecurityContext.Instance;
+ private static ArrayList GetExistingFiles(string baseFilePath)
+ {
+ return GetExistingFiles(baseFilePath, false);
+ }
- return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath);
- }
+ private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension)
+ {
+ RollingFileAppender appender = new RollingFileAppender();
+ appender.PreserveLogFileNameExtension = preserveLogFileNameExtension;
+ appender.SecurityContext = NullSecurityContext.Instance;
- private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles)
- {
- Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles);
- }
+ return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath);
+ }
- private static int GetFieldCurSizeRollBackups(RollingFileAppender appender)
- {
- return (int)Utils.GetField(appender, "m_curSizeRollBackups");
- }
+ private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles)
+ {
+ Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles);
+ }
- private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val)
- {
- Utils.SetField(appender, "m_curSizeRollBackups", val);
- }
+ private static int GetFieldCurSizeRollBackups(RollingFileAppender appender)
+ {
+ return (int)Utils.GetField(appender, "m_curSizeRollBackups");
+ }
- private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val)
- {
- Utils.SetField(appender, "m_maxSizeRollBackups", val);
- }
+ private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val)
+ {
+ Utils.SetField(appender, "m_curSizeRollBackups", val);
+ }
- private static string GetTestMessage()
- {
- switch (Environment.NewLine.Length)
- {
- case 2:
- return c_testMessage98Chars;
+ private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val)
+ {
+ Utils.SetField(appender, "m_maxSizeRollBackups", val);
+ }
- case 1:
- return c_testMessage99Chars;
+ private static string GetTestMessage()
+ {
+ switch (Environment.NewLine.Length)
+ {
+ case 2:
+ return c_testMessage98Chars;
- default:
- throw new Exception("Unexpected Environment.NewLine.Length");
- }
- }
- }
+ case 1:
+ return c_testMessage99Chars;
- [TestFixture]
- public class RollingFileAppenderSubClassTest : RollingFileAppender
- {
- [Test]
- public void TestComputeCheckPeriod()
- {
- RollingFileAppender rfa = new RollingFileAppender();
+ default:
+ throw new Exception("Unexpected Environment.NewLine.Length");
+ }
+ }
+ }
- Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"), "TopOfMinute pattern");
- Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern");
- Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern");
- Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern");
- Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern");
+ [TestFixture]
+ public class RollingFileAppenderSubClassTest : RollingFileAppender
+ {
+ [Test]
+ public void TestComputeCheckPeriod()
+ {
+ RollingFileAppender rfa = new RollingFileAppender();
- // Test invalid roll point
- Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern");
- }
+ Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"),
+ "TopOfMinute pattern");
+ Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern");
+ Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern");
+ Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern");
+ Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern");
- private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern)
- {
- return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern);
- }
- }
-}
+ // Test invalid roll point
+ Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern");
+ }
+
+ private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern)
+ {
+ return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs
index f53dd78..d6aef10 100644
--- a/src/log4net/Appender/RollingFileAppender.cs
+++ b/src/log4net/Appender/RollingFileAppender.cs
@@ -470,7 +470,7 @@
m_rollDate = false;
m_rollSize = false;
- this.AppendToFile = false;
+ AppendToFile = false;
break;
case RollingMode.Size:
@@ -623,7 +623,7 @@
#endif
if (m_rollDate)
{
- DateTime n = m_dateTime.Now;
+ var n = m_dateTime.Now;
if (n >= m_nextCheck)
{
m_now = n;
@@ -729,7 +729,7 @@
if (m_rollDate)
{
- fileName = CombinePath(fileName, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo));
+ fileName = CombinePath(fileName, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
}
if (m_countDirection >= 0)
@@ -757,11 +757,11 @@
using(SecurityContext.Impersonate(this))
{
- fullPath = System.IO.Path.GetFullPath(m_baseFileName);
- fileName = System.IO.Path.GetFileName(fullPath);
+ fullPath = Path.GetFullPath(m_baseFileName);
+ fileName = Path.GetFileName(fullPath);
}
- ArrayList arrayFiles = GetExistingFiles(fullPath);
+ var arrayFiles = GetExistingFiles(fullPath);
InitializeRollBackups(fileName, arrayFiles);
LogLog.Debug(declaringType, "curSizeRollBackups starts at ["+m_curSizeRollBackups+"]");
@@ -793,26 +793,26 @@
/// <returns></returns>
private ArrayList GetExistingFiles(string baseFilePath)
{
- ArrayList alFiles = new ArrayList();
+ var alFiles = new ArrayList();
string directory = null;
using(SecurityContext.Impersonate(this))
{
- string fullPath = Path.GetFullPath(baseFilePath);
+ var fullPath = Path.GetFullPath(baseFilePath);
directory = Path.GetDirectoryName(fullPath);
if (Directory.Exists(directory))
{
- string baseFileName = Path.GetFileName(fullPath);
+ var baseFileName = Path.GetFileName(fullPath);
- string[] files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName));
+ var files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName));
if (files != null)
{
- for (int i = 0; i < files.Length; i++)
+ for (var i = 0; i < files.Length; i++)
{
- string curFileName = Path.GetFileName(files[i]);
+ var curFileName = Path.GetFileName(files[i]);
if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName)))
{
alFiles.Add(curFileName);
@@ -849,11 +849,11 @@
}
#endif
}
- LogLog.Debug(declaringType, "["+last.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo)+"] vs. ["+m_now.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo)+"]");
+ LogLog.Debug(declaringType, "["+last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"] vs. ["+m_now.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"]");
- if (!(last.ToString(m_datePattern,System.Globalization.DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo))))
+ if (!(last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo))))
{
- m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo));
+ m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
LogLog.Debug(declaringType, "Initial roll over to ["+m_scheduledFilename+"]");
RollOverTime(false);
LogLog.Debug(declaringType, "curSizeRollBackups after rollOver at ["+m_curSizeRollBackups+"]");
@@ -881,29 +881,33 @@
RollOverIfDateBoundaryCrossing();
// If file exists and we are not appending then roll it out of the way
- if (AppendToFile == false)
+ if (AppendToFile != false)
{
- bool fileExists = false;
- string fileName = GetNextOutputFileName(m_baseFileName);
+ return;
+ }
- using(SecurityContext.Impersonate(this))
- {
- fileExists = System.IO.File.Exists(fileName);
- }
+ bool fileExists;
+ var fileName = GetNextOutputFileName(m_baseFileName);
- if (fileExists)
- {
- if (m_maxSizeRollBackups == 0)
- {
- LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file.");
- }
- else
- {
- LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. Not appending to file. Rolling existing file out of the way.");
+ using(SecurityContext.Impersonate(this))
+ {
+ fileExists = System.IO.File.Exists(fileName);
+ }
- RollOverRenameFiles(fileName);
- }
- }
+ if (!fileExists)
+ {
+ return;
+ }
+
+ if (m_maxSizeRollBackups == 0)
+ {
+ LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file.");
+ }
+ else
+ {
+ LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. Not appending to file. Rolling existing file out of the way.");
+
+ RollOverRenameFiles(fileName);
}
}
@@ -918,6 +922,8 @@
/// <param name="curFileName"></param>
private void InitializeFromOneFile(string baseFile, string curFileName)
{
+ curFileName = curFileName.ToLower();
+ baseFile = baseFile.ToLower();
if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFile)) == false)
{
// This is not a log file, so ignore
@@ -929,24 +935,16 @@
return;
}
- /*
- if (m_staticLogFileName)
- {
- int endLength = curFileName.Length - index;
- if (baseFile.Length + endLength != curFileName.Length)
- {
- // file is probably scheduledFilename + .x so I don't care
- return;
- }
- }
- */
-
// Only look for files in the current roll point
if (m_rollDate && !m_staticLogFileName)
{
- string date = m_dateTime.Now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
- string prefix = m_preserveLogFileNameExtension ? Path.GetFileNameWithoutExtension(baseFile) + date : baseFile + date;
- string suffix = m_preserveLogFileNameExtension ? Path.GetExtension(baseFile) : "";
+ var date = m_dateTime.Now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).ToLower();
+ var prefix = (m_preserveLogFileNameExtension
+ ? Path.GetFileNameWithoutExtension(baseFile) + date
+ : baseFile + date).ToLower();
+ var suffix = m_preserveLogFileNameExtension
+ ? Path.GetExtension(baseFile).ToLower()
+ : "";
if (!curFileName.StartsWith(prefix) || !curFileName.EndsWith(suffix))
{
LogLog.Debug(declaringType, "Ignoring file ["+curFileName+"] because it is from a different date period");
@@ -957,7 +955,7 @@
try
{
// Bump the counter up to the highest count seen so far
- int backup = GetBackUpIndex(curFileName);
+ var backup = GetBackUpIndex(curFileName);
// caution: we might get a false positive when certain
// date patterns such as yyyyMMdd are used...those are
@@ -1013,15 +1011,15 @@
/// <returns></returns>
private int GetBackUpIndex(string curFileName)
{
- int backUpIndex = -1;
- string fileName = curFileName;
+ var backUpIndex = -1;
+ var fileName = curFileName;
if (m_preserveLogFileNameExtension)
{
fileName = Path.GetFileNameWithoutExtension(fileName);
}
- int index = fileName.LastIndexOf(".");
+ var index = fileName.LastIndexOf(".");
if (index > 0)
{
// if the "yyyy-MM-dd" component of file.log.yyyy-MM-dd is passed to TryParse
@@ -1043,7 +1041,7 @@
{
if (null != arrayFiles)
{
- string baseFileLower = baseFile.ToLowerInvariant();
+ var baseFileLower = baseFile.ToLowerInvariant();
foreach(string curFileName in arrayFiles)
{
@@ -1072,13 +1070,13 @@
// purposes to calculate the resolution of the date pattern.
// Get string representation of base line date
- string r0 = s_date1970.ToString(datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
+ var r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
// Check each type of rolling mode starting with the smallest increment.
- for(int i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++)
+ for(var i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++)
{
// Get string representation of next pattern
- string r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
+ var r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
LogLog.Debug(declaringType, "Type = ["+i+"], r0 = ["+r0+"], r1 = ["+r1+"]");
@@ -1169,7 +1167,7 @@
if (m_rollDate && File != null && m_scheduledFilename == null)
{
- m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo));
+ m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
}
ExistingInit();
@@ -1189,7 +1187,7 @@
/// <returns></returns>
private string CombinePath(string path1, string path2)
{
- string extension = Path.GetExtension(path1);
+ var extension = Path.GetExtension(path1);
if (m_preserveLogFileNameExtension && extension.Length > 0)
{
return Path.Combine(Path.GetDirectoryName(path1), Path.GetFileNameWithoutExtension(path1) + path2 + extension);
@@ -1225,7 +1223,7 @@
//is the new file name equivalent to the 'current' one
//something has gone wrong if we hit this -- we should only
//roll over if the new file will be different from the old
- string dateFormat = m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
+ var dateFormat = m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo);
if (m_scheduledFilename.Equals(CombinePath(File, dateFormat)))
{
ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File, dateFormat));
@@ -1235,14 +1233,14 @@
if (fileIsOpen)
{
// close current file, and rename it to datedFilename
- this.CloseFile();
+ CloseFile();
}
//we may have to roll over a large number of backups here
- for (int i = 1; i <= m_curSizeRollBackups; i++)
+ for (var i = 1; i <= m_curSizeRollBackups; i++)
{
- string from = CombinePath(File, "." + i);
- string to = CombinePath(m_scheduledFilename, "." + i);
+ var from = CombinePath(File, "." + i);
+ var to = CombinePath(m_scheduledFilename, "." + i);
RollFile(from, to);
}
@@ -1253,7 +1251,7 @@
m_curSizeRollBackups = 0;
//new scheduled name
- m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo));
+ m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
if (fileIsOpen)
{
@@ -1336,11 +1334,11 @@
{
// We may not have permission to delete the file, or the file may be locked
- string fileToDelete = fileName;
+ var fileToDelete = fileName;
// Try to move the file to temp name.
// If the file is locked we may still be able to move it
- string tempFileName = fileName + "." + Environment.TickCount + ".DeletePending";
+ var tempFileName = fileName + "." + Environment.TickCount + ".DeletePending";
try
{
using(SecurityContext.Impersonate(this))
@@ -1408,7 +1406,7 @@
/// </remarks>
protected void RollOverSize()
{
- this.CloseFile(); // keep windows happy.
+ CloseFile(); // keep windows happy.
LogLog.Debug(declaringType, "rolling over count ["+((CountingQuietTextWriter)QuietWriter).Count+"]");
LogLog.Debug(declaringType, "maxSizeRollBackups ["+m_maxSizeRollBackups+"]");
@@ -1467,7 +1465,7 @@
}
// Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
- for (int i = m_curSizeRollBackups; i >= 1; i--)
+ for (var i = m_curSizeRollBackups; i >= 1; i--)
{
RollFile((CombinePath(baseFileName, "." + i)), (CombinePath(baseFileName, "." + (i + 1))));
}
@@ -1483,7 +1481,7 @@
if (m_curSizeRollBackups >= m_maxSizeRollBackups && m_maxSizeRollBackups > 0)
{
//delete the first and keep counting up.
- int oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups;
+ var oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups;
// If static then there is 1 file without a number, therefore 1 less archive
if (m_staticLogFileName)
@@ -1494,14 +1492,14 @@
// If using a static log file then the base for the numbered sequence is the baseFileName passed in
// If not using a static log file then the baseFileName will already have a numbered postfix which
// we must remove, however it may have a date postfix which we must keep!
- string archiveFileBaseName = baseFileName;
+ var archiveFileBaseName = baseFileName;
if (!m_staticLogFileName)
{
if (m_preserveLogFileNameExtension)
{
- string extension = Path.GetExtension(archiveFileBaseName);
- string baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName);
- int lastDotIndex = baseName.LastIndexOf(".");
+ var extension = Path.GetExtension(archiveFileBaseName);
+ var baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName);
+ var lastDotIndex = baseName.LastIndexOf(".");
if (lastDotIndex >= 0)
{
archiveFileBaseName = baseName.Substring(0, lastDotIndex) + extension;
@@ -1509,7 +1507,7 @@
}
else
{
- int lastDotIndex = archiveFileBaseName.LastIndexOf(".");
+ var lastDotIndex = archiveFileBaseName.LastIndexOf(".");
if (lastDotIndex >= 0)
{
archiveFileBaseName = archiveFileBaseName.Substring(0, lastDotIndex);
@@ -1554,7 +1552,7 @@
protected DateTime NextCheckDate(DateTime currentDateTime, RollPoint rollPoint)
{
// Local variable to work on (this does not look very efficient)
- DateTime current = currentDateTime;
+ var current = currentDateTime;
// Do slightly different things depending on what the type of roll point we want.
switch(rollPoint)
diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs
index 26b76ba..8abb555 100644
--- a/src/log4net/Core/LoggingEvent.cs
+++ b/src/log4net/Core/LoggingEvent.cs
@@ -922,7 +922,7 @@
public string UserName =>
m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText;
- private static string TryGetCurrentUserName()
+ private string TryGetCurrentUserName()
{
#if (NETCF || SSCLI || NETSTANDARD1_3)
// On compact framework there's no notion of current Windows user
@@ -937,10 +937,8 @@
try
{
- using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent())
- {
- return windowsIdentity?.Name ?? "";
- }
+ return _cachedWindowsIdentityUserName ??=
+ TryReadWindowsIdentityUserName();
}
catch (PlatformNotSupportedException)
{
@@ -963,6 +961,16 @@
}
#endif
}
+
+#if (NETCF || SSCLI || NETSTANDARD1_3)
+#else
+ private string _cachedWindowsIdentityUserName;
+ private static string TryReadWindowsIdentityUserName()
+ {
+ using var identity = WindowsIdentity.GetCurrent();
+ return identity?.Name ?? "";
+ }
+#endif
#if (NETCF || SSCLI || NETSTANDARD1_3)
#else
@@ -1464,10 +1472,23 @@
// TODO: Add Repository Properties
// event properties
- var eventProperties = new PropertiesDictionary();
- eventProperties[UserNameProperty] = UserName;
- eventProperties[IdentityProperty] = Identity;
- compositeProperties.Add(eventProperties);
+ var shouldFixUserName = (m_fixFlags & FixFlags.UserName) != 0;
+ var shouldFixIdentity = (m_fixFlags & FixFlags.Identity) != 0;
+ if (shouldFixIdentity || shouldFixUserName)
+ {
+ var eventProperties = new PropertiesDictionary();
+ if (shouldFixUserName)
+ {
+ eventProperties[UserNameProperty] = UserName;
+ }
+
+ if (shouldFixIdentity)
+ {
+ eventProperties[IdentityProperty] = Identity;
+ }
+
+ compositeProperties.Add(eventProperties);
+ }
compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties());
m_compositeProperties = compositeProperties;