Skip to content

Commit 906c692

Browse files
ngbrownhazzik
authored andcommitted
Fix regression caused by logging refactoring (#1479)
- Add tests for legacy logger - Don't split global state for logging. Fixes #1478
1 parent bc30eb4 commit 906c692

File tree

3 files changed

+70
-23
lines changed

3 files changed

+70
-23
lines changed

src/NHibernate.Test/Logging/LoggerProviderTest.cs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using NUnit.Framework;
23

34
namespace NHibernate.Test.Logging
@@ -12,17 +13,29 @@ public void LoggerProviderCanCreateLoggers()
1213
Assert.That(NHibernateLogger.For(typeof (LoggerProviderTest)), Is.Not.Null);
1314
}
1415

16+
[Test, Obsolete]
17+
public void LoggerProviderCanCreateLoggers_Obsolete()
18+
{
19+
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.Null);
20+
Assert.That(LoggerProvider.LoggerFor(typeof (LoggerProviderTest)), Is.Not.Null);
21+
}
22+
1523
[Test]
1624
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory()
1725
{
18-
#pragma warning disable 618
19-
Assert.That(NHibernateLogger.For("pizza"), Is.Not.InstanceOf<NoLoggingInternalLogger>());
20-
#pragma warning restore 618
21-
2226
// NoLoggingNHibernateLogger is internal
2327
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.Not.EqualTo("NoLoggingNHibernateLogger"));
2428
}
2529

30+
[Test, Obsolete]
31+
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory_Obsolete()
32+
{
33+
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.InstanceOf<NoLoggingInternalLogger>());
34+
35+
// works because this is the legacy provider with a legacy logger
36+
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<Log4NetLogger>());
37+
}
38+
2639
[Test, Explicit("Changes global state.")]
2740
public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed()
2841
{
@@ -31,5 +44,30 @@ public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed()
3144
// NoLoggingNHibernateLogger is internal
3245
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.EqualTo("NoLoggingNHibernateLogger"));
3346
}
47+
48+
[Test, Explicit("Changes global state."), Obsolete]
49+
public void WhenConfiguredAsNullThenNoLoggingFactoryIsUsed_Obsolete()
50+
{
51+
NHibernateLogger.SetLoggersFactory(default(INHibernateLoggerFactory));
52+
53+
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<NoLoggingInternalLogger>());
54+
}
55+
56+
[Test, Explicit("Changes global state."), Obsolete]
57+
public void WhenNoLoggingFactoryIsUsedThenNoLoggingInternalLoggerIsReturned()
58+
{
59+
LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());
60+
61+
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.InstanceOf<NoLoggingInternalLogger>());
62+
}
63+
64+
[Test, Explicit("Changes global state."), Obsolete]
65+
public void WhenNoLoggingFactoryIsUsedThenNoLoggingNHibernateLoggerIsReturned()
66+
{
67+
LoggerProvider.SetLoggersFactory(new NoLoggingLoggerFactory());
68+
69+
// NoLoggingNHibernateLogger is internal
70+
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.EqualTo("NoLoggingNHibernateLogger"));
71+
}
3472
}
3573
}

src/NHibernate/Logging.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ public static class NHibernateLogger
5252
private const string nhibernateLoggerConfKey = "nhibernate-logger";
5353
private static INHibernateLoggerFactory _loggerFactory;
5454

