Skip to content

Commit

Permalink
Merge pull request #969 from Brett55/master
Browse files Browse the repository at this point in the history
Bug fix for infinite loop when WaitTimeSeconds was set to 0
  • Loading branch information
JackDanger authored Jun 1, 2017
2 parents 8f7f306 + 2a8b5d5 commit ad36dbf
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
6 changes: 6 additions & 0 deletions moto/sqs/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ def receive_messages(self, queue_name, count, wait_seconds_timeout, visibility_t
:param string queue_name: The name of the queue to read from.
:param int count: The maximum amount of messages to retrieve.
:param int visibility_timeout: The number of seconds the message should remain invisible to other queue readers.
:param int wait_seconds_timeout: The duration (in seconds) for which the call waits for a message to arrive in
the queue before returning. If a message is available, the call returns sooner than WaitTimeSeconds
"""
queue = self.get_queue(queue_name)
result = []
Expand All @@ -347,6 +349,10 @@ def receive_messages(self, queue_name, count, wait_seconds_timeout, visibility_t
break

if len(queue.messages) == 0:
# we want to break here, otherwise it will be an infinite loop
if wait_seconds_timeout == 0:
break

import time
time.sleep(0.001)
continue
Expand Down
29 changes: 29 additions & 0 deletions tests/test_sqs/test_sqs.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,35 @@ def test_send_message():
messages[1]['Body'].should.equal(body_two)


@mock_sqs
def test_receive_messages_with_wait_seconds_timeout_of_zero():
"""
test that zero messages is returned with a wait_seconds_timeout of zero,
previously this created an infinite loop and nothing was returned
:return:
"""

sqs = boto3.resource('sqs', region_name='us-east-1')
queue = sqs.create_queue(QueueName="blah")

messages = queue.receive_messages(WaitTimeSeconds=0)
messages.should.equal([])


@mock_sqs
def test_receive_messages_with_wait_seconds_timeout_of_negative_one():
"""
test that zero messages is returned with a wait_seconds_timeout of negative 1
:return:
"""

sqs = boto3.resource('sqs', region_name='us-east-1')
queue = sqs.create_queue(QueueName="blah")

messages = queue.receive_messages(WaitTimeSeconds=-1)
messages.should.equal([])


@mock_sqs_deprecated
def test_send_message_with_xml_characters():
conn = boto.connect_sqs('the_key', 'the_secret')
Expand Down

0 comments on commit ad36dbf

Please sign in to comment.