BudgetAnalyser.UnitTest.BudgetAnalyserLog4NetLoggerTest.LogAlwaysShouldBeThreadSafe C# (CSharp) Method

LogAlwaysShouldBeThreadSafe() private method

private LogAlwaysShouldBeThreadSafe ( ) : void
return void
        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"));
        }