Exemplo n.º 1
0
        public void BufferingTargetWrapperSyncWithTimedFlushNonSlidingTest()
        {
            var myTarget      = new MyTarget();
            var targetWrapper = new BufferingTargetWrapper
            {
                WrappedTarget  = myTarget,
                BufferSize     = 10,
                FlushTimeout   = 400,
                SlidingTimeout = false,
            };

            InitializeTargets(myTarget, targetWrapper);

            const int totalEvents = 100;

            var continuationHit    = new bool[totalEvents];
            var lastException      = new Exception[totalEvents];
            var continuationThread = new Thread[totalEvents];
            var hitCount           = 0;

            CreateContinuationFunc createAsyncContinuation =
                eventNumber =>
                ex =>
            {
                lastException[eventNumber]      = ex;
                continuationThread[eventNumber] = Thread.CurrentThread;
                continuationHit[eventNumber]    = true;
                Interlocked.Increment(ref hitCount);
            };

            var eventCounter = 0;

            targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            Thread.Sleep(300);

            Assert.AreEqual(0, hitCount);
            Assert.AreEqual(0, myTarget.WriteCount);

            targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            Thread.Sleep(300);

            Assert.AreEqual(2, hitCount);
            Assert.AreEqual(2, myTarget.WriteCount);
        }
        public void BufferingTargetWrapperSyncWithTimedFlushTest()
        {
            RetryingIntegrationTest(3, () =>
            {
                var myTarget = new MyTarget();
                var targetWrapper = new BufferingTargetWrapper
                {
                    WrappedTarget = myTarget,
                    BufferSize = 10,
                    FlushTimeout = 50,
                };

                InitializeTargets(myTarget, targetWrapper);

                const int totalEvents = 100;

                var continuationHit = new bool[totalEvents];
                var lastException = new Exception[totalEvents];
                var continuationThread = new Thread[totalEvents];
                var hitCount = 0;

                CreateContinuationFunc createAsyncContinuation =
                    eventNumber =>
                        ex =>
                        {
                            lastException[eventNumber] = ex;
                            continuationThread[eventNumber] = Thread.CurrentThread;
                            continuationHit[eventNumber] = true;
                            Interlocked.Increment(ref hitCount);
                        };

                // write 9 events - they will all be buffered and no final continuation will be reached
                var eventCounter = 0;
                for (var i = 0; i < 9; ++i)
                {
                    targetWrapper.WriteAsyncLogEvent(
                        new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
                }

                Assert.Equal(0, hitCount);
                Assert.Equal(0, myTarget.WriteCount);

                // sleep 100 ms, this will trigger the timer and flush all events
                Thread.Sleep(100);
                Assert.Equal(9, hitCount);
                Assert.Equal(1, myTarget.BufferedWriteCount);
                Assert.Equal(9, myTarget.BufferedTotalEvents);
                Assert.Equal(9, myTarget.WriteCount);
                for (var i = 0; i < hitCount; ++i)
                {
                    Assert.NotSame(Thread.CurrentThread, continuationThread[i]);
                    Assert.Null(lastException[i]);
                }

                // write 11 more events, 10 will be hit immediately because the buffer will fill up
                // 1 will be pending
                for (var i = 0; i < 11; ++i)
                {
                    targetWrapper.WriteAsyncLogEvent(
                        new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
                }

                Assert.Equal(19, hitCount);
                Assert.Equal(2, myTarget.BufferedWriteCount);
                Assert.Equal(19, myTarget.BufferedTotalEvents);
                Assert.Equal(19, myTarget.WriteCount);

                // sleep 100ms and the last remaining one will be flushed
                Thread.Sleep(100);
                Assert.Equal(20, hitCount);
                Assert.Equal(3, myTarget.BufferedWriteCount);
                Assert.Equal(20, myTarget.BufferedTotalEvents);
                Assert.Equal(20, myTarget.WriteCount);

            });
        }
        public void BufferingTargetWrapperSyncTest1()
        {
            var myTarget = new MyTarget();
            var targetWrapper = new BufferingTargetWrapper
            {
                WrappedTarget = myTarget,
                BufferSize = 10,
            };

            InitializeTargets(myTarget, targetWrapper);

            const int totalEvents = 100;

            var continuationHit = new bool[totalEvents];
            var lastException = new Exception[totalEvents];
            var continuationThread = new Thread[totalEvents];
            var hitCount = 0;

            CreateContinuationFunc createAsyncContinuation =
                eventNumber =>
                    ex =>
                    {
                        lastException[eventNumber] = ex;
                        continuationThread[eventNumber] = Thread.CurrentThread;
                        continuationHit[eventNumber] = true;
                        Interlocked.Increment(ref hitCount);
                    };

            // write 9 events - they will all be buffered and no final continuation will be reached
            var eventCounter = 0;
            for (var i = 0; i < 9; ++i)
            {
                targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            }

            Assert.Equal(0, hitCount);
            Assert.Equal(0, myTarget.WriteCount);

            // write one more event - everything will be flushed
            targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            Assert.Equal(10, hitCount);
            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(10, myTarget.BufferedTotalEvents);
            Assert.Equal(10, myTarget.WriteCount);
            for (var i = 0; i < hitCount; ++i)
            {
                Assert.Same(Thread.CurrentThread, continuationThread[i]);
                Assert.Null(lastException[i]);
            }

            // write 9 more events - they will all be buffered and no final continuation will be reached
            for (var i = 0; i < 9; ++i)
            {
                targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            }

            // no change
            Assert.Equal(10, hitCount);
            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(10, myTarget.BufferedTotalEvents);
            Assert.Equal(10, myTarget.WriteCount);

            Exception flushException = null;
            var flushHit = new ManualResetEvent(false);

            targetWrapper.Flush(
                ex =>
                {
                    flushException = ex;
                    flushHit.Set();
                });

            flushHit.WaitOne();
            Assert.Null(flushException);

            // make sure remaining events were written
            Assert.Equal(19, hitCount);
            Assert.Equal(2, myTarget.BufferedWriteCount);
            Assert.Equal(19, myTarget.BufferedTotalEvents);
            Assert.Equal(19, myTarget.WriteCount);
            Assert.Equal(1, myTarget.FlushCount);

            // flushes happen on the same thread
            for (var i = 10; i < hitCount; ++i)
            {
                Assert.NotNull(continuationThread[i]);
                Assert.Same(Thread.CurrentThread, continuationThread[i]);
                Assert.Null(lastException[i]);
            }

            // flush again - should just invoke Flush() on the wrapped target
            flushHit.Reset();
            targetWrapper.Flush(
                ex =>
                {
                    flushException = ex;
                    flushHit.Set();
                });

            flushHit.WaitOne();
            Assert.Equal(19, hitCount);
            Assert.Equal(2, myTarget.BufferedWriteCount);
            Assert.Equal(19, myTarget.BufferedTotalEvents);
            Assert.Equal(19, myTarget.WriteCount);
            Assert.Equal(2, myTarget.FlushCount);

            targetWrapper.Close();
            myTarget.Close();
        }
Exemplo n.º 4
0
        public void BufferingTargetWrapperSyncWithOverflowDiscardTest()
        {
            const int totalEvents = 15;
            const int bufferSize  = 10;

            var myTarget      = new MyTarget();
            var targetWrapper = new BufferingTargetWrapper
            {
                WrappedTarget  = myTarget,
                BufferSize     = bufferSize,
                OverflowAction = BufferingTargetWrapperOverflowAction.Discard
            };

            InitializeTargets(myTarget, targetWrapper);

            var continuationHit = new bool[totalEvents];
            var hitCount        = 0;
            CreateContinuationFunc createAsyncContinuation =
                eventNumber =>
                ex =>
            {
                continuationHit[eventNumber] = true;
                Interlocked.Increment(ref hitCount);
            };

            Assert.Equal(0, myTarget.WriteCount);

            for (int i = 0; i < totalEvents; i++)
            {
                targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(i)));
            }

            // No events should be written to the wrapped target unless flushing manually.
            Assert.Equal(0, myTarget.WriteCount);
            Assert.Equal(0, myTarget.BufferedWriteCount);
            Assert.Equal(0, myTarget.BufferedTotalEvents);

            targetWrapper.Flush(e => { });
            Assert.Equal(bufferSize, hitCount);
            Assert.Equal(bufferSize, myTarget.WriteCount);
            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(bufferSize, myTarget.BufferedTotalEvents);

            // Validate that we dropped the oldest events.
            Assert.False(continuationHit[totalEvents - bufferSize - 1]);
            Assert.True(continuationHit[totalEvents - bufferSize]);

            // Make sure the events do not stay in the buffer.
            targetWrapper.Flush(e => { });
            Assert.Equal(bufferSize, hitCount);
            Assert.Equal(bufferSize, myTarget.WriteCount);
            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(bufferSize, myTarget.BufferedTotalEvents);

            // Make sure that events are discarded when closing target (config-reload + shutdown)
            targetWrapper.WriteAsyncLogEvent(new LogEventInfo().WithContinuation(createAsyncContinuation(totalEvents)));
            targetWrapper.Close();
            Assert.Equal(bufferSize, hitCount);
            Assert.Equal(bufferSize, myTarget.WriteCount);
            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(bufferSize, myTarget.BufferedTotalEvents);
        }
        public void BufferingTargetWrapperSyncWithTimedFlushTest()
        {
            var myTarget      = new MyTarget();
            var targetWrapper = new BufferingTargetWrapper
            {
                WrappedTarget = myTarget,
                BufferSize    = 10,
                FlushTimeout  = 50,
            };
            var writeHit = new ManualResetEvent(false);

            InitializeTargets(myTarget, targetWrapper);

            const int totalEvents = 100;

            var continuationHit    = new bool[totalEvents];
            var lastException      = new Exception[totalEvents];
            var continuationThread = new Thread[totalEvents];
            var hitCount           = 0;

            CreateContinuationFunc createAsyncContinuation =
                eventNumber =>
                ex =>
            {
                lastException[eventNumber]      = ex;
                continuationThread[eventNumber] = Thread.CurrentThread;
                continuationHit[eventNumber]    = true;
                Interlocked.Increment(ref hitCount);
                writeHit.Set();
            };

            // write 9 events - they will all be buffered and no final continuation will be reached
            var eventCounter = 0;

            for (var i = 0; i < 9; ++i)
            {
                targetWrapper.WriteAsyncLogEvent(
                    new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            }

            Assert.Equal(0, hitCount);
            Assert.Equal(0, myTarget.WriteCount);

            // sleep and wait for the trigger timer to flush all events
            Assert.True(writeHit.WaitOne(5000), "Wait Write Timeout");
            WaitAndAssertExpectedValue(ref hitCount, 9);

            Assert.Equal(1, myTarget.BufferedWriteCount);
            Assert.Equal(9, myTarget.BufferedTotalEvents);
            Assert.Equal(9, myTarget.WriteCount);
            for (var i = 0; i < hitCount; ++i)
            {
                Assert.NotSame(Thread.CurrentThread, continuationThread[i]);
                Assert.Null(lastException[i]);
            }

            // write 11 more events, 10 will be hit immediately because the buffer will fill up
            // 1 will be pending
            for (var i = 0; i < 11; ++i)
            {
                targetWrapper.WriteAsyncLogEvent(
                    new LogEventInfo().WithContinuation(createAsyncContinuation(eventCounter++)));
            }

            Assert.Equal(19, hitCount);
            Assert.Equal(2, myTarget.BufferedWriteCount);
            Assert.Equal(19, myTarget.BufferedTotalEvents);
            Assert.Equal(19, myTarget.WriteCount);

            // sleep and wait for the remaining one to be flushed
            WaitAndAssertExpectedValue(ref hitCount, 20);
            Assert.Equal(3, myTarget.BufferedWriteCount);
            Assert.Equal(20, myTarget.BufferedTotalEvents);
            Assert.Equal(20, myTarget.WriteCount);
        }