using System.Globalization; using log4net; using log4net.Core; using GitConverter.Lib.Logging; using log4net.Repository; namespace GitConverter.TestsApp.Logging { /// /// Verify Log4NetAdapter forwards messages and exceptions to the provided log4net ILog. /// public class Log4NetAdapterTests { private class CollectingILog : ILog { public List Messages { get; } = new List(); public List Exceptions { get; } = new List(); // Minimal implementations of ILog methods used by adapter public void Debug(object message) => Messages.Add(Stringify(message)); public void Debug(object message, Exception exception) { Messages.Add(Stringify(message)); Exceptions.Add(exception); } public void Info(object message) => Messages.Add(Stringify(message)); public void Info(object message, Exception exception) { Messages.Add(Stringify(message)); Exceptions.Add(exception); } public void Warn(object message) => Messages.Add(Stringify(message)); public void Warn(object message, Exception exception) { Messages.Add(Stringify(message)); Exceptions.Add(exception); } public void Error(object message) => Messages.Add(Stringify(message)); public void Error(object message, Exception exception) { Messages.Add(Stringify(message)); Exceptions.Add(exception); } // Properties (ILog inherits ILoggerWrapper which requires Logger) public bool IsDebugEnabled => true; public bool IsErrorEnabled => true; public bool IsFatalEnabled => true; public bool IsInfoEnabled => true; public bool IsWarnEnabled => true; public ILoggerRepository Repository => null; // Required by ILoggerWrapper / ILog public ILogger Logger => null; private static string Stringify(object o) => o?.ToString() ?? string.Empty; // Format overloads (common set) public void DebugFormat(string format, params object[] args) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, args)); public void DebugFormat(string format, object arg0) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0)); public void DebugFormat(string format, object arg0, object arg1) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1)); public void DebugFormat(string format, object arg0, object arg1, object arg2) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1, arg2)); public void DebugFormat(IFormatProvider provider, string format, params object[] args) => Messages.Add(string.Format(provider ?? CultureInfo.InvariantCulture, format, args)); public void InfoFormat(string format, params object[] args) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, args)); public void InfoFormat(string format, object arg0) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0)); public void InfoFormat(string format, object arg0, object arg1) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1)); public void InfoFormat(string format, object arg0, object arg1, object arg2) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1, arg2)); public void InfoFormat(IFormatProvider provider, string format, params object[] args) => Messages.Add(string.Format(provider ?? CultureInfo.InvariantCulture, format, args)); public void WarnFormat(string format, params object[] args) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, args)); public void WarnFormat(string format, object arg0) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0)); public void WarnFormat(string format, object arg0, object arg1) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1)); public void WarnFormat(string format, object arg0, object arg1, object arg2) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1, arg2)); public void WarnFormat(IFormatProvider provider, string format, params object[] args) => Messages.Add(string.Format(provider ?? CultureInfo.InvariantCulture, format, args)); public void ErrorFormat(string format, params object[] args) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, args)); public void ErrorFormat(string format, object arg0) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0)); public void ErrorFormat(string format, object arg0, object arg1) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1)); public void ErrorFormat(string format, object arg0, object arg1, object arg2) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1, arg2)); public void ErrorFormat(IFormatProvider provider, string format, params object[] args) => Messages.Add(string.Format(provider ?? CultureInfo.InvariantCulture, format, args)); public void Fatal(object message) { Messages.Add(Stringify(message)); } public void Fatal(object message, Exception exception) { Messages.Add(Stringify(message)); Exceptions.Add(exception); } public void FatalFormat(string format, params object[] args) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, args)); public void FatalFormat(string format, object arg0) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0)); public void FatalFormat(string format, object arg0, object arg1) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1)); public void FatalFormat(string format, object arg0, object arg1, object arg2) => Messages.Add(string.Format(CultureInfo.InvariantCulture, format, arg0, arg1, arg2)); public void FatalFormat(IFormatProvider provider, string format, params object[] args) => Messages.Add(string.Format(provider ?? CultureInfo.InvariantCulture, format, args)); // NOTE: ILog includes additional overloads in some log4net versions. The above covers the common set used by adapters. } [Fact] public void Log4NetAdapter_ForwardsMessagesAndExceptions() { var collector = new CollectingILog(); var adapter = new Log4NetAdapter(collector); var ex = new InvalidOperationException("boom"); adapter.Debug("dmsg"); adapter.Info("imsg"); adapter.Warn("wmsg"); adapter.Error("emsg", ex); Assert.Contains("dmsg", collector.Messages[0], StringComparison.OrdinalIgnoreCase); Assert.Contains("imsg", collector.Messages[1], StringComparison.OrdinalIgnoreCase); Assert.Contains("wmsg", collector.Messages[2], StringComparison.OrdinalIgnoreCase); Assert.Contains("emsg", collector.Messages[3], StringComparison.OrdinalIgnoreCase); Assert.Contains(ex, collector.Exceptions); } } }