예제 #1
0
        public async Task Should_reset_consumer_when_resetting()
        {
            await sut.OnActivateAsync(consumerName);

            await sut.ActivateAsync();

            await sut.StopAsync();

            await sut.ResetAsync();

            state.Should().BeEquivalentTo(new EventConsumerState {
                IsStopped = false, Position = null, Error = null
            });

            A.CallTo(() => persistence.WriteSnapshotAsync(A <EventConsumerState> .Ignored))
            .MustHaveHappened(Repeated.Exactly.Twice);

            A.CallTo(() => eventConsumer.ClearAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventSubscription.StopAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, state.Position))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, null))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
        public async Task Should_reset_consumer_when_resetting()
        {
            await sut.ActivateAsync(consumerName);

            await sut.ActivateAsync();

            await sut.StopAsync();

            await sut.ResetAsync();

            grainState.Value.Should().BeEquivalentTo(new EventConsumerState {
                IsStopped = false, Position = null, Error = null
            });

            A.CallTo(() => grainState.WriteAsync())
            .MustHaveHappened(2, Times.Exactly);

            A.CallTo(() => eventConsumer.ClearAsync())
            .MustHaveHappened(1, Times.Exactly);

            A.CallTo(() => eventSubscription.StopAsync())
            .MustHaveHappened(1, Times.Exactly);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, grainState.Value.Position))
            .MustHaveHappened(1, Times.Exactly);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, null))
            .MustHaveHappened(1, Times.Exactly);
        }
예제 #3
0
        public async Task Should_reset_consumer_if_resetting()
        {
            await sut.ActivateAsync(consumerName);

            await sut.ActivateAsync();

            await sut.StopAsync();

            await sut.ResetAsync();

            await sut.CompleteAsync();

            AssertGrainState(isStopped: false, position: null);

            A.CallTo(() => grainState.WriteAsync())
            .MustHaveHappened(2, Times.Exactly);

            A.CallTo(() => eventConsumer.ClearAsync())
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => eventSubscription.Unsubscribe())
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> ._, A <string> ._, grainState.Value.Position))
            .MustHaveHappenedOnceExactly();

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> ._, A <string> ._, null))
            .MustHaveHappenedOnceExactly();
        }
        public async Task Should_reset_consumer_when_resetting()
        {
            await OnSubscribeAsync();

            sutActor.Tell(new StopConsumerMessage());
            sutActor.Tell(new ResetConsumerMessage());
            sut.Dispose();

            A.CallTo(() => eventConsumerInfoRepository.SetAsync(consumerName, consumerInfo.Position, false, null))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventConsumerInfoRepository.SetAsync(consumerName, consumerInfo.Position, true, null))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventConsumerInfoRepository.SetAsync(consumerName, null, false, null))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventConsumer.ClearAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventSubscription.StopAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, consumerInfo.Position))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, null))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
예제 #5
0
        public void Should_reset_consumer_when_resetting()
        {
            sut.Activate(eventConsumer);
            sut.Stop();
            sut.Reset();
            sut.Dispose();

            state.ShouldBeEquivalentTo(new EventConsumerState {
                IsStopped = false, Position = null, Error = null
            });

            A.CallTo(() => stateHolder.WriteAsync())
            .MustHaveHappened(Repeated.Exactly.Twice);

            A.CallTo(() => eventConsumer.ClearAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventSubscription.StopAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, state.Position))
            .MustHaveHappened(Repeated.Exactly.Once);

            A.CallTo(() => eventStore.CreateSubscription(A <IEventSubscriber> .Ignored, A <string> .Ignored, null))
            .MustHaveHappened(Repeated.Exactly.Once);
        }
예제 #6
0
        public async Task Should_clear_all_consumers()
        {
            A.CallTo(() => consumer1.ClearAsync()).
            Returns(TaskHelper.Done);

            A.CallTo(() => consumer2.ClearAsync())
            .Returns(TaskHelper.Done);

            var sut = new CompoundEventConsumer("consumer-name", consumer1, consumer2);

            await sut.ClearAsync();

            A.CallTo(() => consumer1.ClearAsync()).MustHaveHappened();
            A.CallTo(() => consumer2.ClearAsync()).MustHaveHappened();
        }
