SEBWIN-183: Extended unit testing for logging components (and fixed issues encountered while doing so).
This commit is contained in:
parent
135fbd76ec
commit
f952904cf0
9 changed files with 170 additions and 4 deletions
|
@ -16,37 +16,44 @@ namespace SafeExamBrowser.Contracts.Logging
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Logs the given message with severity <b>INFO</b>.
|
/// Logs the given message with severity <b>INFO</b>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Info(string message);
|
void Info(string message);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Logs the given message with severity <b>WARNING</b>.
|
/// Logs the given message with severity <b>WARNING</b>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Warn(string message);
|
void Warn(string message);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Logs the given message with severity <b>ERROR</b>.
|
/// Logs the given message with severity <b>ERROR</b>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Error(string message);
|
void Error(string message);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Logs the given message with severity <b>ERROR</b> and includes information about
|
/// Logs the given message with severity <b>ERROR</b> and includes information about
|
||||||
/// the specified exception (i.e. type, message and stacktrace).
|
/// the specified exception (i.e. type, message and stacktrace).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Error(string message, Exception exception);
|
void Error(string message, Exception exception);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Logs the given message as raw text.
|
/// Logs the given message as raw text.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Log(string message);
|
void Log(string message);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Appends the given content to the log.
|
/// Appends the given content to the log.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Log(ILogContent content);
|
void Log(ILogContent content);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Suscribes an observer to the application log.
|
/// Suscribes an observer to the application log.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <exception cref="ArgumentNullException" />
|
||||||
void Subscribe(ILogObserver observer);
|
void Subscribe(ILogObserver observer);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* 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 System;
|
||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
|
using SafeExamBrowser.Core.Logging;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Core.UnitTests.Logging
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class DefaultLogFormatterTests
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
[ExpectedException(typeof(NotImplementedException))]
|
||||||
|
public void MustReportNotYetImplementedLogContent()
|
||||||
|
{
|
||||||
|
var sut = new DefaultLogFormatter();
|
||||||
|
|
||||||
|
sut.Format(new NewLogContentType());
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MustReturnRawTextForLogMessage()
|
||||||
|
{
|
||||||
|
var sut = new DefaultLogFormatter();
|
||||||
|
var entry = new LogText("Must return this text...");
|
||||||
|
|
||||||
|
var text = sut.Format(entry);
|
||||||
|
|
||||||
|
Assert.AreEqual(entry.Text, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MustCorrectlyFormatLogMessage()
|
||||||
|
{
|
||||||
|
var sut = new DefaultLogFormatter();
|
||||||
|
var date = new DateTime(2017, 10, 10, 15, 24, 38);
|
||||||
|
var threadInfo = new ThreadInfo(1234, "ABC");
|
||||||
|
var entry = new LogMessage(date, LogLevel.Warning, "Here's a warning message...", threadInfo);
|
||||||
|
|
||||||
|
var text = sut.Format(entry);
|
||||||
|
|
||||||
|
Assert.AreEqual($"2017-10-10 15:24:38.000 [1234: ABC] - WARNING: Here's a warning message...", text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -67,6 +67,19 @@ namespace SafeExamBrowser.Core.UnitTests.Logging
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public void MustNotAllowLoggingNull()
|
||||||
|
{
|
||||||
|
var sut = new Logger();
|
||||||
|
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Info(null));
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Warn(null));
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Error(null));
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Error(null, null));
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Log((string) null));
|
||||||
|
Assert.ThrowsException<ArgumentNullException>(() => sut.Log((ILogContent) null));
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
[ExpectedException(typeof(ArgumentNullException))]
|
[ExpectedException(typeof(ArgumentNullException))]
|
||||||
public void MustNotAllowNullObserver()
|
public void MustNotAllowNullObserver()
|
||||||
|
|
46
SafeExamBrowser.Core.UnitTests/Logging/ModuleLoggerTests.cs
Normal file
46
SafeExamBrowser.Core.UnitTests/Logging/ModuleLoggerTests.cs
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* 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 Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using Moq;
|
||||||
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
|
using SafeExamBrowser.Core.Logging;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Core.UnitTests.Logging
|
||||||
|
{
|
||||||
|
[TestClass]
|
||||||
|
public class ModuleLoggerTests
|
||||||
|
{
|
||||||
|
[TestMethod]
|
||||||
|
public void MustCorrectlyForwardCalls()
|
||||||
|
{
|
||||||
|
var loggerMock = new Mock<ILogger>();
|
||||||
|
var logObserverMock = new Mock<ILogObserver>();
|
||||||
|
var logText = new LogText("Log text");
|
||||||
|
var sut = new ModuleLogger(loggerMock.Object, typeof(ModuleLoggerTests));
|
||||||
|
|
||||||
|
sut.Info("Info");
|
||||||
|
sut.Warn("Warning");
|
||||||
|
sut.Error("Error");
|
||||||
|
sut.Log("Raw text");
|
||||||
|
sut.Log(logText);
|
||||||
|
sut.Subscribe(logObserverMock.Object);
|
||||||
|
sut.Unsubscribe(logObserverMock.Object);
|
||||||
|
sut.GetLog();
|
||||||
|
|
||||||
|
loggerMock.Verify(l => l.Info($"[{nameof(ModuleLoggerTests)}] Info"), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Warn($"[{nameof(ModuleLoggerTests)}] Warning"), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Error($"[{nameof(ModuleLoggerTests)}] Error"), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Log("Raw text"), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Log(logText), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Subscribe(logObserverMock.Object), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.Unsubscribe(logObserverMock.Object), Times.Once);
|
||||||
|
loggerMock.Verify(l => l.GetLog(), Times.Once);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
SafeExamBrowser.Core.UnitTests/Logging/NewLogContentType.cs
Normal file
21
SafeExamBrowser.Core.UnitTests/Logging/NewLogContentType.cs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017 ETH Zürich, Educational Development and Technology (LET)
|
||||||
|
*
|
||||||
|
* 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 System;
|
||||||
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
|
|
||||||
|
namespace SafeExamBrowser.Core.UnitTests.Logging
|
||||||
|
{
|
||||||
|
class NewLogContentType : ILogContent
|
||||||
|
{
|
||||||
|
public object Clone()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -77,7 +77,10 @@
|
||||||
<Compile Include="Behaviour\ShutdownControllerTests.cs" />
|
<Compile Include="Behaviour\ShutdownControllerTests.cs" />
|
||||||
<Compile Include="I18n\TextTests.cs" />
|
<Compile Include="I18n\TextTests.cs" />
|
||||||
<Compile Include="I18n\XmlTextResourceTests.cs" />
|
<Compile Include="I18n\XmlTextResourceTests.cs" />
|
||||||
|
<Compile Include="Logging\DefaultLogFormatterTests.cs" />
|
||||||
<Compile Include="Logging\LoggerTests.cs" />
|
<Compile Include="Logging\LoggerTests.cs" />
|
||||||
|
<Compile Include="Logging\ModuleLoggerTests.cs" />
|
||||||
|
<Compile Include="Logging\NewLogContentType.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
using System;
|
using System;
|
||||||
using SafeExamBrowser.Contracts.Logging;
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
|
|
||||||
namespace SafeExamBrowser.Core.Entities
|
namespace SafeExamBrowser.Core.Logging
|
||||||
{
|
{
|
||||||
class LogMessage : ILogMessage
|
public class LogMessage : ILogMessage
|
||||||
{
|
{
|
||||||
public DateTime DateTime { get; private set; }
|
public DateTime DateTime { get; private set; }
|
||||||
public LogLevel Severity { get; private set; }
|
public LogLevel Severity { get; private set; }
|
||||||
|
|
|
@ -12,7 +12,6 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using SafeExamBrowser.Contracts.Logging;
|
using SafeExamBrowser.Contracts.Logging;
|
||||||
using SafeExamBrowser.Core.Entities;
|
|
||||||
|
|
||||||
namespace SafeExamBrowser.Core.Logging
|
namespace SafeExamBrowser.Core.Logging
|
||||||
{
|
{
|
||||||
|
@ -24,21 +23,46 @@ namespace SafeExamBrowser.Core.Logging
|
||||||
|
|
||||||
public void Info(string message)
|
public void Info(string message)
|
||||||
{
|
{
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(message));
|
||||||
|
}
|
||||||
|
|
||||||
Add(LogLevel.Info, message);
|
Add(LogLevel.Info, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Warn(string message)
|
public void Warn(string message)
|
||||||
{
|
{
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(message));
|
||||||
|
}
|
||||||
|
|
||||||
Add(LogLevel.Warning, message);
|
Add(LogLevel.Warning, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Error(string message)
|
public void Error(string message)
|
||||||
{
|
{
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(message));
|
||||||
|
}
|
||||||
|
|
||||||
Add(LogLevel.Error, message);
|
Add(LogLevel.Error, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Error(string message, Exception exception)
|
public void Error(string message, Exception exception)
|
||||||
{
|
{
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exception == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(exception));
|
||||||
|
}
|
||||||
|
|
||||||
var details = new StringBuilder();
|
var details = new StringBuilder();
|
||||||
|
|
||||||
details.AppendLine();
|
details.AppendLine();
|
||||||
|
|
|
@ -11,7 +11,7 @@ using SafeExamBrowser.Contracts.Logging;
|
||||||
|
|
||||||
namespace SafeExamBrowser.Core.Logging
|
namespace SafeExamBrowser.Core.Logging
|
||||||
{
|
{
|
||||||
class ThreadInfo : IThreadInfo
|
public class ThreadInfo : IThreadInfo
|
||||||
{
|
{
|
||||||
public int Id { get; private set; }
|
public int Id { get; private set; }
|
||||||
public string Name { get; private set; }
|
public string Name { get; private set; }
|
||||||
|
|
Loading…
Reference in a new issue