public void LogAlwaysShouldBeThreadSafe()
{
var bag = new ConcurrentBag<string>();
MockLogger.Setup(m => m.Error(It.IsAny<object>())).Callback<object>(msg => bag.Add(msg.ToString()));
MockLogger.Setup(m => m.Info(It.IsAny<object>())).Callback<object>(msg => bag.Add(msg.ToString()));
MockLogger.Setup(m => m.IsErrorEnabled).Returns(true);
var threads = new List<Thread>();
for (var threadNumber = 0; threadNumber < 20; threadNumber++)
{
if (threadNumber % 2 == 0)
{
threads.Add(
new Thread(
() =>
{
for (var i = 0; i < 10; i++)
{
Subject.LogError(_ => "Foo");
}
}));
}
else
{
threads.Add(
new Thread(
() =>
{
for (var i = 0; i < 10; i++)
{
Subject.LogAlways(_ => "Always");
}
}));
}
}
threads.ForEach(t => t.Start());
foreach (Thread thread in threads)
{
thread.Join();
}
Assert.AreEqual(200, bag.Count);
Assert.AreEqual(100, bag.Count(msg => msg == "Foo"));
Assert.AreEqual(100, bag.Count(msg => msg == "Always"));
}