예제 #7
0
        private async Task ResetAsync()
        {
            var consumerName = eventConsumer.Name;

            var actionId = Guid.NewGuid().ToString();

            try
            {
                log.LogInformation(w => w
                                   .WriteProperty("action", "EventConsumerReset")
                                   .WriteProperty("actionId", actionId)
                                   .WriteProperty("state", "Started")
                                   .WriteProperty("eventConsumer", consumerName));

                await eventConsumer.ClearAsync();

                await eventConsumerInfoRepository.SetLastHandledEventNumberAsync(consumerName, -1);

                log.LogInformation(w => w
                                   .WriteProperty("action", "EventConsumerReset")
                                   .WriteProperty("actionId", actionId)
                                   .WriteProperty("state", "Completed")
                                   .WriteProperty("eventConsumer", consumerName));

                OnReset?.Invoke();
            }
            catch (Exception ex)
            {
                log.LogFatal(ex, w => w
                             .WriteProperty("action", "EventConsumerReset")
                             .WriteProperty("actionId", actionId)
                             .WriteProperty("state", "Completed")
                             .WriteProperty("eventConsumer", consumerName));
            }
        }
예제 #8
0
        private async Task ResetAsync(IEventConsumer eventConsumer)
        {
            var actionId = Guid.NewGuid().ToString();

            try
            {
                log.LogInformation(w => w
                                   .WriteProperty("action", "EventConsumerReset")
                                   .WriteProperty("actionId", actionId)
                                   .WriteProperty("state", "Started")
                                   .WriteProperty("eventConsumer", eventConsumer.Name));

                await eventConsumer.ClearAsync();

                await eventConsumerInfoRepository.SetPositionAsync(eventConsumer.Name, null, true);

                log.LogInformation(w => w
                                   .WriteProperty("action", "EventConsumerReset")
                                   .WriteProperty("actionId", actionId)
                                   .WriteProperty("state", "Completed")
                                   .WriteProperty("eventConsumer", eventConsumer.Name));
            }
            catch (Exception ex)
            {
                log.LogFatal(ex, w => w
                             .WriteProperty("action", "EventConsumerReset")
                             .WriteProperty("actionId", actionId)
                             .WriteProperty("state", "Completed")
                             .WriteProperty("eventConsumer", eventConsumer.GetType().Name));

                throw;
            }
        }
예제 #9
0
        public void Should_reset_if_requested()
        {
            consumerInfo.IsResetting = true;
            consumerInfo.Position    = "2";

            sut.Subscribe(eventConsumer);
            sut.Refresh();
            sut.Dispose();

            A.CallTo(() => eventConsumer.On(envelope1)).MustHaveHappened();
            A.CallTo(() => eventConsumer.On(envelope2)).MustHaveHappened();
            A.CallTo(() => eventConsumer.On(envelope3)).MustHaveHappened();

            A.CallTo(() => eventConsumer.ClearAsync()).MustHaveHappened();
        }
예제 #10
0
        private async Task ClearAsync()
        {
            var logContext = (actionId : Guid.NewGuid().ToString(), consumer : eventConsumer.Name);

            log.LogInformation(logContext, (ctx, w) => w
                               .WriteProperty("action", "EventConsumerReset")
                               .WriteProperty("actionId", ctx.actionId)
                               .WriteProperty("status", "Started")
                               .WriteProperty("eventConsumer", ctx.consumer));

            using (log.MeasureTrace(logContext, (ctx, w) => w
                                    .WriteProperty("action", "EventConsumerReset")
                                    .WriteProperty("actionId", ctx.actionId)
                                    .WriteProperty("status", "Completed")
                                    .WriteProperty("eventConsumer", ctx.consumer)))
            {
                await eventConsumer.ClearAsync();
            }
        }
예제 #11
0
        private async Task ClearAsync()
        {
            var actionId = Guid.NewGuid().ToString();

            log.LogInformation(w => w
                               .WriteProperty("action", "EventConsumerReset")
                               .WriteProperty("actionId", actionId)
                               .WriteProperty("state", "Started")
                               .WriteProperty("eventConsumer", eventConsumer.Name));

            using (log.MeasureTrace(w => w
                                    .WriteProperty("action", "EventConsumerReset")
                                    .WriteProperty("actionId", actionId)
                                    .WriteProperty("state", "Completed")
                                    .WriteProperty("eventConsumer", eventConsumer.Name)))
            {
                await eventConsumer.ClearAsync();
            }
        }
예제 #12
0
        public async Task Should_do_nothing_on_clear()
        {
            IEventConsumer consumer = sut;

            await consumer.ClearAsync();
        }