nicko 2005/06/20 12:11:53
Modified: src/Util ThreadContextStack.cs
tests/src log4net.Tests.csproj
Added: tests/src/Context ThreadContextTest.cs
Log:
Fix for LOG4NET-35 Exception rendering ThreadContextStack if null value
pushed into stack. Fix and tests included
Revision Changes Path
1.8 +1 -1 logging-log4net/src/Util/ThreadContextStack.cs
Index: ThreadContextStack.cs
===================================================================
RCS file: /home/cvs/logging-log4net/src/Util/ThreadContextStack.cs,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ThreadContextStack.cs 3 Apr 2005 17:59:38 -0000 1.7
+++ ThreadContextStack.cs 20 Jun 2005 19:11:53 -0000 1.8
@@ -298,7 +298,7 @@
{
get
{
- if (m_fullMessage == null)
+ if (m_fullMessage == null && m_parent
!= null)
{
m_fullMessage =
string.Concat(m_parent.FullMessage, " ", m_message);
}
1.11 +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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- log4net.Tests.csproj 8 Jun 2005 17:13:39 -0000 1.10
+++ log4net.Tests.csproj 20 Jun 2005 19:11:53 -0000 1.11
@@ -138,6 +138,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Context\ThreadContextTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Core\ShutdownTest.cs"
SubType = "Code"
BuildAction = "Compile"
1.1 logging-log4net/tests/src/Context/ThreadContextTest.cs
Index: ThreadContextTest.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 System;
using log4net.Config;
using log4net.Layout;
using log4net.Repository;
using log4net.Tests.Appender;
using NUnit.Framework;
namespace log4net.Tests.Context
{
/// <summary>
/// Used for internal unit testing the <see cref="ThreadContext"/>
class.
/// </summary>
/// <remarks>
/// Used for internal unit testing the <see cref="ThreadContext"/>
class.
/// </remarks>
[TestFixture] public class ThreadContextTest
{
[Test] public void TestThreadPropertiesPattern()
{
StringAppender stringAppender = new StringAppender();
stringAppender.Layout = new
PatternLayout("%property{prop1}");
ILoggerRepository rep =
LogManager.CreateRepository(Guid.NewGuid().ToString());
BasicConfigurator.Configure(rep, stringAppender);
ILog log1 = LogManager.GetLogger(rep.Name,
"TestThreadProperiesPattern");
log1.Info("TestMessage");
Assertion.AssertEquals("Test no thread properties value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
ThreadContext.Properties["prop1"] = "val1";
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread properties value
set", "val1", stringAppender.GetString());
stringAppender.Reset();
ThreadContext.Properties.Remove("prop1");
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread properties value
removed", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
[Test] public void TestThreadStackPattern()
{
StringAppender stringAppender = new StringAppender();
stringAppender.Layout = new
PatternLayout("%property{prop1}");
ILoggerRepository rep =
LogManager.CreateRepository(Guid.NewGuid().ToString());
BasicConfigurator.Configure(rep, stringAppender);
ILog log1 = LogManager.GetLogger(rep.Name,
"TestThreadStackPattern");
log1.Info("TestMessage");
Assertion.AssertEquals("Test no thread stack value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push("val1"))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
set", "val1", stringAppender.GetString());
stringAppender.Reset();
}
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
removed", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
[Test] public void TestThreadStackPattern2()
{
StringAppender stringAppender = new StringAppender();
stringAppender.Layout = new
PatternLayout("%property{prop1}");
ILoggerRepository rep =
LogManager.CreateRepository(Guid.NewGuid().ToString());
BasicConfigurator.Configure(rep, stringAppender);
ILog log1 = LogManager.GetLogger(rep.Name,
"TestThreadStackPattern");
log1.Info("TestMessage");
Assertion.AssertEquals("Test no thread stack value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push("val1"))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
set", "val1", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push("val2"))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread
stack value pushed 2nd val", "val1 val2", stringAppender.GetString());
stringAppender.Reset();
}
}
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
removed", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
[Test] public void TestThreadStackPatternNullVal()
{
StringAppender stringAppender = new StringAppender();
stringAppender.Layout = new
PatternLayout("%property{prop1}");
ILoggerRepository rep =
LogManager.CreateRepository(Guid.NewGuid().ToString());
BasicConfigurator.Configure(rep, stringAppender);
ILog log1 = LogManager.GetLogger(rep.Name,
"TestThreadStackPattern");
log1.Info("TestMessage");
Assertion.AssertEquals("Test no thread stack value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push(null))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
removed", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
[Test] public void TestThreadStackPatternNullVal2()
{
StringAppender stringAppender = new StringAppender();
stringAppender.Layout = new
PatternLayout("%property{prop1}");
ILoggerRepository rep =
LogManager.CreateRepository(Guid.NewGuid().ToString());
BasicConfigurator.Configure(rep, stringAppender);
ILog log1 = LogManager.GetLogger(rep.Name,
"TestThreadStackPattern");
log1.Info("TestMessage");
Assertion.AssertEquals("Test no thread stack value
set", "(null)", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push("val1"))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
set", "val1", stringAppender.GetString());
stringAppender.Reset();
using(ThreadContext.Stacks["prop1"].Push(null))
{
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread
stack value pushed null", "val1 ", stringAppender.GetString());
stringAppender.Reset();
}
}
log1.Info("TestMessage");
Assertion.AssertEquals("Test thread stack value
removed", "(null)", stringAppender.GetString());
stringAppender.Reset();
}
}
}