@@ -242,7 +242,7 @@ func TestDeadLetterQueue(t *testing.T) {
242
242
form .Add ("Attribute.1.Name" , "VisibilityTimeout" )
243
243
form .Add ("Attribute.1.Value" , "1" )
244
244
form .Add ("Attribute.2.Name" , "RedrivePolicy" )
245
- form .Add ("Attribute.2.Value" , `{"maxReceiveCount": 1 , "deadLetterTargetArn":"arn:aws:sqs::000000000000:failed-messages"}` )
245
+ form .Add ("Attribute.2.Value" , `{"maxReceiveCount": 2 , "deadLetterTargetArn":"arn:aws:sqs::000000000000:failed-messages"}` )
246
246
form .Add ("Version" , "2012-11-05" )
247
247
req .PostForm = form
248
248
@@ -267,6 +267,9 @@ func TestDeadLetterQueue(t *testing.T) {
267
267
t .Errorf ("handler returned wrong status code: got \n %v want %v" ,
268
268
status , http .StatusOK )
269
269
}
270
+ if len (models .SyncQueues .Queues ["testing-deadletter" ].Messages ) != 1 {
271
+ t .Fatal ("expected a message in testing-deadletter" )
272
+ }
270
273
271
274
// receive message
272
275
req , err = http .NewRequest ("POST" , "/" , nil )
@@ -285,6 +288,13 @@ func TestDeadLetterQueue(t *testing.T) {
285
288
286
289
time .Sleep (2 * time .Second )
287
290
291
+ if len (models .SyncQueues .Queues ["testing-deadletter" ].Messages ) != 1 {
292
+ t .Fatal ("expected message in testing-deadletter after 1 receive attempt" )
293
+ }
294
+ if len (deadLetterQueue .Messages ) > 0 {
295
+ t .Fatal ("expected no message in DLQ" )
296
+ }
297
+
288
298
// receive the message one more time
289
299
req , err = http .NewRequest ("POST" , "/" , nil )
290
300
if err != nil {
@@ -295,20 +305,102 @@ func TestDeadLetterQueue(t *testing.T) {
295
305
296
306
status , _ = ReceiveMessageV1 (req )
297
307
assert .Equal (t , status , http .StatusOK )
308
+
309
+ // wait for messages to be moved to DLQ and stop the periodic tasks to prevent data races.
298
310
time .Sleep (2 * time .Second )
311
+ done <- struct {}{}
312
+
313
+ if len (models .SyncQueues .Queues ["testing-deadletter" ].Messages ) != 0 {
314
+ t .Fatal ("expected no message in testing-deadletter" )
315
+ }
316
+ if len (deadLetterQueue .Messages ) == 0 {
317
+ t .Fatal ("expected a message in DLQ" )
318
+ }
319
+ }
320
+
321
+ func TestDeadLetterQueueMultiple (t * testing.T ) {
322
+ done := make (chan struct {}, 0 )
323
+ go PeriodicTasks (1 * time .Second , done )
324
+
325
+ // create a queue
326
+ req , err := http .NewRequest ("POST" , "/" , nil )
327
+ if err != nil {
328
+ t .Fatal (err )
329
+ }
330
+ deadLetterQueue := & models.Queue {
331
+ Name : "failed-messages-multiple" ,
332
+ Messages : []models.SqsMessage {},
333
+ }
334
+ models .SyncQueues .Lock ()
335
+ models .SyncQueues .Queues ["failed-messages-multiple" ] = deadLetterQueue
336
+ models .SyncQueues .Unlock ()
337
+ form := url.Values {}
338
+ form .Add ("Action" , "CreateQueue" )
339
+ form .Add ("QueueName" , "testing-deadletter-multiple" )
340
+ form .Add ("Attribute.1.Name" , "VisibilityTimeout" )
341
+ form .Add ("Attribute.1.Value" , "1" )
342
+ form .Add ("Attribute.2.Name" , "RedrivePolicy" )
343
+ form .Add ("Attribute.2.Value" , `{"maxReceiveCount": 1, "deadLetterTargetArn":"arn:aws:sqs::000000000000:failed-messages-multiple"}` )
344
+ form .Add ("Version" , "2012-11-05" )
345
+ req .PostForm = form
299
346
300
- // another receive attempt
347
+ status , _ := CreateQueueV1 (req )
348
+ assert .Equal (t , status , http .StatusOK )
349
+
350
+ // send 2 messages
301
351
req , err = http .NewRequest ("POST" , "/" , nil )
302
352
if err != nil {
303
353
t .Fatal (err )
304
354
}
305
355
356
+ form = url.Values {}
357
+ form .Add ("Action" , "SendMessage" )
358
+ form .Add ("QueueUrl" , "http://localhost:4100/queue/testing-deadletter-multiple" )
359
+ form .Add ("MessageBody" , "1" )
360
+ form .Add ("Version" , "2012-11-05" )
361
+ req .PostForm = form
362
+
363
+ status , _ = SendMessageV1 (req )
364
+ if status != http .StatusOK {
365
+ t .Errorf ("handler returned wrong status code: got \n %v want %v" ,
366
+ status , http .StatusOK )
367
+ }
368
+ status , _ = SendMessageV1 (req )
369
+ if status != http .StatusOK {
370
+ t .Errorf ("handler returned wrong status code: got \n %v want %v" ,
371
+ status , http .StatusOK )
372
+ }
373
+
374
+ if len (models .SyncQueues .Queues ["testing-deadletter-multiple" ].Messages ) != 2 {
375
+ t .Fatal ("expected 2 messages in testing-deadletter-multiple" )
376
+ }
377
+
378
+ // receive messages
379
+ req , err = http .NewRequest ("POST" , "/" , nil )
380
+ if err != nil {
381
+ t .Fatal (err )
382
+ }
383
+
384
+ form = url.Values {}
385
+ form .Add ("Action" , "ReceiveMessage" )
386
+ form .Add ("QueueUrl" , "http://localhost:4100/queue/testing-deadletter-multiple" )
387
+ form .Add ("MaxNumberOfMessages" , "2" )
388
+ form .Add ("Version" , "2012-11-05" )
306
389
req .PostForm = form
307
390
308
391
status , _ = ReceiveMessageV1 (req )
309
392
assert .Equal (t , status , http .StatusOK )
310
- if len (deadLetterQueue .Messages ) == 0 {
311
- t .Fatal ("expected a message" )
393
+
394
+ // wait for messages to be moved to DLQ and stop the periodic tasks to prevent data races.
395
+ time .Sleep (3 * time .Second )
396
+ done <- struct {}{}
397
+
398
+ numMessages := len (models .SyncQueues .Queues ["testing-deadletter-multiple" ].Messages )
399
+ if numMessages != 0 {
400
+ t .Fatalf ("expected no messages in testing-deadletter-multiple, found: %d" , numMessages )
401
+ }
402
+ if len (deadLetterQueue .Messages ) != 2 {
403
+ t .Fatal ("expected 2 messages in DLQ" )
312
404
}
313
405
}
314
406
0 commit comments