// NAnt - A .NET build tool // Copyright (C) 2001-2002 Gerry Shaw // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // William E. Caputo (wecaputo@thoughtworks.com | logosity@yahoo.com) // Owen Rogers (orogers@thoughtworks.com | exortech@gmail.com) using System; using System.Globalization; using System.IO; using System.Xml; using NUnit.Framework; using NAnt.Core; using NAnt.Core.Attributes; using NAnt.Core.Util; namespace Tests.NAnt.Core.Util { [TestFixture] public class XmlLoggerTest { private XmlLogger _log; private string _tempDir; private string _format = @" {1} {2} "; [SetUp] protected void SetUp() { _log = CreateXmlLogger(); _tempDir = TempDir.Create("NAnt.Tests.XmlLoggerTest"); } [TearDown] protected void TearDown() { TempDir.Delete(_tempDir); } [Test] public void StripFormatting() { string baseMessage = "this is a typical message."; string formattedMessage = "[foo] " + baseMessage; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage), "#1"); formattedMessage = "\t[foo] " + baseMessage; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage), "#2"); formattedMessage = "\t\0[foo] " + baseMessage; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage), "#3"); formattedMessage = "\t\0[foo] \0" + baseMessage + '\0'; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage), "#4"); formattedMessage = "\t\t[foo] " + baseMessage; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage), "#5"); string timestamp = "Thursday, August 01, 2002 12:52:54 AM"; formattedMessage = String.Format(CultureInfo.InvariantCulture, "\t\t\t[tstamp] {0}", timestamp); Assert.AreEqual(timestamp, _log.StripFormatting(formattedMessage), "#6"); } [Test] public void StripFormattingMultiline() { string baseMessage = "this is a typical message." + Environment.NewLine + "Multiline message that is."; string formattedMessage = "[foo] " + baseMessage; Assert.AreEqual(baseMessage, _log.StripFormatting(formattedMessage)); } [Test] public void IsJustWhiteSpace() { string message = ""; Assert.IsTrue(_log.IsJustWhiteSpace(message), "check failed for: {0}", message); message = " "; Assert.IsTrue(_log.IsJustWhiteSpace(message), "check failed for: {0}", message); message = "\0"; Assert.IsTrue(_log.IsJustWhiteSpace(message), "check failed for: {0}", message); message = " "; Assert.IsTrue(_log.IsJustWhiteSpace(message), "check failed for: {0}", message); message = "\t\t\t\t"; Assert.IsTrue(_log.IsJustWhiteSpace(message), "check failed for: {0}", message); message = "hello"; Assert.IsFalse(_log.IsJustWhiteSpace(message), "check should not have failed for: {0}", message); message = "hello "; Assert.IsFalse(_log.IsJustWhiteSpace(message), "check should not have failed for: {0}", message); message = " hello"; Assert.IsFalse(_log.IsJustWhiteSpace(message), "check should not have failed for: {0}", message); message = "\t\t\thello"; Assert.IsFalse(_log.IsJustWhiteSpace(message), "check should not have failed for: {0}", message); } [Test] public void WriteLine() { string baseMessage = "this is a typical message."; string formattedMessage = "[foo] " + baseMessage; BuildEventArgs args = CreateBuildEventArgs(formattedMessage, Level.Info); _log.MessageLogged(this, args); string expected = string.Format(CultureInfo.InvariantCulture, "", baseMessage); Assert.AreEqual(expected, _log.ToString()); } [Test] public void Write() { string baseMessage = "this is a typical message."; string formattedMessage = "[foo] " + baseMessage; BuildEventArgs args = CreateBuildEventArgs(formattedMessage, Level.Info); _log.MessageLogged(this, args); string expected = string.Format(CultureInfo.InvariantCulture, "", baseMessage); Assert.AreEqual(expected, _log.ToString()); string unformattedMessage = "message:"; _log = CreateXmlLogger(); args.Message = unformattedMessage; _log.MessageLogged(this, args); expected = string.Format(CultureInfo.InvariantCulture, "", unformattedMessage); Assert.AreEqual(expected, _log.ToString()); unformattedMessage = "message with no tag in front."; _log = CreateXmlLogger(); args.Message = unformattedMessage; _log.MessageLogged(this, args); expected = string.Format(CultureInfo.InvariantCulture, "", unformattedMessage); Assert.AreEqual(expected, _log.ToString()); unformattedMessage = "BUILD SUCCESSFUL"; _log = CreateXmlLogger(); args.Message = unformattedMessage; _log.MessageLogged(this, args); expected = string.Format(CultureInfo.InvariantCulture, "", unformattedMessage); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteStrangeCharacters() { string baseMessage = "this message has !@!)$)(&^%^%$$##@@}{[]\"';:<<>/+=-_. in it."; string formattedMessage = "[foo] " + baseMessage; BuildEventArgs args = CreateBuildEventArgs(formattedMessage, Level.Info); _log.MessageLogged(this, args); string expected = string.Format(CultureInfo.InvariantCulture, "", baseMessage); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteEmbeddedMathFormulas() { string baseMessage = "this message has: x < 20 = y in it."; string formattedMessage = "[foo] " + baseMessage; BuildEventArgs args = CreateBuildEventArgs(formattedMessage, Level.Info); _log.MessageLogged(this, args); string expected = string.Format(CultureInfo.InvariantCulture, "", baseMessage); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteTextWithEmbeddedCDATATag() { string message = @"some stuff with and more "; string expected = @" more stuff and more cdata]]>"; BuildEventArgs args = CreateBuildEventArgs(message, Level.Info); _log.MessageLogged(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteXmlWithDeclaration() { string message = @""; string expected = @""; BuildEventArgs args = CreateBuildEventArgs(message, Level.Info); _log.MessageLogged(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteXmlWithLeadingWhitespace() { string message = @" "; string expected = @""; BuildEventArgs args = CreateBuildEventArgs(message, Level.Info); _log.MessageLogged(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteEmbeddedXml() { string baseMessage = ""; string expected = string.Format(CultureInfo.InvariantCulture, "{0}", baseMessage); BuildEventArgs args = CreateBuildEventArgs(baseMessage, Level.Info); _log.MessageLogged(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void WriteEmbeddedMalformedXml() { string baseMessage = "malformed"; string expected = string.Format(CultureInfo.InvariantCulture, "", baseMessage); BuildEventArgs args = CreateBuildEventArgs(baseMessage, Level.Info); _log.MessageLogged(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void BuildStartedAndBuildFinished() { string expected = "123"; _log = CreateXmlLogger(CreateDateTimeProvider(123)); BuildEventArgs args = new BuildEventArgs(CreateProject()); _log.BuildStarted(this, args); _log.BuildFinished(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void TargetStartedAndTargetFinished() { string expected = @"123"; _log = CreateXmlLogger(CreateDateTimeProvider(123)); BuildEventArgs args = CreateBuildEventArgsWithTarget("foo"); _log.TargetStarted(this, args); _log.TargetFinished(this, args); Assert.AreEqual(expected, _log.ToString()); } [Test] public void TaskStartedAndTaskFinished() { string expected = @"321"; _log = CreateXmlLogger(CreateDateTimeProvider(321)); BuildEventArgs args = new BuildEventArgs(new TestTask()); _log.TaskStarted(this, args); _log.TaskFinished(this, args); Assert.AreEqual(expected, _log.ToString()); } private MockDateTimeProvider CreateDateTimeProvider(int duration) { MockDateTimeProvider mockDateTimeProvider = new MockDateTimeProvider(); mockDateTimeProvider.SetExpectedNow(new DateTime(2004, 12, 1, 1, 0, 0)); mockDateTimeProvider.SetExpectedNow(new DateTime(2004, 12, 1, 1, 0, 0, duration)); return mockDateTimeProvider; } private XmlLogger CreateXmlLogger() { return CreateXmlLogger(new DateTimeProvider()); } private XmlLogger CreateXmlLogger(DateTimeProvider dtProvider) { XmlLogger logger = new XmlLogger(new StopWatchStack(dtProvider)); logger.OutputWriter = new StringWriter(); return logger; } private BuildEventArgs CreateBuildEventArgsWithTarget(string targetName) { Target target = new Target(); target.Name = targetName; return new BuildEventArgs(target); } private string FormatBuildFile(string globalTasks, string targetTasks, string projectName) { return String.Format(CultureInfo.InvariantCulture, _format, _tempDir, globalTasks, targetTasks, projectName); } private BuildEventArgs CreateBuildEventArgs(string formattedMessage, Level level) { BuildEventArgs args = new BuildEventArgs(new Target()); args.Message = formattedMessage; args.MessageLevel = level; return args; } private Project CreateProject() { XmlDocument doc = new XmlDocument(); doc.LoadXml(FormatBuildFile("", "", "testproject")); return new Project(doc, Level.Info, 0); } [TaskName("testtask")] private class TestTask : Task { protected override void ExecuteTask() {} } } }