Skip to content

Commit 56ab069

Browse files
danielmarbachtimbussmann
authored andcommitted
Ability to scope the TestingLoggerFactory (#147)
1 parent 43fcfa9 commit 56ab069

File tree

8 files changed

+345
-69
lines changed

8 files changed

+345
-69
lines changed

src/NServiceBus.Testing.Tests/ApprovalFiles/APIApprovals.Approve.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ namespace NServiceBus.Testing
363363
public class TestingLoggerFactory : NServiceBus.Logging.LoggingFactoryDefinition
364364
{
365365
public TestingLoggerFactory() { }
366+
public System.IDisposable BeginScope(System.IO.TextWriter writer, NServiceBus.Logging.LogLevel level = 0) { }
366367
protected override NServiceBus.Logging.ILoggerFactory GetLoggingFactory() { }
367368
public void Level(NServiceBus.Logging.LogLevel level) { }
368369
public void WriteTo(System.IO.TextWriter writer) { }
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
namespace NServiceBus.Testing.Tests.Logging
2+
{
3+
using System;
4+
using System.IO;
5+
using NServiceBus.Logging;
6+
using NUnit.Framework;
7+
8+
[TestFixture]
9+
[Parallelizable]
10+
public class LoggingForFixtureTests
11+
{
12+
StringWriter writer;
13+
IDisposable scope;
14+
15+
[SetUp]
16+
public void Setup()
17+
{
18+
writer = new StringWriter();
19+
20+
this.scope = LogManager.Use<TestingLoggerFactory>()
21+
.BeginScope(writer);
22+
}
23+
24+
[Test]
25+
public void Should_write_first_independent_from_other()
26+
{
27+
var Logger = LogManager.GetLogger<LoggingForFixtureTests>();
28+
Logger.Debug("First");
29+
30+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingForFixtureTests First", writer.ToString());
31+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingForFixtureTests Second", writer.ToString());
32+
}
33+
34+
[Test]
35+
public void Should_write_second_independent_from_other()
36+
{
37+
var Logger = LogManager.GetLogger<LoggingForFixtureTests>();
38+
Logger.Debug("Second");
39+
40+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingForFixtureTests Second", writer.ToString());
41+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingForFixtureTests First", writer.ToString());
42+
}
43+
44+
[TearDown]
45+
public void Teardown()
46+
{
47+
scope.Dispose();
48+
}
49+
}
50+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
namespace NServiceBus.Testing.Tests.Logging
2+
{
3+
using System;
4+
using System.IO;
5+
using NServiceBus.Logging;
6+
using NUnit.Framework;
7+
8+
[TestFixture]
9+
public class LoggingTests
10+
{
11+
[TearDown]
12+
public void Teardown()
13+
{
14+
SomeClassThatUsesStaticLogger.Reset();
15+
}
16+
17+
[Test]
18+
public void Scoped_Writer_should_be_honored()
19+
{
20+
var firstStringWriter = new StringWriter();
21+
var loggerFactory = LogManager.Use<TestingLoggerFactory>();
22+
using (loggerFactory.BeginScope(firstStringWriter))
23+
{
24+
var firstInstance = new SomeClassThatUsesStaticLogger();
25+
firstInstance.DoSomething();
26+
}
27+
28+
var secondStringWriter = new StringWriter();
29+
using (loggerFactory.BeginScope(secondStringWriter))
30+
{
31+
var secondInstance = new SomeClassThatUsesStaticLogger();
32+
secondInstance.DoSomething();
33+
}
34+
35+
var firstLogString = firstStringWriter.ToString();
36+
var secondLogString = secondStringWriter.ToString();
37+
38+
Assert.AreNotEqual(firstLogString, secondLogString);
39+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 0", firstLogString);
40+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 1", firstLogString);
41+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 1", secondLogString);
42+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 0", secondLogString);
43+
}
44+
45+
[Test]
46+
public void Scoped_Loglevel_should_be_honored()
47+
{
48+
var firstStringWriter = new StringWriter();
49+
var loggerFactory = LogManager.Use<TestingLoggerFactory>();
50+
using (loggerFactory.BeginScope(firstStringWriter, LogLevel.Warn))
51+
{
52+
var firstInstance = new SomeClassThatUsesStaticLogger();
53+
firstInstance.DoSomething();
54+
}
55+
56+
var secondStringWriter = new StringWriter();
57+
using (loggerFactory.BeginScope(secondStringWriter))
58+
{
59+
var secondInstance = new SomeClassThatUsesStaticLogger();
60+
secondInstance.DoSomething();
61+
}
62+
63+
var firstLogString = firstStringWriter.ToString();
64+
var secondLogString = secondStringWriter.ToString();
65+
66+
Assert.AreNotEqual(firstLogString, secondLogString);
67+
Assert.IsEmpty(firstLogString);
68+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 1", secondLogString);
69+
}
70+
71+
[Test]
72+
public void Global_Writer_should_be_honored()
73+
{
74+
var loggerFactory = LogManager.Use<TestingLoggerFactory>();
75+
var globalWriter = new StringWriter();
76+
loggerFactory.WriteTo(globalWriter);
77+
78+
var firstInstance = new SomeClassThatUsesStaticLogger();
79+
firstInstance.DoSomething();
80+
81+
var secondStringWriter = new StringWriter();
82+
using (loggerFactory.BeginScope(secondStringWriter))
83+
{
84+
var secondInstance = new SomeClassThatUsesStaticLogger();
85+
secondInstance.DoSomething();
86+
}
87+
88+
var globalLogString = globalWriter.ToString();
89+
var scopedLogString = secondStringWriter.ToString();
90+
91+
Assert.AreNotEqual(globalLogString, scopedLogString);
92+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 0", globalLogString);
93+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 1", globalLogString);
94+
StringAssert.Contains("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 1", scopedLogString);
95+
StringAssert.DoesNotContain("NServiceBus.Testing.Tests.Logging.LoggingTests+SomeClassThatUsesStaticLogger 0", scopedLogString);
96+
}
97+
98+
[Test]
99+
public void Scope_cannot_be_nested()
100+
{
101+
Assert.Throws<InvalidOperationException>(() =>
102+
{
103+
var loggerFactory = LogManager.Use<TestingLoggerFactory>();
104+
using (loggerFactory.BeginScope(new StringWriter()))
105+
using (loggerFactory.BeginScope(new StringWriter()))
106+
{
107+
}
108+
});
109+
}
110+
111+
[Test]
112+
public void NoScope_does_work()
113+
{
114+
LogManager.Use<TestingLoggerFactory>();
115+
116+
var secondInstance = new SomeClassThatUsesStaticLogger();
117+
secondInstance.DoSomething();
118+
}
119+
120+
class SomeClassThatUsesStaticLogger
121+
{
122+
public SomeClassThatUsesStaticLogger()
123+
{
124+
InstanceCounter = instanceCounter++;
125+
}
126+
127+
public int InstanceCounter { get; }
128+
129+
public void DoSomething()
130+
{
131+
Logger.Debug(InstanceCounter.ToString());
132+
}
133+
134+
public static void Reset()
135+
{
136+
instanceCounter = 0;
137+
}
138+
139+
static int instanceCounter;
140+
141+
static ILog Logger = LogManager.GetLogger<SomeClassThatUsesStaticLogger>();
142+
}
143+
}
144+
}

0 commit comments

Comments
 (0)