2020-01-13 09:49:45 -08:00
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2020-04-22 17:36:41 -07:00
# SPDX-License-Identifier: Apache-2.0
2020-01-13 09:49:45 -08:00
"""
2021-10-22 16:15:10 -07:00
Unit tests for queue_wrapper.py functions.
2020-01-13 09:49:45 -08:00
"""
import json
import time
import pytest
from botocore . exceptions import ClientError
import queue_wrapper
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize (
" attributes " ,
[
( { } ) ,
(
{
" MaximumMessageSize " : str ( 4096 ) ,
" ReceiveMessageWaitTimeSeconds " : str ( 10 ) ,
" VisibilityTimeout " : str ( 300 ) ,
}
) ,
] ,
)
2020-04-22 17:36:41 -07:00
def test_create_standard_queue ( make_stubber , make_unique_name , attributes ) :
2020-01-13 09:49:45 -08:00
""" Test that creating a standard queue returns a queue with the expected
2023-10-18 10:35:05 -07:00
form of URL. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
url = " url- " + queue_name
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( queue_name , attributes , url )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
queue = queue_wrapper . create_queue ( queue_name , attributes )
assert queue_name in queue . url
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
queue_wrapper . remove_queue ( queue )
2023-10-18 10:35:05 -07:00
@pytest.mark.parametrize (
" attributes " ,
[
( { } ) ,
( { " MaximumMessageSize " : str ( 1024 ) , " ReceiveMessageWaitTimeSeconds " : str ( 20 ) } ) ,
] ,
)
2020-04-22 17:36:41 -07:00
def test_create_fifo_queue ( make_stubber , make_unique_name , attributes ) :
2020-01-13 09:49:45 -08:00
""" Test that creating a FIFO queue returns a queue with the expected form of URL. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2020-01-13 09:49:45 -08:00
# FIFO queues require a '.fifo' suffix on the queue name.
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " ) + " .fifo "
attributes [ " FifoQueue " ] = str ( True )
url = " url- " + queue_name
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( queue_name , attributes , url )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
queue = queue_wrapper . create_queue ( queue_name , attributes )
assert queue . url . endswith ( queue_name )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
queue_wrapper . remove_queue ( queue )
2020-04-22 17:36:41 -07:00
def test_create_dead_letter_queue ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
"""
2020-03-18 14:47:10 -07:00
Test that creating a queue with an associated dead-letter queue results in
the source queue being listed in the dead-letter queue ' s source queue list.
2020-01-13 09:49:45 -08:00
2020-03-18 14:47:10 -07:00
A dead-letter queue is any queue that is designated as a dead-letter target
2020-01-13 09:49:45 -08:00
by another queue ' s redrive policy.
"""
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
dl_queue_name = make_unique_name ( " queue " ) + " _my_lost_messages "
dl_url = " url- " + dl_queue_name
queue_name = make_unique_name ( " queue " )
url = " url- " + queue_name
2020-04-22 17:36:41 -07:00
2020-04-24 11:19:31 -07:00
# Create a dead-letter queue.
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( dl_queue_name , { } , dl_url )
2020-01-13 09:49:45 -08:00
dl_queue = queue_wrapper . create_queue ( dl_queue_name )
2023-10-18 10:35:05 -07:00
sqs_stubber . stub_get_queue_attributes ( dl_url , " arn: " + dl_queue_name )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
# Create the source queue that sends dead-letter messages to the dead-letter queue.
2020-01-13 09:49:45 -08:00
# The redrive policy must be in JSON format. Note that its attribute names
2020-03-18 14:47:10 -07:00
# start with lowercase letters.
2020-04-22 17:36:41 -07:00
redrive_attributes = {
2023-10-18 10:35:05 -07:00
" RedrivePolicy " : json . dumps (
{
" deadLetterTargetArn " : dl_queue . attributes [ " QueueArn " ] ,
" maxReceiveCount " : str ( 5 ) ,
}
)
2020-01-13 09:49:45 -08:00
}
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( queue_name , redrive_attributes , url )
sqs_stubber . stub_list_dead_letter_source_queues ( dl_url , [ url ] )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
queue = queue_wrapper . create_queue ( queue_name , redrive_attributes )
2020-01-13 09:49:45 -08:00
sources = list ( dl_queue . dead_letter_source_queues . all ( ) )
assert queue in sources
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
queue_wrapper . remove_queue ( queue )
queue_wrapper . remove_queue ( dl_queue )
def test_create_queue_bad_name ( ) :
""" Test that creating a queue with invalid characters in the name raises
an exception. """
with pytest . raises ( ClientError ) :
queue_wrapper . create_queue ( " Queue names cannot contain spaces! " )
2020-04-22 17:36:41 -07:00
def test_create_standard_queue_with_fifo_extension ( make_unique_name ) :
2020-01-13 09:49:45 -08:00
""" Test that creating a standard queue with the ' .fifo ' extension
raises an exception. """
with pytest . raises ( ClientError ) :
2023-10-18 10:35:05 -07:00
queue_wrapper . create_queue ( make_unique_name ( " queue " ) + " .fifo " )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
def test_create_fifo_queue_without_extension ( make_unique_name ) :
2020-01-13 09:49:45 -08:00
""" Test that creating a FIFO queue without the ' .fifo ' extension
raises an exception. """
with pytest . raises ( ClientError ) :
queue_wrapper . create_queue (
2023-10-18 10:35:05 -07:00
make_unique_name ( " queue " ) , attributes = { " FifoQueue " : str ( True ) }
)
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
def test_get_queue ( make_stubber , make_unique_name ) :
2020-03-18 14:47:10 -07:00
""" Test that creating a queue and then getting it by name returns the same queue. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
url = " url- " + queue_name
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( queue_name , { } , url )
sqs_stubber . stub_get_queue_url ( queue_name , url )
created = queue_wrapper . create_queue ( queue_name )
gotten = queue_wrapper . get_queue ( queue_name )
2020-01-13 09:49:45 -08:00
assert created == gotten
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
queue_wrapper . remove_queue ( created )
2020-04-22 17:36:41 -07:00
def test_get_queue_nonexistent ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
""" Test that getting a nonexistent queue raises an exception. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
url = " url- " + queue_name
2020-01-13 09:49:45 -08:00
2020-09-15 18:20:16 -07:00
sqs_stubber . stub_get_queue_url (
2023-10-18 10:35:05 -07:00
queue_name , url , error_code = " AWS.SimpleQueueService.NonExistentQueue "
)
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
with pytest . raises ( ClientError ) as exc_info :
queue_wrapper . get_queue ( queue_name )
2023-10-18 10:35:05 -07:00
assert (
exc_info . value . response [ " Error " ] [ " Code " ]
== " AWS.SimpleQueueService.NonExistentQueue "
)
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
def test_get_queues ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
"""
Test that creating some queues, then retrieving all the queues, returns a list
that contains at least all of the newly created queues.
"""
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
2020-04-22 17:36:41 -07:00
2020-01-13 09:49:45 -08:00
created_queues = [ ]
for ind in range ( 1 , 4 ) :
2020-04-22 17:36:41 -07:00
name = queue_name + str ( ind )
2023-10-18 10:35:05 -07:00
sqs_stubber . stub_create_queue ( name , { } , " url- " + name )
2020-01-13 09:49:45 -08:00
created_queues . append ( queue_wrapper . create_queue ( name ) )
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_list_queues ( [ q . url for q in created_queues ] )
2020-01-13 09:49:45 -08:00
# When running against the real AWS service, SQS may not return new queues right
# away. Use a simple exponential backoff to retry until it succeeds.
retries = 0
intersect_queues = [ ]
while not intersect_queues and retries < = 5 :
time . sleep ( min ( retries * 2 , 32 ) )
gotten_queues = queue_wrapper . get_queues ( )
intersect_queues = [ cq for cq in created_queues if cq in gotten_queues ]
retries + = 1
assert created_queues == intersect_queues
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
for queue in created_queues :
queue_wrapper . remove_queue ( queue )
2020-04-22 17:36:41 -07:00
def test_get_queues_prefix ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
"""
Test that creating some queues with a unique prefix, then retrieving a list of
queues that have that unique prefix, returns a list that contains exactly the
newly created queues.
"""
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
2020-04-22 17:36:41 -07:00
2020-01-13 09:49:45 -08:00
created_queues = [ ]
for ind in range ( 1 , 4 ) :
2020-04-22 17:36:41 -07:00
name = queue_name + str ( ind )
2023-10-18 10:35:05 -07:00
sqs_stubber . stub_create_queue ( name , { } , " url- " + name )
2020-01-13 09:49:45 -08:00
created_queues . append ( queue_wrapper . create_queue ( name ) )
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_list_queues ( [ q . url for q in created_queues ] , queue_name )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
gotten_queues = queue_wrapper . get_queues ( queue_name )
2020-01-13 09:49:45 -08:00
assert created_queues == gotten_queues
2020-04-22 17:36:41 -07:00
if not sqs_stubber . use_stubs :
2020-01-13 09:49:45 -08:00
for queue in created_queues :
queue_wrapper . remove_queue ( queue )
2020-04-22 17:36:41 -07:00
def test_get_queues_expect_none ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
""" Test that getting queues with a random prefix returns an empty list
2023-10-18 10:35:05 -07:00
and doesn ' t raise an exception. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_list_queues ( [ ] , queue_name )
2020-01-13 09:49:45 -08:00
2020-04-22 17:36:41 -07:00
queues = queue_wrapper . get_queues ( queue_name )
2020-01-13 09:49:45 -08:00
assert not queues
2020-04-22 17:36:41 -07:00
def test_remove_queue ( make_stubber , make_unique_name ) :
2020-01-13 09:49:45 -08:00
""" Test that creating a queue, deleting it, then trying to get it raises
2023-10-18 10:35:05 -07:00
an exception because the queue no longer exists. """
2020-04-22 17:36:41 -07:00
sqs_stubber = make_stubber ( queue_wrapper . sqs . meta . client )
2023-10-18 10:35:05 -07:00
queue_name = make_unique_name ( " queue " )
url = " url- " + queue_name
2020-04-22 17:36:41 -07:00
sqs_stubber . stub_create_queue ( queue_name , { } , url )
sqs_stubber . stub_delete_queue ( url )
2020-09-15 18:20:16 -07:00
sqs_stubber . stub_get_queue_url (
2023-10-18 10:35:05 -07:00
queue_name , url , error_code = " AWS.SimpleQueueService.NonExistentQueue "
)
2020-04-22 17:36:41 -07:00
queue = queue_wrapper . create_queue ( queue_name )
2020-01-13 09:49:45 -08:00
queue_wrapper . remove_queue ( queue )
2020-04-22 17:36:41 -07:00
with pytest . raises ( ClientError ) as exc_info :
queue_wrapper . get_queue ( queue_name )
2023-10-18 10:35:05 -07:00
assert (
exc_info . value . response [ " Error " ] [ " Code " ]
== " AWS.SimpleQueueService.NonExistentQueue "
)