Flaky CommandExecutorFixture tests

This commit is contained in:
Taloth Saldono 2019-08-22 23:28:17 +02:00
parent 679c0599dd
commit d74ab12d9e
2 changed files with 73 additions and 27 deletions

View File

@ -145,7 +145,7 @@ namespace NzbDrone.Core.Test.Messaging.Commands
VerifyEventPublished<CommandExecutedEvent>(); VerifyEventPublished<CommandExecutedEvent>();
ExceptionVerification.ExpectedErrors(1); ExceptionVerification.WaitForErrors(1, 500);
} }
[Test] [Test]

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using NLog; using NLog;
using NLog.Targets; using NLog.Targets;
using NUnit.Framework; using NUnit.Framework;
@ -11,17 +12,27 @@ namespace NzbDrone.Test.Common
{ {
private static List<LogEventInfo> _logs = new List<LogEventInfo>(); private static List<LogEventInfo> _logs = new List<LogEventInfo>();
private static ManualResetEventSlim _waitEvent = new ManualResetEventSlim();
protected override void Write(LogEventInfo logEvent) protected override void Write(LogEventInfo logEvent)
{ {
if (logEvent.Level >= LogLevel.Warn) lock (_logs)
{ {
_logs.Add(logEvent); if (logEvent.Level >= LogLevel.Warn)
{
_logs.Add(logEvent);
_waitEvent.Set();
}
} }
} }
public static void Reset() public static void Reset()
{ {
_logs = new List<LogEventInfo>(); lock (_logs)
{
_logs.Clear();
_waitEvent.Reset();
}
} }
public static void AssertNoUnexpectedLogs() public static void AssertNoUnexpectedLogs()
@ -47,6 +58,29 @@ namespace NzbDrone.Test.Common
return errors; return errors;
} }
public static void WaitForErrors(int count, int msec)
{
while (true)
{
lock (_logs)
{
var levelLogs = _logs.Where(l => l.Level == LogLevel.Error).ToList();
if (levelLogs.Count >= count)
{
break;
}
_waitEvent.Reset();
}
if (!_waitEvent.Wait(msec))
break;
}
Expected(LogLevel.Error, count);
}
public static void ExpectedErrors(int count) public static void ExpectedErrors(int count)
{ {
Expected(LogLevel.Error, count); Expected(LogLevel.Error, count);
@ -74,50 +108,62 @@ namespace NzbDrone.Test.Common
public static void MarkInconclusive(Type exception) public static void MarkInconclusive(Type exception)
{ {
var inconclusiveLogs = _logs.Where(l => l.Exception != null && l.Exception.GetType() == exception).ToList(); lock (_logs)
if (inconclusiveLogs.Any())
{ {
inconclusiveLogs.ForEach(c => _logs.Remove(c)); var inconclusiveLogs = _logs.Where(l => l.Exception != null && l.Exception.GetType() == exception).ToList();
Assert.Inconclusive(GetLogsString(inconclusiveLogs));
if (inconclusiveLogs.Any())
{
inconclusiveLogs.ForEach(c => _logs.Remove(c));
Assert.Inconclusive(GetLogsString(inconclusiveLogs));
}
} }
} }
public static void MarkInconclusive(string text) public static void MarkInconclusive(string text)
{ {
var inconclusiveLogs = _logs.Where(l => l.FormattedMessage.ToLower().Contains(text.ToLower())).ToList(); lock (_logs)
if (inconclusiveLogs.Any())
{ {
inconclusiveLogs.ForEach(c => _logs.Remove(c)); var inconclusiveLogs = _logs.Where(l => l.FormattedMessage.ToLower().Contains(text.ToLower())).ToList();
Assert.Inconclusive(GetLogsString(inconclusiveLogs));
if (inconclusiveLogs.Any())
{
inconclusiveLogs.ForEach(c => _logs.Remove(c));
Assert.Inconclusive(GetLogsString(inconclusiveLogs));
}
} }
} }
private static void Expected(LogLevel level, int count) private static void Expected(LogLevel level, int count)
{ {
var levelLogs = _logs.Where(l => l.Level == level).ToList(); lock (_logs)
if (levelLogs.Count != count)
{ {
var levelLogs = _logs.Where(l => l.Level == level).ToList();
var message = string.Format("{0} {1}(s) were expected but {2} were logged.\n\r{3}", if (levelLogs.Count != count)
count, level, levelLogs.Count, GetLogsString(levelLogs)); {
message = "\n\r****************************************************************************************\n\r" var message = string.Format("{0} {1}(s) were expected but {2} were logged.\n\r{3}",
+ message + count, level, levelLogs.Count, GetLogsString(levelLogs));
"\n\r****************************************************************************************";
Assert.Fail(message); message = "\n\r****************************************************************************************\n\r"
+ message +
"\n\r****************************************************************************************";
Assert.Fail(message);
}
levelLogs.ForEach(c => _logs.Remove(c));
} }
levelLogs.ForEach(c => _logs.Remove(c));
} }
private static void Ignore(LogLevel level) private static void Ignore(LogLevel level)
{ {
var levelLogs = _logs.Where(l => l.Level == level).ToList(); lock (_logs)
levelLogs.ForEach(c => _logs.Remove(c)); {
var levelLogs = _logs.Where(l => l.Level == level).ToList();
levelLogs.ForEach(c => _logs.Remove(c));
}
} }
} }
} }