nicko 2005/06/08 10:13:40 Modified: src/Appender BufferingAppenderSkeleton.cs tests/src log4net.Tests.csproj tests/src/Appender CountingAppender.cs Added: tests/src/Appender BufferingAppenderTest.cs Log: Fix and tests for LOG4NET-32 AdoNetAppender losing first entry Revision Changes Path 1.10 +30 -8 logging-log4net/src/Appender/BufferingAppenderSkeleton.cs Index: BufferingAppenderSkeleton.cs =================================================================== RCS file: /home/cvs/logging-log4net/src/Appender/BufferingAppenderSkeleton.cs,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- BufferingAppenderSkeleton.cs 16 Apr 2005 23:42:42 -0000 1.9 +++ BufferingAppenderSkeleton.cs 8 Jun 2005 17:13:39 -0000 1.10 @@ -431,17 +431,39 @@ // Add to the buffer, returns the event discarded from the buffer if there is no space remaining after the append
LoggingEvent discardedLoggingEvent = m_cb.Append(loggingEvent); - // Check if the discarded event should be logged - if (discardedLoggingEvent != null && m_lossyEvaluator != null && m_lossyEvaluator.IsTriggeringEvent(discardedLoggingEvent)) + if (discardedLoggingEvent != null) { - SendBuffer(new LoggingEvent[] { discardedLoggingEvent } ); + // Buffer is full and has had to discard an event + if (!m_lossy) + { + // Not lossy, must send all events + SendBuffer(new LoggingEvent[] { discardedLoggingEvent } ); + SendBuffer(m_cb); + } + else + { + // Check if the discarded event should be logged + if (m_lossyEvaluator != null && m_lossyEvaluator.IsTriggeringEvent(discardedLoggingEvent)) + { + SendBuffer(new LoggingEvent[] { discardedLoggingEvent } ); + } + + // Check if the event should trigger the whole buffer to be sent + if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent)) + { + SendBuffer(m_cb); + } + } } - - // If the buffer is full & not lossy then send the buffer, otherwise check if - // the event will trigger the whole buffer to be sent - if ((discardedLoggingEvent!=null && !m_lossy) || (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent)) ) + else { - SendBuffer(m_cb); + // Buffer is not yet full + + // Check if the event should trigger the whole buffer to be sent + if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent)) + { + SendBuffer(m_cb); + } } } } 1.10 +5 -0 logging-log4net/tests/src/log4net.Tests.csproj Index: log4net.Tests.csproj =================================================================== RCS file: /home/cvs/logging-log4net/tests/src/log4net.Tests.csproj,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- log4net.Tests.csproj 11 Mar 2005 21:44:44 -0000 1.9 +++ log4net.Tests.csproj 8 Jun 2005 17:13:39 -0000 1.10 @@ -108,6 +108,11 @@ BuildAction = "Compile" /> <File + RelPath = "Appender\BufferingAppenderTest.cs" + SubType = "Code" + BuildAction = "Compile" + /> + <File RelPath = "Appender\CountingAppender.cs" SubType = "Code" BuildAction = "Compile" 1.3 +8 -0 logging-log4net/tests/src/Appender/CountingAppender.cs Index: CountingAppender.cs =================================================================== RCS file: /home/cvs/logging-log4net/tests/src/Appender/CountingAppender.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- CountingAppender.cs 17 Jan 2005 21:40:52 -0000 1.2 +++ CountingAppender.cs 8 Jun 2005 17:13:40 -0000 1.3 @@ -60,6 +60,14 @@ #endregion Public Instance Properties + /// <summary> + /// Reset the counter to zero + /// </summary> + public void ResetCounter() + { + m_counter = 0; + } + #region Override implementation of AppenderSkeleton /// <summary> 1.1 logging-log4net/tests/src/Appender/BufferingAppenderTest.cs Index: BufferingAppenderTest.cs =================================================================== #region Copyright & License // // Copyright 2001-2005 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using log4net.Core; using log4net.Appender; using NUnit.Framework; namespace log4net.Tests.Appender { /// <summary> /// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class. /// </summary> /// <remarks> /// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class. /// </remarks> [TestFixture] public class BufferingAppenderTest { private BufferingForwardingAppender m_bufferingForwardingAppender; private CountingAppender m_countingAppender; private log4net.Repository.Hierarchy.Hierarchy m_hierarchy; private void SetupRepository() { m_hierarchy = new Repository.Hierarchy.Hierarchy(); m_countingAppender = new CountingAppender(); m_countingAppender.ActivateOptions(); m_bufferingForwardingAppender = new BufferingForwardingAppender(); m_bufferingForwardingAppender.AddAppender(m_countingAppender); m_bufferingForwardingAppender.BufferSize = 0; m_bufferingForwardingAppender.ClearFilters(); m_bufferingForwardingAppender.Evaluator = null; m_bufferingForwardingAppender.Fix = FixFlags.Partial; m_bufferingForwardingAppender.Lossy = false; m_bufferingForwardingAppender.LossyEvaluator = null; m_bufferingForwardingAppender.Threshold = Level.All; m_bufferingForwardingAppender.ActivateOptions(); log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender); } /// <summary> /// </summary> [Test] public void TestSetupAppender() { SetupRepository(); Assertion.AssertEquals("Test empty appender", 0, m_countingAppender.Counter); ILogger logger = m_hierarchy.GetLogger("test"); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message logged", null); Assertion.AssertEquals("Test 1 event logged", 1, m_countingAppender.Counter); } /// <summary> /// </summary> [Test] public void TestBufferSize5() { SetupRepository(); m_bufferingForwardingAppender.BufferSize = 5; m_bufferingForwardingAppender.ActivateOptions(); Assertion.AssertEquals(m_countingAppender.Counter, 0); ILogger logger = m_hierarchy.GetLogger("test"); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 1", null); Assertion.AssertEquals("Test 1 event in buffer", 0, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 2", null); Assertion.AssertEquals("Test 2 event in buffer", 0, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 3", null); Assertion.AssertEquals("Test 3 event in buffer", 0, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 4", null); Assertion.AssertEquals("Test 4 event in buffer", 0, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 5", null); Assertion.AssertEquals("Test 5 event in buffer", 0, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 6", null); Assertion.AssertEquals("Test 0 event in buffer. 6 event sent", 6, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 7", null); Assertion.AssertEquals("Test 1 event in buffer. 6 event sent", 6, m_countingAppender.Counter); logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 8", null); Assertion.AssertEquals("Test 2 event in buffer. 6 event sent", 6, m_countingAppender.Counter); } } }