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