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…
	
	Add table
		
		Reference in a new issue
	
	 dbuechel
						dbuechel