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(); }
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); }