55+
#pragma warning disable 618
56+
internal static ILoggerFactory LegacyLoggerFactory { get; private set; }
57+
#pragma warning restore 618
58+
5559
static NHibernateLogger()
5660
{
5761
var nhibernateLoggerClass = GetNhibernateLoggerClass();
@@ -68,9 +72,21 @@ public static void SetLoggersFactory(INHibernateLoggerFactory loggerFactory)
6872
_loggerFactory = loggerFactory ?? new NoLoggingNHibernateLoggerFactory();
6973

7074
#pragma warning disable 618
71-
if (!(loggerFactory is LoggerProvider.LegacyLoggerFactoryAdaptor))
75+
// Also keep global state for obsolete logger
76+
if (loggerFactory == null)
77+
{
78+
LegacyLoggerFactory = new NoLoggingLoggerFactory();
79+
}
80+
else
7281
{
73-
LoggerProvider.SetLoggersFactory(new LoggerProvider.ReverseLegacyLoggerFactoryAdaptor(loggerFactory));
82+
if (loggerFactory is LoggerProvider.LegacyLoggerFactoryAdaptor legacyAdaptor)
83+
{
84+
LegacyLoggerFactory = legacyAdaptor.Factory;
85+
}
86+
else
87+
{
88+
LegacyLoggerFactory = new LoggerProvider.ReverseLegacyLoggerFactoryAdaptor(loggerFactory);
89+
}
7490
}
7591
#pragma warning restore 618
7692
}

src/NHibernate/Logging.obsolete.cs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,54 +82,47 @@ public interface ILoggerFactory
8282
[Obsolete("Use NHibernateLogger instead.")]
8383
public class LoggerProvider
8484
{
85-
private static ILoggerFactory _legacyLoggerFactory;
86-
8785
[Obsolete("Implement INHibernateLoggerFactory and use NHibernateLogger.SetLoggersFactory() instead")]
8886
public static void SetLoggersFactory(ILoggerFactory loggerFactory)
8987
{
90-
_legacyLoggerFactory = loggerFactory ?? new NoLoggingLoggerFactory();
91-
92-
if (!(loggerFactory is ReverseLegacyLoggerFactoryAdaptor))
93-
{
94-
var factory = loggerFactory == null || loggerFactory is NoLoggingLoggerFactory
95-
? null
96-
: (INHibernateLoggerFactory) new LegacyLoggerFactoryAdaptor(loggerFactory);
88+
var factory = (loggerFactory == null || loggerFactory is NoLoggingLoggerFactory)
89+
? null
90+
: (INHibernateLoggerFactory) new LegacyLoggerFactoryAdaptor(loggerFactory);
9791

98-
NHibernateLogger.SetLoggersFactory(factory);
99-
}
92+
NHibernateLogger.SetLoggersFactory(factory);
10093
}
10194

10295
[Obsolete("Use NHibernateLogger.For() instead.")]
10396
public static IInternalLogger LoggerFor(string keyName)
10497
{
105-
return _legacyLoggerFactory.LoggerFor(keyName);
98+
return NHibernateLogger.LegacyLoggerFactory.LoggerFor(keyName);
10699
}
107100

108101
[Obsolete("Use NHibernateLogger.For() instead.")]
109102
public static IInternalLogger LoggerFor(System.Type type)
110103
{
111-
return _legacyLoggerFactory.LoggerFor(type);
104+
return NHibernateLogger.LegacyLoggerFactory.LoggerFor(type);
112105
}
113106

114107
// Since 5.1
115108
[Obsolete("Used only in Obsolete functions to thunk to INHibernateLoggerFactory")]
116109
internal class LegacyLoggerFactoryAdaptor : INHibernateLoggerFactory
117110
{
118-
private readonly ILoggerFactory _factory;
111+
internal ILoggerFactory Factory { get; }
119112

120113
public LegacyLoggerFactoryAdaptor(ILoggerFactory factory)
121114
{
122-
_factory = factory;
115+
Factory = factory;
123116
}
124117

125118
public INHibernateLogger LoggerFor(string keyName)
126119
{
127-
return new NHibernateLoggerThunk(_factory.LoggerFor(keyName));
120+
return new NHibernateLoggerThunk(Factory.LoggerFor(keyName));
128121
}
129122

130123
public INHibernateLogger LoggerFor(System.Type type)
131124
{
132-
return new NHibernateLoggerThunk(_factory.LoggerFor(type));
125+
return new NHibernateLoggerThunk(Factory.LoggerFor(type));
133126
}
134127
}
135128

0 commit comments

Comments
 (0)