// 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);
}
}
}