2017-03-19 15:03:22 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2014-08-27 15:17:06 +00:00
|
|
|
from __future__ import unicode_literals
|
2017-02-12 00:41:04 +00:00
|
|
|
|
2013-02-24 03:26:46 +00:00
|
|
|
import boto
|
2015-08-02 13:45:40 +00:00
|
|
|
import boto3
|
2016-06-01 14:39:06 +00:00
|
|
|
import botocore.exceptions
|
2017-10-10 19:51:48 +00:00
|
|
|
from botocore.exceptions import ClientError
|
2013-02-24 03:26:46 +00:00
|
|
|
from boto.exception import SQSError
|
2015-05-30 03:26:43 +00:00
|
|
|
from boto.sqs.message import RawMessage, Message
|
2014-06-20 21:29:40 +00:00
|
|
|
|
2017-10-29 18:59:40 +00:00
|
|
|
from freezegun import freeze_time
|
2017-05-11 14:06:42 +00:00
|
|
|
import base64
|
2017-10-29 18:59:40 +00:00
|
|
|
import json
|
2013-08-03 21:21:25 +00:00
|
|
|
import sure # noqa
|
2014-06-20 20:00:36 +00:00
|
|
|
import time
|
2017-10-29 18:59:40 +00:00
|
|
|
import uuid
|
2013-02-24 03:26:46 +00:00
|
|
|
|
2017-03-05 15:09:19 +00:00
|
|
|
from moto import settings, mock_sqs, mock_sqs_deprecated
|
2014-09-28 19:59:14 +00:00
|
|
|
from tests.helpers import requires_boto_gte
|
2017-02-12 00:41:04 +00:00
|
|
|
import tests.backport_assert_raises # noqa
|
|
|
|
from nose.tools import assert_raises
|
|
|
|
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2017-09-22 19:08:20 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_create_fifo_queue_fail():
|
|
|
|
sqs = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
|
|
|
|
try:
|
|
|
|
sqs.create_queue(
|
|
|
|
QueueName='test-queue',
|
|
|
|
Attributes={
|
|
|
|
'FifoQueue': 'true',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
except botocore.exceptions.ClientError as err:
|
|
|
|
err.response['Error']['Code'].should.equal('InvalidParameterValue')
|
|
|
|
else:
|
|
|
|
raise RuntimeError('Should of raised InvalidParameterValue Exception')
|
|
|
|
|
2017-10-10 19:51:48 +00:00
|
|
|
|
2017-09-22 19:08:20 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_create_fifo_queue():
|
|
|
|
sqs = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-queue.fifo',
|
|
|
|
Attributes={
|
|
|
|
'FifoQueue': 'true',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
queue_url = resp['QueueUrl']
|
|
|
|
|
|
|
|
response = sqs.get_queue_attributes(QueueUrl=queue_url)
|
|
|
|
response['Attributes'].should.contain('FifoQueue')
|
|
|
|
response['Attributes']['FifoQueue'].should.equal('true')
|
|
|
|
|
|
|
|
|
2013-02-24 03:26:46 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_create_queue():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-10-10 19:51:48 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
new_queue = sqs.create_queue(QueueName='test-queue')
|
|
|
|
new_queue.should_not.be.none
|
|
|
|
new_queue.should.have.property('url').should.contain('test-queue')
|
|
|
|
|
|
|
|
queue = sqs.get_queue_by_name(QueueName='test-queue')
|
|
|
|
queue.attributes.get('QueueArn').should_not.be.none
|
|
|
|
queue.attributes.get('QueueArn').split(':')[-1].should.equal('test-queue')
|
|
|
|
queue.attributes.get('QueueArn').split(':')[3].should.equal('us-east-1')
|
|
|
|
queue.attributes.get('VisibilityTimeout').should_not.be.none
|
|
|
|
queue.attributes.get('VisibilityTimeout').should.equal('30')
|
2013-02-24 03:26:46 +00:00
|
|
|
|
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
@mock_sqs
|
2017-10-10 19:51:48 +00:00
|
|
|
def test_get_nonexistent_queue():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-10-10 19:51:48 +00:00
|
|
|
with assert_raises(ClientError) as err:
|
|
|
|
sqs.get_queue_by_name(QueueName='nonexisting-queue')
|
|
|
|
ex = err.exception
|
|
|
|
ex.operation_name.should.equal('GetQueueUrl')
|
|
|
|
ex.response['Error']['Code'].should.equal('QueueDoesNotExist')
|
|
|
|
|
|
|
|
with assert_raises(ClientError) as err:
|
|
|
|
sqs.Queue('http://whatever-incorrect-queue-address').load()
|
|
|
|
ex = err.exception
|
|
|
|
ex.operation_name.should.equal('GetQueueAttributes')
|
|
|
|
ex.response['Error']['Code'].should.equal('QueueDoesNotExist')
|
2013-02-24 03:26:46 +00:00
|
|
|
|
2017-09-22 19:08:20 +00:00
|
|
|
|
2017-06-29 13:24:09 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_message_send_without_attributes():
|
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
|
|
|
queue = sqs.create_queue(QueueName="blah")
|
|
|
|
msg = queue.send_message(
|
|
|
|
MessageBody="derp"
|
|
|
|
)
|
|
|
|
msg.get('MD5OfMessageBody').should.equal(
|
|
|
|
'58fd9edd83341c29f1aebba81c31e257')
|
|
|
|
msg.shouldnt.have.key('MD5OfMessageAttributes')
|
|
|
|
msg.get('MessageId').should_not.contain(' \n')
|
|
|
|
|
|
|
|
messages = queue.receive_messages()
|
|
|
|
messages.should.have.length_of(1)
|
2013-02-24 03:26:46 +00:00
|
|
|
|
2017-09-22 19:08:20 +00:00
|
|
|
|
2014-11-16 22:57:46 +00:00
|
|
|
@mock_sqs
|
2017-06-29 13:24:09 +00:00
|
|
|
def test_message_send_with_attributes():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-02-12 00:41:04 +00:00
|
|
|
queue = sqs.create_queue(QueueName="blah")
|
2017-04-27 06:40:28 +00:00
|
|
|
msg = queue.send_message(
|
|
|
|
MessageBody="derp",
|
|
|
|
MessageAttributes={
|
|
|
|
'timestamp': {
|
|
|
|
'StringValue': '1493147359900',
|
|
|
|
'DataType': 'Number',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
msg.get('MD5OfMessageBody').should.equal(
|
|
|
|
'58fd9edd83341c29f1aebba81c31e257')
|
|
|
|
msg.get('MD5OfMessageAttributes').should.equal(
|
|
|
|
'235c5c510d26fb653d073faed50ae77c')
|
|
|
|
msg.get('MessageId').should_not.contain(' \n')
|
|
|
|
|
|
|
|
messages = queue.receive_messages()
|
|
|
|
messages.should.have.length_of(1)
|
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
|
2017-04-27 06:40:28 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_message_with_complex_attributes():
|
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
|
|
|
queue = sqs.create_queue(QueueName="blah")
|
|
|
|
msg = queue.send_message(
|
|
|
|
MessageBody="derp",
|
|
|
|
MessageAttributes={
|
|
|
|
'ccc': {'StringValue': 'testjunk', 'DataType': 'String'},
|
|
|
|
'aaa': {'BinaryValue': b'\x02\x03\x04', 'DataType': 'Binary'},
|
|
|
|
'zzz': {'DataType': 'Number', 'StringValue': '0230.01'},
|
|
|
|
'öther_encodings': {'DataType': 'String', 'StringValue': 'T\xFCst'}
|
|
|
|
}
|
|
|
|
)
|
2017-02-24 02:37:43 +00:00
|
|
|
msg.get('MD5OfMessageBody').should.equal(
|
|
|
|
'58fd9edd83341c29f1aebba81c31e257')
|
2017-04-27 06:40:28 +00:00
|
|
|
msg.get('MD5OfMessageAttributes').should.equal(
|
|
|
|
'8ae21a7957029ef04146b42aeaa18a22')
|
2017-02-12 00:41:04 +00:00
|
|
|
msg.get('MessageId').should_not.contain(' \n')
|
|
|
|
|
|
|
|
messages = queue.receive_messages()
|
|
|
|
messages.should.have.length_of(1)
|
|
|
|
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2017-03-19 15:03:22 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_send_message_with_unicode_characters():
|
|
|
|
body_one = 'Héllo!😀'
|
|
|
|
|
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
|
|
|
queue = sqs.create_queue(QueueName="blah")
|
|
|
|
msg = queue.send_message(MessageBody=body_one)
|
|
|
|
|
|
|
|
messages = queue.receive_messages()
|
|
|
|
message_body = messages[0].body
|
|
|
|
|
|
|
|
message_body.should.equal(body_one)
|
|
|
|
|
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_set_queue_attributes():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-02-12 00:41:04 +00:00
|
|
|
queue = sqs.create_queue(QueueName="blah")
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
queue.attributes['VisibilityTimeout'].should.equal("30")
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
queue.set_attributes(Attributes={"VisibilityTimeout": "45"})
|
|
|
|
queue.attributes['VisibilityTimeout'].should.equal("45")
|
2015-09-19 13:18:16 +00:00
|
|
|
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2013-04-19 03:07:24 +00:00
|
|
|
@mock_sqs
|
2017-02-12 00:41:04 +00:00
|
|
|
def test_create_queues_in_multiple_region():
|
|
|
|
west1_conn = boto3.client('sqs', region_name='us-west-1')
|
|
|
|
west1_conn.create_queue(QueueName="blah")
|
|
|
|
|
|
|
|
west2_conn = boto3.client('sqs', region_name='us-west-2')
|
|
|
|
west2_conn.create_queue(QueueName="test-queue")
|
2013-04-19 03:07:24 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
list(west1_conn.list_queues()['QueueUrls']).should.have.length_of(1)
|
|
|
|
list(west2_conn.list_queues()['QueueUrls']).should.have.length_of(1)
|
2013-04-19 03:07:24 +00:00
|
|
|
|
2017-03-05 15:09:19 +00:00
|
|
|
if settings.TEST_SERVER_MODE:
|
2017-03-13 01:04:19 +00:00
|
|
|
base_url = 'http://localhost:5000'
|
2017-03-05 15:09:19 +00:00
|
|
|
else:
|
|
|
|
base_url = 'https://us-west-1.queue.amazonaws.com'
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
west1_conn.list_queues()['QueueUrls'][0].should.equal(
|
2017-03-05 15:09:19 +00:00
|
|
|
'{base_url}/123456789012/blah'.format(base_url=base_url))
|
2013-04-24 07:41:45 +00:00
|
|
|
|
2013-04-19 03:07:24 +00:00
|
|
|
|
2014-02-20 19:00:08 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_get_queue_with_prefix():
|
2017-02-12 00:41:04 +00:00
|
|
|
conn = boto3.client("sqs", region_name='us-west-1')
|
|
|
|
conn.create_queue(QueueName="prefixa-queue")
|
|
|
|
conn.create_queue(QueueName="prefixb-queue")
|
|
|
|
conn.create_queue(QueueName="test-queue")
|
2014-02-20 19:00:08 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
conn.list_queues()['QueueUrls'].should.have.length_of(3)
|
2014-02-20 19:00:08 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
queue = conn.list_queues(QueueNamePrefix="test-")['QueueUrls']
|
2014-02-20 19:00:08 +00:00
|
|
|
queue.should.have.length_of(1)
|
2017-03-05 15:09:19 +00:00
|
|
|
|
|
|
|
if settings.TEST_SERVER_MODE:
|
2017-03-13 01:04:19 +00:00
|
|
|
base_url = 'http://localhost:5000'
|
2017-03-05 15:09:19 +00:00
|
|
|
else:
|
|
|
|
base_url = 'https://us-west-1.queue.amazonaws.com'
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
queue[0].should.equal(
|
2017-03-05 15:09:19 +00:00
|
|
|
"{base_url}/123456789012/test-queue".format(base_url=base_url))
|
2014-02-20 19:00:08 +00:00
|
|
|
|
|
|
|
|
2013-02-24 03:26:46 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_delete_queue():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-02-12 00:50:26 +00:00
|
|
|
conn = boto3.client("sqs", region_name='us-east-1')
|
2017-02-24 02:37:43 +00:00
|
|
|
conn.create_queue(QueueName="test-queue",
|
2017-05-11 16:35:24 +00:00
|
|
|
Attributes={"VisibilityTimeout": "3"})
|
2017-02-12 00:41:04 +00:00
|
|
|
queue = sqs.Queue('test-queue')
|
2013-02-24 03:26:46 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
conn.list_queues()['QueueUrls'].should.have.length_of(1)
|
2013-02-24 03:26:46 +00:00
|
|
|
|
|
|
|
queue.delete()
|
2017-02-12 00:41:04 +00:00
|
|
|
conn.list_queues().get('QueueUrls').should.equal(None)
|
2013-02-24 03:26:46 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
with assert_raises(botocore.exceptions.ClientError):
|
|
|
|
queue.delete()
|
2013-02-24 03:35:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_set_queue_attribute():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-02-12 00:50:26 +00:00
|
|
|
conn = boto3.client("sqs", region_name='us-east-1')
|
2017-02-24 02:37:43 +00:00
|
|
|
conn.create_queue(QueueName="test-queue",
|
2017-05-11 16:35:24 +00:00
|
|
|
Attributes={"VisibilityTimeout": '3'})
|
2013-02-24 03:35:05 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
queue = sqs.Queue("test-queue")
|
2017-05-11 16:35:24 +00:00
|
|
|
queue.attributes['VisibilityTimeout'].should.equal('3')
|
2013-02-24 03:35:05 +00:00
|
|
|
|
2017-02-12 00:41:04 +00:00
|
|
|
queue.set_attributes(Attributes={"VisibilityTimeout": '45'})
|
|
|
|
queue = sqs.Queue("test-queue")
|
|
|
|
queue.attributes['VisibilityTimeout'].should.equal('45')
|
2013-02-24 16:06:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
2017-06-29 13:24:09 +00:00
|
|
|
def test_send_receive_message_without_attributes():
|
2017-02-16 03:35:45 +00:00
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
2017-02-12 00:50:26 +00:00
|
|
|
conn = boto3.client("sqs", region_name='us-east-1')
|
2017-02-12 00:41:04 +00:00
|
|
|
conn.create_queue(QueueName="test-queue")
|
|
|
|
queue = sqs.Queue("test-queue")
|
2014-06-23 18:53:46 +00:00
|
|
|
|
|
|
|
body_one = 'this is a test message'
|
|
|
|
body_two = 'this is another test message'
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2017-06-29 13:24:09 +00:00
|
|
|
queue.send_message(MessageBody=body_one)
|
|
|
|
queue.send_message(MessageBody=body_two)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
messages = conn.receive_message(
|
|
|
|
QueueUrl=queue.url, MaxNumberOfMessages=2)['Messages']
|
2014-06-23 18:53:46 +00:00
|
|
|
|
2017-06-29 13:24:09 +00:00
|
|
|
message1 = messages[0]
|
|
|
|
message2 = messages[1]
|
|
|
|
|
|
|
|
message1['Body'].should.equal(body_one)
|
|
|
|
message2['Body'].should.equal(body_two)
|
|
|
|
|
|
|
|
message1.shouldnt.have.key('MD5OfMessageAttributes')
|
|
|
|
message2.shouldnt.have.key('MD5OfMessageAttributes')
|
|
|
|
|
2017-09-22 19:08:20 +00:00
|
|
|
|
2017-06-29 13:24:09 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_send_receive_message_with_attributes():
|
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
|
|
|
conn = boto3.client("sqs", region_name='us-east-1')
|
|
|
|
conn.create_queue(QueueName="test-queue")
|
|
|
|
queue = sqs.Queue("test-queue")
|
|
|
|
|
|
|
|
body_one = 'this is a test message'
|
|
|
|
body_two = 'this is another test message'
|
|
|
|
|
|
|
|
queue.send_message(
|
|
|
|
MessageBody=body_one,
|
|
|
|
MessageAttributes={
|
|
|
|
'timestamp': {
|
|
|
|
'StringValue': '1493147359900',
|
|
|
|
'DataType': 'Number',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
queue.send_message(
|
|
|
|
MessageBody=body_two,
|
|
|
|
MessageAttributes={
|
|
|
|
'timestamp': {
|
|
|
|
'StringValue': '1493147359901',
|
|
|
|
'DataType': 'Number',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
messages = conn.receive_message(
|
|
|
|
QueueUrl=queue.url, MaxNumberOfMessages=2)['Messages']
|
|
|
|
|
|
|
|
message1 = messages[0]
|
|
|
|
message2 = messages[1]
|
|
|
|
|
|
|
|
message1.get('Body').should.equal(body_one)
|
|
|
|
message2.get('Body').should.equal(body_two)
|
|
|
|
|
|
|
|
message1.get('MD5OfMessageAttributes').should.equal('235c5c510d26fb653d073faed50ae77c')
|
|
|
|
message2.get('MD5OfMessageAttributes').should.equal('994258b45346a2cc3f9cbb611aa7af30')
|
2014-06-20 20:00:36 +00:00
|
|
|
|
|
|
|
|
2017-07-03 14:17:01 +00:00
|
|
|
@mock_sqs
|
|
|
|
def test_send_receive_message_timestamps():
|
|
|
|
sqs = boto3.resource('sqs', region_name='us-east-1')
|
|
|
|
conn = boto3.client("sqs", region_name='us-east-1')
|
|
|
|
conn.create_queue(QueueName="test-queue")
|
|
|
|
queue = sqs.Queue("test-queue")
|
|
|
|
|
|
|
|
queue.send_message(MessageBody="derp")
|
|
|
|
messages = conn.receive_message(
|
|
|
|
QueueUrl=queue.url, MaxNumberOfMessages=1)['Messages']
|
|
|
|
|
|
|
|
message = messages[0]
|
|
|
|
sent_timestamp = message.get('Attributes').get('SentTimestamp')
|
|
|
|
approximate_first_receive_timestamp = message.get('Attributes').get('ApproximateFirstReceiveTimestamp')
|
|
|
|
|
|
|
|
int.when.called_with(sent_timestamp).shouldnt.throw(ValueError)
|
|
|
|
int.when.called_with(approximate_first_receive_timestamp).shouldnt.throw(ValueError)
|
|
|
|
|
|
|
|
|
2017-06-01 15:51:33 +00:00
|
|
|
@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([])
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-10-22 20:03:42 +00:00
|
|
|
def test_send_message_with_xml_characters():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-10-22 20:03:42 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
body_one = '< & >'
|
|
|
|
|
|
|
|
queue.write(queue.new_message(body_one))
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
|
|
|
|
messages[0].get_body().should.equal(body_one)
|
|
|
|
|
|
|
|
|
2014-09-28 19:59:14 +00:00
|
|
|
@requires_boto_gte("2.28")
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-09-28 19:59:14 +00:00
|
|
|
def test_send_message_with_attributes():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-09-28 19:59:14 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2014-11-16 22:57:46 +00:00
|
|
|
|
2014-09-28 19:59:14 +00:00
|
|
|
body = 'this is a test message'
|
|
|
|
message = queue.new_message(body)
|
2017-05-11 16:28:19 +00:00
|
|
|
BASE64_BINARY = base64.b64encode(b'binary value').decode('utf-8')
|
2014-09-28 19:59:14 +00:00
|
|
|
message_attributes = {
|
2014-11-16 22:57:46 +00:00
|
|
|
'test.attribute_name': {'data_type': 'String', 'string_value': 'attribute value'},
|
2017-05-11 16:28:19 +00:00
|
|
|
'test.binary_attribute': {'data_type': 'Binary', 'binary_value': BASE64_BINARY},
|
2014-11-16 22:57:46 +00:00
|
|
|
'test.number_attribute': {'data_type': 'Number', 'string_value': 'string value'}
|
2014-09-28 19:59:14 +00:00
|
|
|
}
|
|
|
|
message.message_attributes = message_attributes
|
|
|
|
|
|
|
|
queue.write(message)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue)
|
|
|
|
|
|
|
|
messages[0].get_body().should.equal(body)
|
|
|
|
|
|
|
|
for name, value in message_attributes.items():
|
|
|
|
dict(messages[0].message_attributes[name]).should.equal(value)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-20 20:00:36 +00:00
|
|
|
def test_send_message_with_delay():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2014-06-20 20:00:36 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
body_one = 'this is a test message'
|
|
|
|
body_two = 'this is another test message'
|
|
|
|
|
2017-05-11 16:35:24 +00:00
|
|
|
queue.write(queue.new_message(body_one), delay_seconds=3)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.write(queue.new_message(body_two))
|
2014-06-20 20:00:36 +00:00
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=2)
|
|
|
|
assert len(messages) == 1
|
|
|
|
message = messages[0]
|
2014-06-23 18:53:46 +00:00
|
|
|
assert message.get_body().should.equal(body_two)
|
2014-06-20 20:00:36 +00:00
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2015-11-10 16:24:55 +00:00
|
|
|
def test_send_large_message_fails():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2015-11-10 16:24:55 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
2015-11-10 16:39:00 +00:00
|
|
|
body_one = 'test message' * 200000
|
2015-11-10 16:24:55 +00:00
|
|
|
huge_message = queue.new_message(body_one)
|
|
|
|
|
|
|
|
queue.write.when.called_with(huge_message).should.throw(SQSError)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-22 18:34:32 +00:00
|
|
|
def test_message_becomes_inflight_when_received():
|
2014-06-20 20:00:36 +00:00
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=2)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2014-06-20 20:00:36 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
body_one = 'this is a test message'
|
|
|
|
queue.write(queue.new_message(body_one))
|
2014-06-20 20:00:36 +00:00
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
# Wait
|
|
|
|
time.sleep(3)
|
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2016-05-31 21:58:37 +00:00
|
|
|
def test_receive_message_with_explicit_visibility_timeout():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2016-05-31 21:58:37 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
body_one = 'this is another test message'
|
|
|
|
queue.write(queue.new_message(body_one))
|
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
2017-02-24 02:37:43 +00:00
|
|
|
messages = conn.receive_message(
|
|
|
|
queue, number_messages=1, visibility_timeout=0)
|
2016-05-31 21:58:37 +00:00
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
# Message should remain visible
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-20 20:00:36 +00:00
|
|
|
def test_change_message_visibility():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=2)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
body_one = 'this is another test message'
|
|
|
|
queue.write(queue.new_message(body_one))
|
2014-06-20 20:00:36 +00:00
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
messages[0].change_visibility(2)
|
|
|
|
|
|
|
|
# Wait
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
# Message is not visible
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
# Message now becomes visible
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
messages[0].delete()
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-20 20:00:36 +00:00
|
|
|
def test_message_attributes():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=2)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
body_one = 'this is another test message'
|
|
|
|
queue.write(queue.new_message(body_one))
|
2014-06-20 20:00:36 +00:00
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
message_attributes = messages[0].attributes
|
|
|
|
|
|
|
|
assert message_attributes.get('ApproximateFirstReceiveTimestamp')
|
|
|
|
assert int(message_attributes.get('ApproximateReceiveCount')) == 1
|
|
|
|
assert message_attributes.get('SentTimestamp')
|
|
|
|
assert message_attributes.get('SenderId')
|
2013-02-24 16:06:42 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-03-23 13:44:53 +00:00
|
|
|
def test_read_message_from_queue():
|
|
|
|
conn = boto.connect_sqs()
|
|
|
|
queue = conn.create_queue('testqueue')
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
body = 'foo bar baz'
|
|
|
|
queue.write(queue.new_message(body))
|
2013-03-23 13:44:53 +00:00
|
|
|
message = queue.read(1)
|
2014-06-23 18:53:46 +00:00
|
|
|
message.get_body().should.equal(body)
|
2013-03-23 13:44:53 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-02-24 16:06:42 +00:00
|
|
|
def test_queue_length():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.write(queue.new_message('this is a test message'))
|
|
|
|
queue.write(queue.new_message('this is another test message'))
|
2013-02-24 16:06:42 +00:00
|
|
|
queue.count().should.equal(2)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-02-24 16:06:42 +00:00
|
|
|
def test_delete_message():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.write(queue.new_message('this is a test message'))
|
|
|
|
queue.write(queue.new_message('this is another test message'))
|
2014-06-20 20:00:36 +00:00
|
|
|
queue.count().should.equal(2)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
2014-06-20 20:00:36 +00:00
|
|
|
assert len(messages) == 1
|
2013-02-24 16:06:42 +00:00
|
|
|
messages[0].delete()
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
2014-06-20 20:00:36 +00:00
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
assert len(messages) == 1
|
|
|
|
messages[0].delete()
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-02-24 16:06:42 +00:00
|
|
|
def test_send_batch_operation():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
2013-03-23 13:44:53 +00:00
|
|
|
# See https://github.com/boto/boto/issues/831
|
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
|
|
|
queue.write_batch([
|
2013-02-24 16:06:42 +00:00
|
|
|
("my_first_message", 'test message 1', 0),
|
|
|
|
("my_second_message", 'test message 2', 0),
|
|
|
|
("my_third_message", 'test message 3', 0),
|
|
|
|
])
|
|
|
|
|
|
|
|
messages = queue.get_messages(3)
|
|
|
|
messages[0].get_body().should.equal("test message 1")
|
|
|
|
|
|
|
|
# Test that pulling more messages doesn't break anything
|
|
|
|
messages = queue.get_messages(2)
|
|
|
|
|
|
|
|
|
2014-09-28 19:59:14 +00:00
|
|
|
@requires_boto_gte("2.28")
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-09-28 19:59:14 +00:00
|
|
|
def test_send_batch_operation_with_message_attributes():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2014-09-28 19:59:14 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
message_tuple = ("my_first_message", 'test message 1', 0, {
|
|
|
|
'name1': {'data_type': 'String', 'string_value': 'foo'}})
|
2014-09-28 19:59:14 +00:00
|
|
|
queue.write_batch([message_tuple])
|
|
|
|
|
|
|
|
messages = queue.get_messages()
|
|
|
|
messages[0].get_body().should.equal("test message 1")
|
|
|
|
|
|
|
|
for name, value in message_tuple[3].items():
|
|
|
|
dict(messages[0].message_attributes[name]).should.equal(value)
|
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-02-24 16:06:42 +00:00
|
|
|
def test_delete_batch_operation():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
2017-05-11 16:35:24 +00:00
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=3)
|
2013-02-24 16:06:42 +00:00
|
|
|
|
|
|
|
conn.send_message_batch(queue, [
|
|
|
|
("my_first_message", 'test message 1', 0),
|
|
|
|
("my_second_message", 'test message 2', 0),
|
|
|
|
("my_third_message", 'test message 3', 0),
|
|
|
|
])
|
|
|
|
|
|
|
|
messages = queue.get_messages(2)
|
|
|
|
queue.delete_message_batch(messages)
|
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
2013-02-28 02:56:54 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2013-04-24 06:53:30 +00:00
|
|
|
def test_queue_attributes():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
|
|
|
|
queue_name = 'test-queue'
|
2017-05-11 16:35:24 +00:00
|
|
|
visibility_timeout = 3
|
2013-04-24 06:53:30 +00:00
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
queue = conn.create_queue(
|
|
|
|
queue_name, visibility_timeout=visibility_timeout)
|
2013-04-24 06:53:30 +00:00
|
|
|
|
|
|
|
attributes = queue.get_attributes()
|
|
|
|
|
|
|
|
attributes['QueueArn'].should.look_like(
|
2016-07-19 12:20:33 +00:00
|
|
|
'arn:aws:sqs:us-east-1:123456789012:%s' % queue_name)
|
2013-04-24 06:53:30 +00:00
|
|
|
|
|
|
|
attributes['VisibilityTimeout'].should.look_like(str(visibility_timeout))
|
|
|
|
|
|
|
|
attribute_names = queue.get_attributes().keys()
|
|
|
|
attribute_names.should.contain('ApproximateNumberOfMessagesNotVisible')
|
|
|
|
attribute_names.should.contain('MessageRetentionPeriod')
|
|
|
|
attribute_names.should.contain('ApproximateNumberOfMessagesDelayed')
|
|
|
|
attribute_names.should.contain('MaximumMessageSize')
|
|
|
|
attribute_names.should.contain('CreatedTimestamp')
|
|
|
|
attribute_names.should.contain('ApproximateNumberOfMessages')
|
|
|
|
attribute_names.should.contain('ReceiveMessageWaitTimeSeconds')
|
|
|
|
attribute_names.should.contain('DelaySeconds')
|
|
|
|
attribute_names.should.contain('VisibilityTimeout')
|
|
|
|
attribute_names.should.contain('LastModifiedTimestamp')
|
|
|
|
attribute_names.should.contain('QueueArn')
|
2014-06-20 21:29:40 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-20 21:29:40 +00:00
|
|
|
def test_change_message_visibility_on_invalid_receipt():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=1)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2014-06-20 21:29:40 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.write(queue.new_message('this is another test message'))
|
2014-06-20 21:29:40 +00:00
|
|
|
queue.count().should.equal(1)
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
original_message = messages[0]
|
|
|
|
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
original_message.change_visibility.when.called_with(
|
|
|
|
100).should.throw(SQSError)
|
2014-06-20 21:29:40 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2014-06-20 21:29:40 +00:00
|
|
|
def test_change_message_visibility_on_visible_message():
|
|
|
|
conn = boto.connect_sqs('the_key', 'the_secret')
|
|
|
|
queue = conn.create_queue("test-queue", visibility_timeout=1)
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.set_message_class(RawMessage)
|
2014-06-20 21:29:40 +00:00
|
|
|
|
2014-06-23 18:53:46 +00:00
|
|
|
queue.write(queue.new_message('this is another test message'))
|
2014-06-20 21:29:40 +00:00
|
|
|
queue.count().should.equal(1)
|
|
|
|
messages = conn.receive_message(queue, number_messages=1)
|
|
|
|
|
|
|
|
assert len(messages) == 1
|
|
|
|
|
|
|
|
original_message = messages[0]
|
|
|
|
|
|
|
|
queue.count().should.equal(0)
|
|
|
|
|
|
|
|
time.sleep(2)
|
|
|
|
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
2017-02-24 02:37:43 +00:00
|
|
|
original_message.change_visibility.when.called_with(
|
|
|
|
100).should.throw(SQSError)
|
2015-05-30 03:21:14 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2015-05-30 03:21:14 +00:00
|
|
|
def test_purge_action():
|
|
|
|
conn = boto.sqs.connect_to_region("us-east-1")
|
|
|
|
|
|
|
|
queue = conn.create_queue('new-queue')
|
|
|
|
queue.write(queue.new_message('this is another test message'))
|
|
|
|
queue.count().should.equal(1)
|
|
|
|
|
|
|
|
queue.purge()
|
|
|
|
|
|
|
|
queue.count().should.equal(0)
|
2015-05-30 03:26:43 +00:00
|
|
|
|
|
|
|
|
2017-02-16 03:35:45 +00:00
|
|
|
@mock_sqs_deprecated
|
2015-05-30 03:26:43 +00:00
|
|
|
def test_delete_message_after_visibility_timeout():
|
|
|
|
VISIBILITY_TIMEOUT = 1
|
|
|
|
conn = boto.sqs.connect_to_region("us-east-1")
|
2017-02-24 02:37:43 +00:00
|
|
|
new_queue = conn.create_queue(
|
|
|
|
'new-queue', visibility_timeout=VISIBILITY_TIMEOUT)
|
2015-05-30 03:26:43 +00:00
|
|
|
|
|
|
|
m1 = Message()
|
|
|
|
m1.set_body('Message 1!')
|
|
|
|
new_queue.write(m1)
|
|
|
|
|
|
|
|
assert new_queue.count() == 1
|
|
|
|
|
|
|
|
m1_retrieved = new_queue.read()
|
|
|
|
|
|
|
|
time.sleep(VISIBILITY_TIMEOUT + 1)
|
|
|
|
|
|
|
|
m1_retrieved.delete()
|
|
|
|
|
|
|
|
assert new_queue.count() == 0
|
2017-10-29 18:59:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_change_message_visibility():
|
|
|
|
with freeze_time("2015-01-01 12:00:00"):
|
|
|
|
sqs = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-dlr-queue.fifo',
|
|
|
|
Attributes={'FifoQueue': 'true'}
|
|
|
|
)
|
|
|
|
queue_url = resp['QueueUrl']
|
|
|
|
|
|
|
|
sqs.send_message(QueueUrl=queue_url, MessageBody='msg1')
|
|
|
|
sqs.send_message(QueueUrl=queue_url, MessageBody='msg2')
|
|
|
|
sqs.send_message(QueueUrl=queue_url, MessageBody='msg3')
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 12:01:00"):
|
|
|
|
receive_resp = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=2)
|
|
|
|
len(receive_resp['Messages']).should.equal(2)
|
|
|
|
|
|
|
|
handles = [item['ReceiptHandle'] for item in receive_resp['Messages']]
|
|
|
|
entries = [{'Id': str(uuid.uuid4()), 'ReceiptHandle': handle, 'VisibilityTimeout': 43200} for handle in handles]
|
|
|
|
|
|
|
|
resp = sqs.change_message_visibility_batch(QueueUrl=queue_url, Entries=entries)
|
|
|
|
len(resp['Successful']).should.equal(2)
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 14:00:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=3)
|
|
|
|
len(resp['Messages']).should.equal(1)
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 16:00:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=3)
|
|
|
|
len(resp['Messages']).should.equal(1)
|
|
|
|
|
|
|
|
with freeze_time("2015-01-02 12:00:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=3)
|
|
|
|
len(resp['Messages']).should.equal(3)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_permissions():
|
|
|
|
client = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
|
|
|
|
resp = client.create_queue(
|
|
|
|
QueueName='test-dlr-queue.fifo',
|
|
|
|
Attributes={'FifoQueue': 'true'}
|
|
|
|
)
|
|
|
|
queue_url = resp['QueueUrl']
|
|
|
|
|
|
|
|
client.add_permission(QueueUrl=queue_url, Label='account1', AWSAccountIds=['111111111111'], Actions=['*'])
|
|
|
|
client.add_permission(QueueUrl=queue_url, Label='account2', AWSAccountIds=['222211111111'], Actions=['SendMessage'])
|
|
|
|
|
|
|
|
with assert_raises(ClientError):
|
|
|
|
client.add_permission(QueueUrl=queue_url, Label='account2', AWSAccountIds=['222211111111'], Actions=['SomeRubbish'])
|
|
|
|
|
|
|
|
client.remove_permission(QueueUrl=queue_url, Label='account2')
|
|
|
|
|
|
|
|
with assert_raises(ClientError):
|
|
|
|
client.remove_permission(QueueUrl=queue_url, Label='non_existant')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_tags():
|
|
|
|
client = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
|
|
|
|
resp = client.create_queue(
|
|
|
|
QueueName='test-dlr-queue.fifo',
|
|
|
|
Attributes={'FifoQueue': 'true'}
|
|
|
|
)
|
|
|
|
queue_url = resp['QueueUrl']
|
|
|
|
|
|
|
|
client.tag_queue(
|
|
|
|
QueueUrl=queue_url,
|
|
|
|
Tags={
|
|
|
|
'test1': 'value1',
|
|
|
|
'test2': 'value2',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
resp = client.list_queue_tags(QueueUrl=queue_url)
|
|
|
|
resp['Tags'].should.contain('test1')
|
|
|
|
resp['Tags'].should.contain('test2')
|
|
|
|
|
|
|
|
client.untag_queue(
|
|
|
|
QueueUrl=queue_url,
|
|
|
|
TagKeys=['test2']
|
|
|
|
)
|
|
|
|
|
|
|
|
resp = client.list_queue_tags(QueueUrl=queue_url)
|
|
|
|
resp['Tags'].should.contain('test1')
|
|
|
|
resp['Tags'].should_not.contain('test2')
|
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_create_fifo_queue_with_dlq():
|
|
|
|
sqs = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-dlr-queue.fifo',
|
|
|
|
Attributes={'FifoQueue': 'true'}
|
|
|
|
)
|
|
|
|
queue_url1 = resp['QueueUrl']
|
|
|
|
queue_arn1 = sqs.get_queue_attributes(QueueUrl=queue_url1)['Attributes']['QueueArn']
|
|
|
|
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-dlr-queue',
|
|
|
|
Attributes={'FifoQueue': 'false'}
|
|
|
|
)
|
|
|
|
queue_url2 = resp['QueueUrl']
|
|
|
|
queue_arn2 = sqs.get_queue_attributes(QueueUrl=queue_url2)['Attributes']['QueueArn']
|
|
|
|
|
|
|
|
sqs.create_queue(
|
|
|
|
QueueName='test-queue.fifo',
|
|
|
|
Attributes={
|
|
|
|
'FifoQueue': 'true',
|
|
|
|
'RedrivePolicy': json.dumps({'deadLetterTargetArn': queue_arn1, 'maxReceiveCount': 2})
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
# Cant have fifo queue with non fifo DLQ
|
|
|
|
with assert_raises(ClientError):
|
|
|
|
sqs.create_queue(
|
|
|
|
QueueName='test-queue2.fifo',
|
|
|
|
Attributes={
|
|
|
|
'FifoQueue': 'true',
|
|
|
|
'RedrivePolicy': json.dumps({'deadLetterTargetArn': queue_arn2, 'maxReceiveCount': 2})
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_sqs
|
|
|
|
def test_queue_with_dlq():
|
|
|
|
sqs = boto3.client('sqs', region_name='us-east-1')
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 12:00:00"):
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-dlr-queue.fifo',
|
|
|
|
Attributes={'FifoQueue': 'true'}
|
|
|
|
)
|
|
|
|
queue_url1 = resp['QueueUrl']
|
|
|
|
queue_arn1 = sqs.get_queue_attributes(QueueUrl=queue_url1)['Attributes']['QueueArn']
|
|
|
|
|
|
|
|
resp = sqs.create_queue(
|
|
|
|
QueueName='test-queue.fifo',
|
|
|
|
Attributes={
|
|
|
|
'FifoQueue': 'true',
|
|
|
|
'RedrivePolicy': json.dumps({'deadLetterTargetArn': queue_arn1, 'maxReceiveCount': 2})
|
|
|
|
}
|
|
|
|
)
|
|
|
|
queue_url2 = resp['QueueUrl']
|
|
|
|
|
|
|
|
sqs.send_message(QueueUrl=queue_url2, MessageBody='msg1')
|
|
|
|
sqs.send_message(QueueUrl=queue_url2, MessageBody='msg2')
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 13:00:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url2, VisibilityTimeout=30, WaitTimeSeconds=0)
|
|
|
|
resp['Messages'][0]['Body'].should.equal('msg1')
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 13:01:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url2, VisibilityTimeout=30, WaitTimeSeconds=0)
|
|
|
|
resp['Messages'][0]['Body'].should.equal('msg1')
|
|
|
|
|
|
|
|
with freeze_time("2015-01-01 13:02:00"):
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url2, VisibilityTimeout=30, WaitTimeSeconds=0)
|
|
|
|
len(resp['Messages']).should.equal(1)
|
|
|
|
|
|
|
|
resp = sqs.receive_message(QueueUrl=queue_url1, VisibilityTimeout=30, WaitTimeSeconds=0)
|
|
|
|
resp['Messages'][0]['Body'].should.equal('msg1')
|
|
|
|
|
|
|
|
# Might as well test list source queues
|
|
|
|
|
|
|
|
resp = sqs.list_dead_letter_source_queues(QueueUrl=queue_url1)
|
|
|
|
resp['queueUrls'][0].should.equal(queue_url2)
|