You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2004/05/17 00:12:56 UTC
cvs commit: logging-log4net/tests/src/Util PropertiesDictionaryTest.cs
nicko 2004/05/16 15:12:56
Modified: tests/src log4net.Tests.csproj
Added: tests/src/Appender RemotingAppenderTest.cs
tests/src/Util PropertiesDictionaryTest.cs
Log:
Added tests for the RemotingAppender and the PropertiesDictionary.
Revision Changes Path
1.4 +15 -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.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- log4net.Tests.csproj 26 Feb 2004 21:44:53 -0000 1.3
+++ log4net.Tests.csproj 16 May 2004 22:12:56 -0000 1.4
@@ -82,6 +82,11 @@
Project = "{F6A02431-167E-4347-BC43-65532C31CDB7}"
Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
/>
+ <Reference
+ Name = "System.Runtime.Remoting"
+ AssemblyName = "System.Runtime.Remoting"
+ HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Runtime.Remoting.dll"
+ />
</References>
</Build>
<Files>
@@ -113,6 +118,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Appender\RemotingAppenderTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Appender\RollingFileAppenderTest.cs"
SubType = "Code"
BuildAction = "Compile"
@@ -129,6 +139,11 @@
/>
<File
RelPath = "Layout\PatternLayoutTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "Util\PropertiesDictionaryTest.cs"
SubType = "Code"
BuildAction = "Compile"
/>
1.1 logging-log4net/tests/src/Appender/RemotingAppenderTest.cs
Index: RemotingAppenderTest.cs
===================================================================
#region Copyright & License
//
// Copyright 2001-2004 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 System.Diagnostics;
using System.Globalization;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using log4net.Util;
using log4net.Layout;
using log4net.Core;
using log4net.Appender;
using IRemoteLoggingSink = log4net.Appender.RemotingAppender.IRemoteLoggingSink;
using NUnit.Framework;
namespace log4net.Tests.Appender
{
/// <summary>
/// Used for internal unit testing the <see cref="RemotingAppender"/> class.
/// </summary>
/// <remarks>
/// Used for internal unit testing the <see cref="RemotingAppender"/> class.
/// </remarks>
[TestFixture] public class RemotingAppenderTest
{
private IChannel m_remotingChannel = null;
/// <summary>
/// Test that the Message property is correctly remoted
/// </summary>
[Test] public void TestRemotedMessage()
{
// Setup the remoting appender
ConfigureRootAppender(FixFlags.Partial);
RemoteLoggingSinkImpl.Instance.Events = null;
log4net.Repository.Hierarchy.Logger root = null;
root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
string testMessage = string.Format("test message [ {0} ]", (new Random()).Next());
// Log a message that will be remoted
root.Log(Level.Debug, testMessage, null);
// Wait for the remoted object to be delivered
System.Threading.Thread.Sleep(1000);
LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
Assertion.AssertEquals("Expect to receive 1 remoted event", 1, events.Length);
Assertion.AssertEquals("Expect Message match after remoting event", testMessage, events[0].RenderedMessage);
}
/// <summary>
/// Test that the UserName property is not remoted when doing a Fix.Partial
/// </summary>
[Test] public void TestPartialFix()
{
// Setup the remoting appender
ConfigureRootAppender(FixFlags.Partial);
RemoteLoggingSinkImpl.Instance.Events = null;
log4net.Repository.Hierarchy.Logger root = null;
root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
// Log a message that will be remoted
root.Log(Level.Debug, "test message", null);
// Wait for the remoted object to be delivered
System.Threading.Thread.Sleep(1000);
LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
Assertion.AssertEquals("Expect to receive 1 remoted event", 1, events.Length);
// Grab the event data
LoggingEventData eventData = GetLoggingEventData(events[0]);
Assertion.AssertNull("Expect username to be null because only doing a partial fix", eventData.UserName);
}
/// <summary>
/// Test that the UserName property is remoted when doing a Fix.All
/// </summary>
[Test] public void TestFullFix()
{
// Setup the remoting appender
ConfigureRootAppender(FixFlags.All);
RemoteLoggingSinkImpl.Instance.Events = null;
log4net.Repository.Hierarchy.Logger root = null;
root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
// Log a message that will be remoted
root.Log(Level.Debug, "test message", null);
// Wait for the remoted object to be delivered
System.Threading.Thread.Sleep(1000);
LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
Assertion.AssertEquals("Expect to receive 1 remoted event", 1, events.Length);
// Grab the event data
LoggingEventData eventData = GetLoggingEventData(events[0]);
Assertion.AssertNotNull("Expect username to not be null because doing a full fix", eventData.UserName);
}
private void RegisterRemotingServerChannel()
{
if (m_remotingChannel == null)
{
m_remotingChannel = new TcpChannel(8085);
// Setup remoting server
try
{
ChannelServices.RegisterChannel(m_remotingChannel);
}
catch(Exception)
{
}
// Marshal the sink object
RemotingServices.Marshal(RemoteLoggingSinkImpl.Instance, "LoggingSink", typeof(IRemoteLoggingSink));
}
}
/// <summary>
/// Shuts down any loggers in the hierarchy, along
/// with all appenders.
/// </summary>
private void ResetRepository()
{
// Regular users should not use the clear method lightly!
LogManager.GetRepository().ResetConfiguration();
LogManager.GetRepository().Shutdown();
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Clear();
}
/// <summary>
/// Any initialization that happens before each test can
/// go here
/// </summary>
[SetUp] public void SetUp()
{
ResetRepository();
RegisterRemotingServerChannel();
}
/// <summary>
/// Any steps that happen after each test go here
/// </summary>
[TearDown] public void TearDown()
{
ResetRepository();
}
/// <summary>
/// Configures the root appender for counting and rolling
/// </summary>
private void ConfigureRootAppender(FixFlags fixFlags)
{
log4net.Repository.Hierarchy.Logger root = null;
root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
root.Level = Level.Debug;
root.AddAppender(CreateAppender(fixFlags));
root.Repository.Configured = true;
}
private RemotingAppender CreateAppender(FixFlags fixFlags)
{
RemotingAppender appender = new RemotingAppender();
appender.Sink = "tcp://localhost:8085/LoggingSink";
appender.Lossy = false;
appender.BufferSize = 1;
appender.Fix = fixFlags;
appender.ActivateOptions();
return appender;
}
public class RemoteLoggingSinkImpl : MarshalByRefObject, IRemoteLoggingSink
{
public static readonly RemoteLoggingSinkImpl Instance = new RemoteLoggingSinkImpl();
public LoggingEvent[] Events = null;
#region Public Instance Constructors
private RemoteLoggingSinkImpl()
{
}
#endregion Public Instance Constructors
#region Implementation of IRemoteLoggingSink
/// <summary>
/// Logs the events to the repository.
/// </summary>
/// <param name="events">The events to log.</param>
/// <remarks>
/// The events passed are logged to the <see cref="LoggerRepository"/>
/// </remarks>
public void LogEvents(LoggingEvent[] events)
{
Events = events;
}
#endregion Implementation of IRemoteLoggingSink
#region Override implementation of MarshalByRefObject
/// <summary>
/// Obtains a lifetime service object to control the lifetime
/// policy for this instance.
/// </summary>
/// <returns>
/// <c>null</c> to indicate that this instance should live
/// forever.
/// </returns>
public override object InitializeLifetimeService()
{
return null;
}
#endregion Override implementation of MarshalByRefObject
}
//
// Helper functions to dig into the appender
//
private static LoggingEventData GetLoggingEventData(LoggingEvent loggingEvent)
{
return (LoggingEventData)Utils.GetField(loggingEvent, "m_data");
}
}
}
1.1 logging-log4net/tests/src/Util/PropertiesDictionaryTest.cs
Index: PropertiesDictionaryTest.cs
===================================================================
#region Copyright & License
//
// Copyright 2001-2004 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 System.IO;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using log4net.Config;
using log4net.Util;
using log4net.Layout;
using log4net.Core;
using log4net.Appender;
using log4net.Repository;
using log4net.Tests.Appender;
using NUnit.Framework;
namespace log4net.Tests.Util
{
/// <summary>
/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
/// </summary>
/// <remarks>
/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
/// </remarks>
[TestFixture] public class PropertiesDictionaryTest
{
[Test] public void TestSerialization()
{
PropertiesDictionary pd = new PropertiesDictionary();
for(int i=0; i<10; i++)
{
pd[i.ToString()] = i;
}
Assertion.AssertEquals("Dictionary should have 10 items", 10, pd.Count);
// Serialize the properties into a memory stream
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream memory = new MemoryStream();
formatter.Serialize(memory, pd);
// Deserialize the stream into a new properties dictionary
memory.Position = 0;
PropertiesDictionary pd2 = (PropertiesDictionary)formatter.Deserialize(memory);
Assertion.AssertEquals("Deserialized Dictionary should have 10 items", 10, pd2.Count);
foreach(string key in pd.GetKeys())
{
Assertion.AssertEquals("Check Value Persisted for key ["+key+"]", pd[key], pd2[key]);
}
}
}
}