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