public void Poll_client_retries_if_sqs_client_throws_on_receive()
        {
            // Arrange
            var mockSqsClient = new Mock <IAwsSqsClient>();
            var pollster      = new SqsPollClient(mockSqsClient.Object, TaskTimerFactory.Current);
            var call          = 0;
            var threw         = false;

            mockSqsClient.Setup(x => x.Receive("test", AwsSqsDefaults.MAX_MESSAGES, AwsSqsDefaults.DEFAULT_VISIBILITY, It.IsAny <Result <IEnumerable <AwsSqsMessage> > >()))
            .Returns((string queue, int maxMessages, TimeSpan visiblityTimeout, Result <IEnumerable <AwsSqsMessage> > result) => {
                if (call == 0)
                {
                    result.Throw(new Exception());
                    threw = true;
                }
                else
                {
                    result.Return(new AwsSqsMessage[0]);
                }
                call++;
                return(result);
            });

            // Act
            var messages = 0;

            pollster.Listen("test", 100.Milliseconds(), m => messages++);

            // Assert
            Assert.IsTrue(Wait.For(() => call > 1, 10.Seconds()), "never got past the first receive call");
            Assert.IsTrue(threw, "exception was never thrown in receive call");
            Assert.AreEqual(0, messages, "somehow received messages");
            pollster.Dispose();
        }
        public void Poll_client_pulls_from_sqs_and_calls_callback()
        {
            var mockSqsClient = new MockSqsClient();

            mockSqsClient.FillQueue(15);
            var pollster = new SqsPollClient(mockSqsClient, TaskTimerFactory.Current);

            Assert.AreEqual(15, mockSqsClient.Queued.Count, "queue was accessed prematurely");
            var posted = new List <AwsSqsMessage>();

            pollster.Listen("foo", 300.Seconds(), posted.Add);
            Assert.IsTrue(Wait.For(() => mockSqsClient.Queued.Count == 0, 10.Seconds()), "queue did not get depleted in time");
            Assert.IsTrue(
                Wait.For(() => mockSqsClient.ReceiveCalled == 3, 5.Seconds()),
                string.Format("receive called the wrong number of times: {0} != {1}", 3, mockSqsClient.ReceiveCalled)
                );
            Assert.AreEqual(15, mockSqsClient.Delivered.Count, "delivered has the wrong number of messages");
            Assert.AreEqual(
                mockSqsClient.Delivered.Select(x => x.MessageId).ToArray(),
                mockSqsClient.Deleted.Select(x => x.MessageId).ToArray(),
                "delivered and deleted don't match"
                );
            Assert.AreEqual(
                mockSqsClient.Delivered.Select(x => x.MessageId).ToArray(),
                posted.Select(x => x.MessageId).ToArray(),
                "delivered and posted don't match"
                );
        }