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);
}
}
}