using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Xml; namespace Cosmos.TestRunner.Core { public partial class OutputHandlerXml: OutputHandlerBase { private XmlDocument mDocument; private bool mConfigurationSucceeded = false; private bool mExecutionSucceeded = false; public OutputHandlerXml() { } protected override void OnExecuteKernelStart(string assemblyName) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xItem = mDocument.CreateElement("Kernel"); xItem.Attributes.Append(NewXmlAttribute("AssemblyName", assemblyName)); xParent.AppendChild(xItem); mCurrentNode.Push(xItem); mCurrentKernelNode = xItem; mKernelStopwatch = Stopwatch.StartNew(); } private Stopwatch mKernelStopwatch; protected override void OnExecuteKernelEnd(string assemblyName) { mKernelStopwatch.Stop(); var xItem = mCurrentNode.Pop(); mCurrentKernelNode = null; xItem.Attributes.Append(NewXmlAttribute("Duration", mKernelStopwatch.Elapsed.ToString("c"))); } protected override void OnLogDebugMessage(string message) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xNode = xParent.SelectSingleNode("./DebugMessages"); if (xNode == null) { xNode = mDocument.CreateElement("DebugMessages"); xParent.PrependChild(xNode); } var xItem = mDocument.CreateElement("Message"); xItem.InnerText = message; xNode.AppendChild(xItem); } protected override void OnLogMessage(string message) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xNode = xParent.SelectSingleNode("./Messages"); if (xNode == null) { xNode = mDocument.CreateElement("Messages"); xParent.PrependChild(xNode); } var xItem = mDocument.CreateElement("Message"); xItem.InnerText = message; xParent.AppendChild(xItem); } protected override void OnLogError(string message) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xItem = mDocument.CreateElement("Error"); xItem.AppendChild(mDocument.CreateCDataSection(message)); xParent.AppendChild(xItem); } protected override void OnExecutionStart() { mDocument = new XmlDocument(); mDocument.LoadXml(""); mDocument.DocumentElement.Attributes.Append(NewXmlAttribute("DateTime", DateTime.UtcNow.ToString("O"))); mCurrentNode.Push(mDocument.DocumentElement); mExecutionStopwatch = Stopwatch.StartNew(); mExecutionSucceeded = true; } private Stopwatch mExecutionStopwatch; protected override void OnExecutionEnd() { mExecutionStopwatch.Stop(); mDocument.DocumentElement.Attributes.Append(NewXmlAttribute("Duration", mExecutionStopwatch.Elapsed.ToString("c"))); mDocument.DocumentElement.Attributes.Append(NewXmlAttribute("Succeeded", mExecutionSucceeded.ToString())); mCurrentNode.Pop(); } public void SaveToFile(string filename) { mDocument.Save(File.OpenWrite(filename)); } private Stack mCurrentNode = new Stack(); private Stopwatch mTaskStopwatch; private Stopwatch mConfigurationStopwatch; private XmlElement mCurrentKernelNode; protected override void OnUnhandledException(Exception exception) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xItem = mDocument.CreateElement("Exception"); xItem.AppendChild(mDocument.CreateCDataSection(exception.ToString())); xParent.AppendChild(xItem); } protected override void OnTaskStart(string taskName) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xItem = mDocument.CreateElement("Task"); xItem.Attributes.Append(NewXmlAttribute("TaskName", taskName)); xParent.AppendChild(xItem); mCurrentNode.Push(xItem); mTaskStopwatch = Stopwatch.StartNew(); } protected override void OnTaskEnd(string taskName) { mTaskStopwatch.Stop(); var xItem = mCurrentNode.Pop(); xItem.Attributes.Append(NewXmlAttribute("Duration", mTaskStopwatch.Elapsed.ToString("c"))); } protected override void OnSetKernelTestResult(bool succeeded, string message) { if (succeeded) { OnLogMessage(message); } else { OnLogError(message); } mCurrentKernelNode.Attributes.Append(NewXmlAttribute("Succeeded", succeeded.ToString())); mConfigurationSucceeded &= succeeded; mExecutionSucceeded &= succeeded; } protected override void OnSetKernelSucceededAssertionsCount(int succeededAssertions) { mCurrentKernelNode.Attributes.Append(NewXmlAttribute("SucceededAssertionsCount", succeededAssertions.ToString())); } protected override void OnRunConfigurationStart(RunConfiguration configuration) { XmlElement xParent = mDocument.DocumentElement; if (mCurrentNode.Count > 0) { xParent = mCurrentNode.Peek(); } var xItem = mDocument.CreateElement("Configuration"); xItem.Attributes.Append(NewXmlAttribute("IsELF", configuration.IsELF.ToString())); xItem.Attributes.Append(NewXmlAttribute("RunTarget", configuration.RunTarget.ToString())); xParent.AppendChild(xItem); mCurrentNode.Push(xItem); mConfigurationSucceeded = true; mConfigurationStopwatch = Stopwatch.StartNew(); } protected override void OnRunConfigurationEnd(RunConfiguration configuration) { mConfigurationStopwatch.Stop(); var xItem = mCurrentNode.Pop(); xItem.Attributes.Append(NewXmlAttribute("Duration", mKernelStopwatch.Elapsed.ToString("c"))); xItem.Attributes.Append(NewXmlAttribute("Succeeded", mConfigurationSucceeded.ToString())); } } }