public void ShouldCallExceptionHandlerOnTimeoutException() { var waitStrategy = new TimeoutBlockingWaitStrategy(TimeSpan.FromMilliseconds(1)); var ringBuffer = new RingBuffer <StubEvent>(() => new StubEvent(-1), new SingleProducerSequencer(16, waitStrategy)); var sequenceBarrier = ringBuffer.NewBarrier(); var exception = new TaskCompletionSource <Exception>(); var exceptionHandler = new TestExceptionHandler <StubEvent>(x => exception.TrySetResult(x.ex)); var eventHandler = new TestBatchEventHandler <StubEvent> { OnTimeoutAction = TestException.ThrowOnce() }; var eventProcessor = CreateEventProcessor(ringBuffer, sequenceBarrier, eventHandler); ringBuffer.AddGatingSequences(eventProcessor.Sequence); eventProcessor.SetExceptionHandler(exceptionHandler); var task = eventProcessor.Start(); Assert.IsTrue(exception.Task.Wait(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(1, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(0, exceptionHandler.BatchExceptionCount); eventProcessor.Halt(); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(2))); }
public void ShouldCallExceptionHandlerOnMultipleUncaughtException() { var processingSignal = new AutoResetEvent(false); var exceptionHandler = new TestExceptionHandler <StubEvent>(x => processingSignal.Set()); var eventHandler = new TestBatchEventHandler <StubEvent>(x => { if (x.Value == 1) { throw new Exception(); } processingSignal.Set(); }); var eventProcessor = CreateEventProcessor(_ringBuffer, _sequenceBarrier, eventHandler); _ringBuffer.AddGatingSequences(eventProcessor.Sequence); eventProcessor.SetExceptionHandler(exceptionHandler); var task = eventProcessor.Start(); _ringBuffer.PublishStubEvent(0); Assert.IsTrue(processingSignal.WaitOne(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(0, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(0, exceptionHandler.BatchExceptionCount); _ringBuffer.PublishStubEvent(1); Assert.IsTrue(processingSignal.WaitOne(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(0, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(1, exceptionHandler.BatchExceptionCount); _ringBuffer.PublishStubEvent(0); Assert.IsTrue(processingSignal.WaitOne(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(0, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(1, exceptionHandler.BatchExceptionCount); _ringBuffer.PublishStubEvent(1); Assert.IsTrue(processingSignal.WaitOne(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(0, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(2, exceptionHandler.BatchExceptionCount); _ringBuffer.PublishStubEvent(0); Assert.IsTrue(processingSignal.WaitOne(TimeSpan.FromSeconds(2))); Assert.AreEqual(0, exceptionHandler.EventExceptionCount); Assert.AreEqual(0, exceptionHandler.TimeoutExceptionCount); Assert.AreEqual(2, exceptionHandler.BatchExceptionCount); eventProcessor.Halt(); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(2))); }
public void ShouldCallMethodsInLifecycleOrderForBatch() { var eventSignal = new CountdownEvent(3); var eventHandler = new TestBatchEventHandler <StubEvent>(x => eventSignal.Signal()); var eventProcessor = CreateEventProcessor(_ringBuffer, _sequenceBarrier, eventHandler); _ringBuffer.AddGatingSequences(eventProcessor.Sequence); _ringBuffer.PublishStubEvent(0); _ringBuffer.PublishStubEvent(0); _ringBuffer.PublishStubEvent(0); var task = eventProcessor.Start(); Assert.IsTrue(eventSignal.Wait(TimeSpan.FromSeconds(2))); eventProcessor.Halt(); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(2))); }
public void ShouldCallOnTimeout() { var waitStrategy = new TimeoutBlockingWaitStrategy(TimeSpan.FromMilliseconds(1)); var ringBuffer = new RingBuffer <StubEvent>(() => new StubEvent(-1), new SingleProducerSequencer(16, waitStrategy)); var sequenceBarrier = ringBuffer.NewBarrier(); var onTimeoutSignal = new ManualResetEvent(false); var eventHandler = new TestBatchEventHandler <StubEvent> { OnTimeoutAction = () => onTimeoutSignal.Set() }; var eventProcessor = CreateEventProcessor(ringBuffer, sequenceBarrier, eventHandler); ringBuffer.AddGatingSequences(eventProcessor.Sequence); var task = eventProcessor.Start(); Assert.IsTrue(onTimeoutSignal.WaitOne(TimeSpan.FromSeconds(2))); eventProcessor.Halt(); Assert.IsTrue(task.Wait(TimeSpan.FromSeconds(2))); }