public void multiple_messages_get_timed_out_and_parked_after_max_retry_count() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMaxRetriesOf(0) .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1), }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.Now.AddSeconds(3)); Assert.AreEqual(0, envelope1.Replies.Count); Assert.AreEqual(2, parker.ParkedEvents.Count); Assert.IsTrue(id1 == parker.ParkedEvents[0].OriginalEvent.EventId || id1 == parker.ParkedEvents[1].OriginalEvent.EventId); Assert.IsTrue(id2 == parker.ParkedEvents[0].OriginalEvent.EventId || id2 == parker.ParkedEvents[1].OriginalEvent.EventId); }
public void timeout_park_correctly_tracks_the_available_client_slots() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .WithMaxRetriesOf(0) .WithMessageTimeoutOf(TimeSpan.Zero) .StartFromBeginning()); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 2, "foo", "bar"); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 0), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 1) }, 1, false); Assert.AreEqual(2, envelope1.Replies.Count); // Should expire first 2 and send to park. sub.NotifyClockTick(DateTime.Now.AddSeconds(1)); parker.ParkMessageCompleted(0, OperationResult.Success); parker.ParkMessageCompleted(1, OperationResult.Success); Assert.AreEqual(2, parker.ParkedEvents.Count); // The next 2 should still be sent to client. sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 0), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 1) }, 1, false); Assert.AreEqual(4, envelope1.Replies.Count); }
public void with_no_timeouts_to_happen_no_timeouts_happen() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(3))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1) }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.Now.AddSeconds(1)); Assert.AreEqual(0, envelope1.Replies.Count); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void subscription_does_not_write_checkpoint_on_time_when_min_is_not_hit() { int cp = -1; var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => cp = i)) .WithMessageParker(new FakeMessageParker()) .PreferDispatchToSingle() .StartFromBeginning() .MinimumToCheckPoint(2) .MaximumToCheckPoint(5)); reader.Load(null); var corrid = Guid.NewGuid(); sub.AddClient(corrid, Guid.NewGuid(), envelope1, 10, "foo", "bar"); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id, "type", "streamName", 0), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 1) }, 1, false); sub.AcknowledgeMessagesProcessed(corrid, new[] { id }); sub.NotifyClockTick(DateTime.Now); Assert.AreEqual(1, cp); }
public void messages_dont_get_retried_when_acked_on_synchronous_reads() { var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1) }, 1, false); sub.GetNextNOrLessMessages(2).ToArray(); sub.AcknowledgeMessagesProcessed(Guid.Empty, new[] { id1, id2 }); sub.NotifyClockTick(DateTime.Now.AddSeconds(3)); var retries = sub.GetNextNOrLessMessages(2).ToArray(); Assert.AreEqual(0, retries.Length); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void messages_get_timed_out_and_resent_to_clients() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 1, "foo", "bar"); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 1, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildLinkEvent(id2, "streamName", 1, Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamSource", 0)) }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.UtcNow.AddSeconds(3)); Assert.AreEqual(2, envelope1.Replies.Count); var msg1 = (Messages.ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[0]; var msg2 = (Messages.ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[1]; Assert.IsTrue(id1 == msg1.Event.OriginalEvent.EventId || id1 == msg2.Event.OriginalEvent.EventId); Assert.IsTrue(id2 == msg1.Event.OriginalEvent.EventId || id2 == msg2.Event.OriginalEvent.EventId); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void subscription_does_write_checkpoint_for_disconnected_clients_on_time_when_min_is_hit() { int cp = -1; var reader = new FakeCheckpointReader(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => cp = i)) .WithMessageParker(new FakeMessageParker()) .StartFromBeginning() .MinimumToCheckPoint(1) .MaximumToCheckPoint(5)); reader.Load(null); var corrid = Guid.NewGuid(); var eventId1 = Guid.NewGuid(); var eventId2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(eventId1, "type", "streamName", 0), Helper.BuildFakeEvent(eventId2, "type", "streamName", 1), }, 1, false); sub.GetNextNOrLessMessages(2).ToArray(); sub.AcknowledgeMessagesProcessed(corrid, new[] { eventId1, eventId2 }); sub.NotifyClockTick(DateTime.UtcNow); Assert.AreEqual(1, cp); }