26
26
TEST_QUEUE_DLQ_NAME = 'TestQueue_DLQ_snsTest'
27
27
TEST_TOPIC_NAME_2 = 'topic-test-2'
28
28
29
+ PUBLICATION_TIMEOUT = .500
30
+ PUBLICATION_RETRIES = 4
31
+
29
32
THIS_FOLDER = os .path .dirname (os .path .realpath (__file__ ))
30
33
TEST_LAMBDA_ECHO_FILE = os .path .join (THIS_FOLDER , 'lambdas' , 'lambda_echo.py' )
31
34
@@ -54,11 +57,14 @@ def test_publish_unicode_chars(self):
54
57
# publish message to SNS, receive it from SQS, assert that messages are equal
55
58
message = u'ö§a1"_!?,. £$-'
56
59
self .sns_client .publish (TopicArn = self .topic_arn , Message = message )
57
- msgs = self .sqs_client .receive_message (QueueUrl = queue_url )
58
- msg_received = msgs ['Messages' ][0 ]
59
- msg_received = json .loads (to_str (msg_received ['Body' ]))
60
- msg_received = msg_received ['Message' ]
61
- self .assertEqual (message , msg_received )
60
+
61
+ def check_message ():
62
+ msgs = self .sqs_client .receive_message (QueueUrl = queue_url )
63
+ msg_received = msgs ['Messages' ][0 ]
64
+ msg_received = json .loads (to_str (msg_received ['Body' ]))
65
+ msg_received = msg_received ['Message' ]
66
+ self .assertEqual (message , msg_received )
67
+ retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
62
68
63
69
# clean up
64
70
self .sqs_client .delete_queue (QueueUrl = queue_url )
@@ -124,11 +130,14 @@ def test_attribute_raw_subscribe(self):
124
130
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
125
131
MessageAttributes = {'store' : {'DataType' : 'Binary' , 'BinaryValue' : binary_attribute }})
126
132
127
- msgs = self .sqs_client .receive_message (QueueUrl = self .queue_url , MessageAttributeNames = ['All' ])
128
- msg_received = msgs ['Messages' ][0 ]
133
+ def check_message ():
134
+ msgs = self .sqs_client .receive_message (QueueUrl = self .queue_url , MessageAttributeNames = ['All' ])
135
+ msg_received = msgs ['Messages' ][0 ]
136
+
137
+ self .assertEqual (message , msg_received ['Body' ])
138
+ self .assertEqual (binary_attribute , msg_received ['MessageAttributes' ]['store' ]['BinaryValue' ])
129
139
130
- self .assertEqual (message , msg_received ['Body' ])
131
- self .assertEqual (binary_attribute , msg_received ['MessageAttributes' ]['store' ]['BinaryValue' ])
140
+ retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
132
141
133
142
def test_filter_policy (self ):
134
143
# connect SNS topic to an SQS queue
@@ -151,15 +160,23 @@ def test_filter_policy(self):
151
160
message = u'This is a test message'
152
161
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
153
162
MessageAttributes = {'attr1' : {'DataType' : 'Number' , 'StringValue' : '99' }})
154
- num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
155
- self .assertEqual (num_msgs_1 , num_msgs_0 + 1 )
163
+
164
+ def check_message ():
165
+ num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
166
+ self .assertEqual (num_msgs_1 , num_msgs_0 + 1 )
167
+ return num_msgs_1
168
+ num_msgs_1 = retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
156
169
157
170
# publish message that does not satisfy the filter policy, assert that message is not received
158
171
message = u'This is a test message'
159
172
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
160
173
MessageAttributes = {'attr1' : {'DataType' : 'Number' , 'StringValue' : '111' }})
161
- num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
162
- self .assertEqual (num_msgs_2 , num_msgs_1 )
174
+
175
+ def check_message2 ():
176
+ num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
177
+ self .assertEqual (num_msgs_2 , num_msgs_1 )
178
+ return num_msgs_2
179
+ retry (check_message2 , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
163
180
164
181
# clean up
165
182
self .sqs_client .delete_queue (QueueUrl = queue_url )
@@ -188,15 +205,23 @@ def do_subscribe(self, filter_policy, queue_arn):
188
205
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
189
206
MessageAttributes = {'store' : {'DataType' : 'Number' , 'StringValue' : '99' },
190
207
'def' : {'DataType' : 'Number' , 'StringValue' : '99' }})
191
- num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
192
- self .assertEqual (num_msgs_1 , num_msgs_0 + 1 )
208
+
209
+ def check_message1 ():
210
+ num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
211
+ self .assertEqual (num_msgs_1 , num_msgs_0 + 1 )
212
+ return num_msgs_1
213
+ num_msgs_1 = retry (check_message1 , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
193
214
194
215
# publish message that does not satisfy the filter policy, assert that message is not received
195
216
message = u'This is a test message'
196
217
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
197
218
MessageAttributes = {'attr1' : {'DataType' : 'Number' , 'StringValue' : '111' }})
198
- num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
199
- self .assertEqual (num_msgs_2 , num_msgs_1 )
219
+
220
+ def check_message2 ():
221
+ num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ])
222
+ self .assertEqual (num_msgs_2 , num_msgs_1 )
223
+ return num_msgs_2
224
+ retry (check_message2 , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
200
225
201
226
# test with exist operator set to false.
202
227
queue_arn = aws_stack .sqs_queue_arn (TEST_QUEUE_NAME )
@@ -210,17 +235,27 @@ def do_subscribe(self, filter_policy, queue_arn):
210
235
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
211
236
MessageAttributes = {'store' : {'DataType' : 'Number' , 'StringValue' : '99' },
212
237
'def' : {'DataType' : 'Number' , 'StringValue' : '99' }})
213
- num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = self .queue_url ,
238
+
239
+ def check_message ():
240
+ num_msgs_1 = len (self .sqs_client .receive_message (QueueUrl = self .queue_url ,
214
241
VisibilityTimeout = 0 ).get ('Messages' , []))
215
- self .assertEqual (num_msgs_1 , num_msgs_0 )
242
+ self .assertEqual (num_msgs_1 , num_msgs_0 )
243
+ return num_msgs_1
244
+
245
+ num_msgs_1 = retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
216
246
217
247
# publish message that without the attribute and see if its getting filtered.
218
248
message = u'This is a test message'
219
249
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
220
250
MessageAttributes = {'attr1' : {'DataType' : 'Number' , 'StringValue' : '111' }})
221
- num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = self .queue_url ,
222
- VisibilityTimeout = 0 ).get ('Messages' , []))
223
- self .assertEqual (num_msgs_2 , num_msgs_1 )
251
+
252
+ def check_message3 ():
253
+ num_msgs_2 = len (self .sqs_client .receive_message (QueueUrl = self .queue_url ,
254
+ VisibilityTimeout = 0 ).get ('Messages' , []))
255
+ self .assertEqual (num_msgs_2 , num_msgs_1 )
256
+ return num_msgs_2
257
+
258
+ retry (check_message3 , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
224
259
225
260
# clean up
226
261
self .sqs_client .delete_queue (QueueUrl = queue_url )
@@ -232,8 +267,10 @@ def test_subscribe_sqs_queue(self):
232
267
subscription = self ._publish_sns_message_with_attrs (queue_arn , 'sqs' )
233
268
234
269
# assert that message is received
235
- messages = self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ]
236
- self .assertEqual (json .loads (messages [0 ]['Body' ])['MessageAttributes' ]['attr1' ]['Value' ], '99.12' )
270
+ def check_message ():
271
+ messages = self .sqs_client .receive_message (QueueUrl = queue_url , VisibilityTimeout = 0 )['Messages' ]
272
+ self .assertEqual (json .loads (messages [0 ]['Body' ])['MessageAttributes' ]['attr1' ]['Value' ], '99.12' )
273
+ retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
237
274
238
275
# clean up
239
276
self .sqs_client .delete_queue (QueueUrl = queue_url )
@@ -248,7 +285,7 @@ def test_subscribe_platform_endpoint(self):
248
285
# assert that message has been received
249
286
def check_message ():
250
287
self .assertGreater (len (sns_listener .PLATFORM_ENDPOINT_MESSAGES [platform_arn ]), 0 )
251
- retry (check_message )
288
+ retry (check_message , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
252
289
253
290
# clean up
254
291
sns .unsubscribe (SubscriptionArn = subscription ['SubscriptionArn' ])
@@ -270,6 +307,7 @@ def _publish_sns_message_with_attrs(self, endpoint_arn, protocol):
270
307
message = u'This is a test message'
271
308
self .sns_client .publish (TopicArn = self .topic_arn , Message = message ,
272
309
MessageAttributes = {'attr1' : {'DataType' : 'Number' , 'StringValue' : '99.12' }})
310
+ time .sleep (PUBLICATION_TIMEOUT )
273
311
return subscription
274
312
275
313
def test_unknown_topic_publish (self ):
@@ -355,16 +393,19 @@ def test_topic_subscription(self):
355
393
Protocol = 'email' ,
356
394
357
395
)
358
- subscription_arn = subscription ['SubscriptionArn' ]
359
- subscription_obj = sns_listener .SUBSCRIPTION_STATUS [subscription_arn ]
360
- self .assertEqual (subscription_obj ['Status' ], 'Not Subscribed' )
361
396
362
- _token = subscription_obj ['Token' ]
363
- self .sns_client .confirm_subscription (
364
- TopicArn = self .topic_arn ,
365
- Token = _token
366
- )
367
- self .assertEqual (subscription_obj ['Status' ], 'Subscribed' )
397
+ def check_subscription ():
398
+ subscription_arn = subscription ['SubscriptionArn' ]
399
+ subscription_obj = sns_listener .SUBSCRIPTION_STATUS [subscription_arn ]
400
+ self .assertEqual (subscription_obj ['Status' ], 'Not Subscribed' )
401
+
402
+ _token = subscription_obj ['Token' ]
403
+ self .sns_client .confirm_subscription (
404
+ TopicArn = self .topic_arn ,
405
+ Token = _token
406
+ )
407
+ self .assertEqual (subscription_obj ['Status' ], 'Subscribed' )
408
+ retry (check_subscription , retries = PUBLICATION_RETRIES , sleep = PUBLICATION_TIMEOUT )
368
409
369
410
def test_dead_letter_queue (self ):
370
411
lambda_name = 'test-%s' % short_uid ()
0 commit comments