예제 #1
0
        public void Receive_with_non_empty_queue_waits_time_specified_for_max_num_messages()
        {
            var qUrl = helper.CreateQueue();

            helper.SendMessages(qUrl, count: 3);

            var sw = Stopwatch.StartNew();

            var response = client.ReceiveMessage(new ReceiveMessageRequest
            {
                QueueUrl            = qUrl,
                MaxNumberOfMessages = 4,
                VisibilityTimeout   = 30,
                WaitTimeSeconds     = 2
            });

            sw.Stop();

            SqsTestAssert.FakeEqualRealGreater(3, 1, response.Messages.Count);

            if (SqsTestAssert.IsFakeClient)
            {   // SQS support for long polling doesn't guarantee a specific wait time oddly
                Assert.GreaterOrEqual(sw.ElapsedMilliseconds, 2000);
            }
        }
        public void Can_remove_empty_temp_queues()
        {
            //Clean up
            sqsQueueManager.RemoveEmptyTemporaryQueues(DateTime.UtcNow.AddDays(5).ToUnixTime());

            var nonEmptyTempQueue = sqsQueueManager.CreateQueue(QueueNames.GetTempQueueName());

            sqsQueueManager.SqsClient.SendMessage(new SendMessageRequest(nonEmptyTempQueue.QueueUrl, "Just some text"));
            sqsQueueManager.SqsClient.SendMessage(new SendMessageRequest(nonEmptyTempQueue.QueueUrl, "Just some more text"));

            var emptyTempQueue1         = sqsQueueManager.CreateQueue(QueueNames.GetTempQueueName());
            var emptyTempQueue2         = sqsQueueManager.CreateQueue(QueueNames.GetTempQueueName());
            var emptyTempQueueNotCached = sqsQueueManager.CreateQueue(QueueNames.GetTempQueueName());

            if (!SqsTestAssert.IsFakeClient)
            {   // List queue doesn't return newly created queues for a bit, so if this a "real", we skip this part
                sqsQueueManager.QueueNameMap.TryRemove(emptyTempQueueNotCached.QueueName, out _);
            }

            var countOfQueuesRemoved = sqsQueueManager.RemoveEmptyTemporaryQueues(DateTime.UtcNow.AddDays(5).ToUnixTime());

            try
            {
                SqsTestAssert.FakeEqualRealGreater(3, 2, countOfQueuesRemoved);
            }
            finally
            {
                // Cleanup
                sqsQueueManager.DeleteQueue(nonEmptyTempQueue.QueueName);
                sqsQueueManager.DeleteQueue(emptyTempQueue1.QueueName);
                sqsQueueManager.DeleteQueue(emptyTempQueue2.QueueName);
                sqsQueueManager.DeleteQueue(emptyTempQueueNotCached.QueueName);
            }
        }
예제 #3
0
        public void Receive_is_buffered_when_buffering_enabled_and_disposing_drains()
        {
            var buffer = GetNewMqBuffer();

            buffer.QueueDefinition.SendBufferSize = 1;

            10.Times(i =>
            {
                var sent = buffer.Send(new SendMessageRequest
                {
                    QueueUrl    = buffer.QueueDefinition.QueueUrl,
                    MessageBody = GetNewId()
                });

                Assert.IsTrue(sent);
                Assert.AreEqual(0, buffer.SendBufferCount);
            });

            // Using a real SQS queue results in the Receive being sporadic in terms of actually returning
            // a batch of stuff on a receive call, as it is dependent on the size of the queue, where you land,
            // etc., so in a real SQS scenario, allow a few attempts to the server to actually receive a batch
            // of data, which is the best we can do

            var timesToTry = SqsTestAssert.IsFakeClient
                ? 1
                : 10;

            var attempts = 0;

            Message received = null;

            while (attempts < timesToTry)
            {
                received = buffer.Receive(new ReceiveMessageRequest
                {
                    QueueUrl            = buffer.QueueDefinition.QueueUrl,
                    MaxNumberOfMessages = 10,
                    WaitTimeSeconds     = SqsTestAssert.IsFakeClient
                        ? 0
                        : SqsQueueDefinition.MaxWaitTimeSeconds,
                    VisibilityTimeout = SqsQueueDefinition.MaxVisibilityTimeoutSeconds
                });

                if (received != null && buffer.ReceiveBufferCount > 0)
                {
                    break;
                }

                attempts++;
            }

            Assert.IsNotNull(received);
            SqsTestAssert.FakeEqualRealGreater(9, 0, buffer.ReceiveBufferCount);

            buffer.Dispose();

            Assert.AreEqual(0, buffer.ReceiveBufferCount, "Dispose did not drain");
        }
예제 #4
0
        public void Can_delete_batch_of_messages()
        {
            var newQueueUrl = helper.CreateQueue();

            helper.SendMessages(newQueueUrl, count: 6);

            var received = client.ReceiveMessage(new ReceiveMessageRequest
            {
                QueueUrl            = newQueueUrl,
                MaxNumberOfMessages = 5,
                VisibilityTimeout   = 30,
                WaitTimeSeconds     = 0
            });

            SqsTestAssert.FakeEqualRealGreater(5, 1, received.Messages.Count);

            var response = client.DeleteMessageBatch(new DeleteMessageBatchRequest(
                                                         newQueueUrl,
                                                         received.Messages.Select(m => new DeleteMessageBatchRequestEntry {
                Id            = m.MessageId,
                ReceiptHandle = m.ReceiptHandle
            }).ToList()
                                                         ));

            Assert.AreEqual(received.Messages.Count, response.Successful.Count);

            received = client.ReceiveMessage(new ReceiveMessageRequest
            {
                QueueUrl            = newQueueUrl,
                MaxNumberOfMessages = 5,
                VisibilityTimeout   = 30,
                WaitTimeSeconds     = 0
            });

            SqsTestAssert.FakeEqualRealGreater(1, 0, received.Messages.Count);
        }