#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 System.IO; using System.Xml; using log4net.Config; using log4net.Util; using log4net.Layout; using log4net.Core; using log4net.Repository; using log4net.Tests.Appender; using NUnit.Framework; namespace log4net.Tests.Layout { [TestFixture] public class XmlLayoutTest { /// /// Build a basic object with some default values. /// /// A useful LoggingEventData object private LoggingEventData createBaseEvent() { LoggingEventData ed=new LoggingEventData(); ed.Domain="Tests"; ed.ExceptionString=""; ed.Identity="TestRunner"; ed.Level=Level.Info; ed.LocationInfo=new LocationInfo(this.GetType()); ed.LoggerName="TestLogger"; ed.Message="Test message"; ed.ThreadName="TestThread"; ed.TimeStamp=DateTime.Today; ed.UserName="TestRunner"; ed.Properties=new PropertiesDictionary(); return ed; } private string createEventNode(string message) { return String.Format("{1}\r\n", #if NET_2_0 XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local), #else XmlConvert.ToString(DateTime.Today), #endif message); } private string createEventNode(string key, string value) { return String.Format("Test message\r\n", #if NET_2_0 XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local), #else XmlConvert.ToString(DateTime.Today), #endif key, value); } [Test] public void TestBasicEventLogging() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("Test message"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestIllegalCharacterMasking() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); evt.Message="This is a masked char->\uFFFF"; layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("This is a masked char->?"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestCDATAEscaping1() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); //The &'s trigger the use of a cdata block evt.Message="&&&&&&&Escape this ]]>. End here."; layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("]]. End here.]]>"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestCDATAEscaping2() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); //The &'s trigger the use of a cdata block evt.Message="&&&&&&&Escape the end ]]>"; layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("]]>"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestCDATAEscaping3() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); //The &'s trigger the use of a cdata block evt.Message="]]>&&&&&&&Escape the begining"; layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("]]&&&&&&&Escape the begining]]>"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestBase64EventLogging() { TextWriter writer=new StringWriter(); XmlLayout layout=new XmlLayout(); LoggingEventData evt=createBaseEvent(); layout.Base64EncodeMessage=true; layout.Format(writer,new LoggingEvent(evt)); string expected = createEventNode("VGVzdCBtZXNzYWdl"); Assert.AreEqual (expected, writer.ToString()); } [Test] public void TestPropertyEventLogging() { LoggingEventData evt=createBaseEvent(); evt.Properties["Property1"]="prop1"; XmlLayout layout=new XmlLayout(); StringAppender stringAppender = new StringAppender(); stringAppender.Layout = layout; ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); BasicConfigurator.Configure(rep, stringAppender); ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); log1.Logger.Log(new LoggingEvent(evt)); string expected = createEventNode("Property1", "prop1"); Assert.AreEqual (expected, stringAppender.GetString()); } [Test] public void TestBase64PropertyEventLogging() { LoggingEventData evt=createBaseEvent(); evt.Properties["Property1"]="prop1"; XmlLayout layout=new XmlLayout(); layout.Base64EncodeProperties=true; StringAppender stringAppender = new StringAppender(); stringAppender.Layout = layout; ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); BasicConfigurator.Configure(rep, stringAppender); ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); log1.Logger.Log(new LoggingEvent(evt)); string expected = createEventNode("Property1", "cHJvcDE="); Assert.AreEqual (expected, stringAppender.GetString()); } [Test] public void TestPropertyCharacterEscaping() { LoggingEventData evt=createBaseEvent(); evt.Properties["Property1"]="prop1 \"quoted\""; XmlLayout layout=new XmlLayout(); StringAppender stringAppender = new StringAppender(); stringAppender.Layout = layout; ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); BasicConfigurator.Configure(rep, stringAppender); ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); log1.Logger.Log(new LoggingEvent(evt)); string expected = createEventNode("Property1", "prop1 "quoted""); Assert.AreEqual (expected, stringAppender.GetString()); } [Test] public void TestPropertyIllegalCharacterMasking() { LoggingEventData evt=createBaseEvent(); evt.Properties["Property1"]="mask this ->\uFFFF"; XmlLayout layout=new XmlLayout(); StringAppender stringAppender = new StringAppender(); stringAppender.Layout = layout; ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); BasicConfigurator.Configure(rep, stringAppender); ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); log1.Logger.Log(new LoggingEvent(evt)); string expected = createEventNode("Property1", "mask this ->?"); Assert.AreEqual (expected, stringAppender.GetString()); } [Test] public void TestPropertyIllegalCharacterMaskingInName() { LoggingEventData evt=createBaseEvent(); evt.Properties["Property\uFFFF"]="mask this ->\uFFFF"; XmlLayout layout=new XmlLayout(); StringAppender stringAppender = new StringAppender(); stringAppender.Layout = layout; ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); BasicConfigurator.Configure(rep, stringAppender); ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern"); log1.Logger.Log(new LoggingEvent(evt)); string expected = createEventNode("Property?", "mask this ->?"); Assert.AreEqual (expected, stringAppender.GetString()); } } }