// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using NUnit.Framework; using System; using System.Diagnostics; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Linq; namespace OpenTap.EngineUnitTestUtils { /// /// Trace listener used when running unittests, it checks for error messages in the trace /// public class TestTraceListener : OpenTap.TraceListener { public void ClearErrors() { ErrorMessage = new List(); WarningMessage = new List(); } public void AssertErrors(IList allowedMessages) { foreach (string error in ErrorMessage) { if (allowedMessages == null || !allowedMessages.Contains(error)) { Assert.Fail("{0}{1}{1}{2}", ErrorMessage, Environment.NewLine, GetLog()); } } foreach (string warning in WarningMessage) { if (allowedMessages == null || !allowedMessages.Contains(warning)) { Assert.Inconclusive("{0}{1}{1}{2}", WarningMessage, Environment.NewLine, GetLog()); } } } public void AssertErrors(List allowedMessages) { foreach (string error in ErrorMessage) { if (allowedMessages == null || allowedMessages.All(r => !r.IsMatch(error))) { Assert.Fail("{0}{1}{1}{2}", ErrorMessage, Environment.NewLine, GetLog()); } } foreach (string warning in WarningMessage) { if (allowedMessages == null || allowedMessages.All(r => !r.IsMatch(warning))) { Assert.Inconclusive("{0}{1}{1}{2}", WarningMessage, Environment.NewLine, GetLog()); } } } public void AssertErrors() { Flush(); Assert.IsTrue(ErrorMessage.Count == 0, "{0}{1}{1}{2}", string.Join(Environment.NewLine, ErrorMessage), Environment.NewLine, GetLog()); if (WarningMessage.Count != 0) Assert.Inconclusive("{0}{1}{1}{2}", string.Join(Environment.NewLine, WarningMessage), Environment.NewLine, GetLog()); } public string GetLog() { return allLog.ToString(); } public StringBuilder allLog = new StringBuilder(1000); private Stopwatch globalTimer = Stopwatch.StartNew(); public List ErrorMessage = new List(); public List WarningMessage = new List(); public override void TraceEvent(string source, LogEventType eventType, int id, string message) { base.TraceEvent(source, eventType, id, message); allLog.AppendLine(String.Format("{3:ss\\.fff} : {0,-11} : {1,-13} : {2}", source, eventType, message, globalTimer.Elapsed)); if (eventType == LogEventType.Error) ErrorMessage.Add(message); if (eventType == LogEventType.Warning) WarningMessage.Add(message); } public override void TraceEvent(string source, LogEventType eventType, int id, string format, params object[] args) { if (args == null) { TraceEvent(source, eventType, id, format); return; } base.TraceEvent(source, eventType, id, format, args); allLog.AppendLine(String.Format("{3:ss\\.fff} : {0,-11} : {1,-13} : {2}", source, eventType, String.Format(format, args), globalTimer.Elapsed)); if (eventType == LogEventType.Error) ErrorMessage.Add(String.Format(format, args)); if (eventType == LogEventType.Warning) WarningMessage.Add(String.Format(format, args)); } public override void Write(string message) { } public override void WriteLine(string message) { } public void ExpectWarnings(params string[] expectedWarnings) { foreach (var warning in expectedWarnings) Assert.IsTrue(WarningMessage.Any(x => x.Contains(warning)), "Expected warning '{0}' should be present", warning); } public void ExpectErrors(params string[] expectedErrors) { foreach (var error in expectedErrors) Assert.IsTrue(ErrorMessage.Any(x => x.Contains(error)), "Expected error '{0}' should be present", error); } } }