public void TestWritingToQueuingWriter()
        {
            var msg = new SyslogMessage
            {
                Facility = SyslogFacility.ClockDaemon1,
                Severity = SyslogSeverity.Alert
            };

            var mockRepo = new MockRepository(MockBehavior.Strict);

            Mock <ISyslogMessageWriter> syslogMessageWriterMock = mockRepo.Create <ISyslogMessageWriter>();

            using (AutoResetEvent evt = new AutoResetEvent(false))
            {
                syslogMessageWriterMock.Setup(w => w.Write(msg)).Callback(() =>
                {
                    // ReSharper disable once AccessToDisposedClosure
                    evt.Set( );
                });

                var queuingWriter = new SyslogQueueingMessageWriter(syslogMessageWriterMock.Object, 2);

                queuingWriter.Write(msg);

                evt.WaitOne(3000);
            }

            mockRepo.VerifyAll();
        }
        public void TestWritingNullMessage()
        {
            var mockRepo = new MockRepository(MockBehavior.Loose);

            Mock <ISyslogMessageWriter> syslogMessageWriterMock = mockRepo.Create <ISyslogMessageWriter>();

            var queuingWriter = new SyslogQueueingMessageWriter(syslogMessageWriterMock.Object, 2);

            Assert.Throws <ArgumentNullException>(() => queuingWriter.Write(null));
        }
        public void TestFailingWriteSuccessfullRetryToQueuingWriter()
        {
            int    maxRetries = 2;
            string msgId      = "TestMessageId";
            var    msg        = new SyslogMessage
            {
                Facility = SyslogFacility.ClockDaemon1,
                Severity = SyslogSeverity.Alert,
                MsgId    = msgId
            };

            var mockRepo = new MockRepository(MockBehavior.Strict);

            using (CountdownEvent evt = new CountdownEvent(maxRetries))
            {
                Mock <ISyslogMessageWriter> syslogMessageWriterMock = mockRepo.Create <ISyslogMessageWriter>( );
                syslogMessageWriterMock.Setup(w => w.Write(msg)).Callback <SyslogMessage>(m =>
                {
                    // ReSharper disable once AccessToDisposedClosure
                    evt.Signal( );

                    // ReSharper disable once AccessToDisposedClosure
                    if (evt.CurrentCount == 1)
                    {
                        // Throw on first call
                        throw new InvalidOperationException( );
                    }
                });

                var queuingWriter = new SyslogQueueingMessageWriter(syslogMessageWriterMock.Object, maxRetries);

                // Test
                queuingWriter.Write(msg);

                evt.Wait(3000);

                // Validation
                syslogMessageWriterMock.Verify(w => w.Write(It.IsAny <SyslogMessage>( )), Times.Exactly(maxRetries));
            }

            mockRepo.VerifyAll();
        }
        public void TestDisposeFlushesQueueingWriter()
        {
            var syncRoot = new object();

            var msg = new SyslogMessage
            {
                Facility = SyslogFacility.ClockDaemon1,
                Severity = SyslogSeverity.Alert
            };

            var mockRepo = new MockRepository(MockBehavior.Strict);

            int messagesProcessed = 0;

            Mock <ISyslogMessageWriter> syslogMessageWriterMock = mockRepo.Create <ISyslogMessageWriter>();

            syslogMessageWriterMock.Setup(w => w.Write(msg)).Callback <SyslogMessage>(m =>
            {
                lock (syncRoot)
                {
                    messagesProcessed++;
                }
            });

            var queuingWriter = new SyslogQueueingMessageWriter(syslogMessageWriterMock.Object, 2);

            // Lock when writing to queue to force the writer to wait so that the dispose actually has work to do
            lock (syncRoot)
            {
                for (int i = 0; i < 10; i++)
                {
                    queuingWriter.Write(msg);
                }
            }

            queuingWriter.Dispose();

            Assert.AreEqual(10, messagesProcessed, "The number of processed messages is invalid.");

            mockRepo.VerifyAll();
        }