public void explicit_nak_with_retry_retries_the_message()
 {
     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)
             .StartFromBeginning());
     reader.Load(null);
     var corrid = Guid.NewGuid();
     sub.AddClient(corrid, Guid.NewGuid(), envelope1, 10, "foo", "bar");
     var id1 = Guid.NewGuid();
     sub.HandleReadCompleted(new[]
     {
         Helper.BuildFakeEvent(id1, "type", "streamName", 0),
     }, 1, false);
     envelope1.Replies.Clear();
     sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client.");
     Assert.AreEqual(1, envelope1.Replies.Count);
     Assert.AreEqual(id1, ((ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[0]).Event.Event.EventId);
     Assert.AreEqual(0, parker.ParkedEvents.Count);
 }
        public void explicit_nak_with_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);
            var corrid = Guid.NewGuid();
            sub.AddClient(corrid, Guid.NewGuid(), envelope1, 1, "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),
                Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 2)
            }, 1, false);

            Assert.AreEqual(1, envelope1.Replies.Count);

            sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Park, "a reason from client.");
            Assert.AreEqual(2, envelope1.Replies.Count);

            sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id2 }, NakAction.Park, "a reason from client.");
            Assert.AreEqual(3, envelope1.Replies.Count);
        }
        public void explicit_nak_with_retry_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 => { }))
                    .WithMaxRetriesOf(10)
                    .WithMessageParker(parker)
                    .StartFromBeginning());
            reader.Load(null);
            var corrid = Guid.NewGuid();
            sub.AddClient(corrid, Guid.NewGuid(), envelope1, 10, "foo", "bar");
            var id1 = Guid.NewGuid();
            var ev = Helper.BuildFakeEvent(id1, "type", "streamName", 0);
            sub.HandleReadCompleted(new[]
            {
                ev,
            }, 1, false);

            for (int i = 1; i < 11; i++)
            {
                sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client.");
                Assert.AreEqual(i + 1, envelope1.Replies.Count);
            }

            Assert.That(parker.ParkedEvents, Has.No.Member(ev));

            //This time should be parked
            sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client.");
            Assert.AreEqual(11, envelope1.Replies.Count);
            Assert.That(parker.ParkedEvents, Has.Member(ev));
        }