@@ -352,6 +352,8 @@ delivery_count_classic_queue(Config) ->
352352delivery_count_quorum_queue (Config ) ->
353353 delivery_count (<<" quorum" >>, Config ).
354354
355+ % % Test that the AMQP delivery-count is incremented correctly.
356+ % % "The number of unsuccessful previous attempts to deliver this message."
355357delivery_count (QType , Config ) ->
356358 QName = <<" source queue" >>,
357359 QAddress = rabbitmq_amqp_address :queue (QName ),
@@ -360,6 +362,9 @@ delivery_count(QType, Config) ->
360362
361363 {_ , Session , LinkPair } = Init = init (Config ),
362364 QProps = #{arguments => #{<<" x-queue-type" >> => {utf8 , QType },
365+ <<" x-message-ttl" >> => {ulong , 5000 },
366+ <<" x-max-length" >> => {ulong , 1 },
367+ <<" x-overflow" >> => {utf8 , <<" drop-head" >>},
363368 <<" x-dead-letter-exchange" >> => {utf8 , <<>>},
364369 <<" x-dead-letter-routing-key" >> => {utf8 , DLQName }}},
365370 {ok , #{type := QType }} = rabbitmq_amqp_client :declare_queue (LinkPair , QName , QProps ),
@@ -371,55 +376,79 @@ delivery_count(QType, Config) ->
371376
372377 {ok , Sender } = amqp10_client :attach_sender_link (Session , <<" sender source queue" >>, QAddress ),
373378 ok = wait_for_credit (Sender ),
374- M1 = amqp10_msg :new (<<" tag" >>, <<" msg" >>, true ),
375- ok = amqp10_client :send_msg (Sender , M1 ),
376- ok = detach_link_sync (Sender ),
379+ ok = amqp10_client :send_msg (Sender , amqp10_msg :new (<<" t1" >>, <<" first message" >>, true )),
377380
378381 {ok , QReceiver } = amqp10_client :attach_receiver_link (
379382 Session , <<" receiver source queue" >>, QAddress , unsettled ),
380383 {ok , DLQReceiver } = amqp10_client :attach_receiver_link (
381384 Session , <<" receiver dead letter queue" >>, DLQAddress , unsettled ),
382385
383- {ok , M2 } = amqp10_client :get_msg (QReceiver ),
386+ {ok , Msg1 } = amqp10_client :get_msg (QReceiver ),
384387 ? assertMatch (#{delivery_count := 0 ,
385388 first_acquirer := true },
386- amqp10_msg :headers (M2 )),
389+ amqp10_msg :headers (Msg1 )),
387390
388- % % released coutcome must not increment the delivery-count
389- ok = amqp10_client :settle_msg (QReceiver , M2 , released ),
390- {ok , M3 } = amqp10_client :get_msg (QReceiver ),
391+ % % delivery-failed=true in modified coutcome must increment the delivery-count
392+ % % delivery-failed=false in modified coutcome must not increment the delivery-count
393+ ok = amqp10_client :settle_msg (QReceiver , Msg1 , {modified , false , false , #{}}),
394+ {ok , Msg2 } = amqp10_client :get_msg (QReceiver ),
391395 ? assertMatch (#{delivery_count := 0 ,
392396 first_acquirer := false },
393- amqp10_msg :headers (M3 )),
394-
395- % % delivery-failed=true in modified coutcome must increment the delivery-count
396- ok = amqp10_client :settle_msg (QReceiver , M3 , {modified , true , false , #{}}),
397- {ok , M4 } = amqp10_client :get_msg (QReceiver ),
397+ amqp10_msg :headers (Msg2 )),
398+ ok = amqp10_client :settle_msg (QReceiver , Msg2 , {modified , true , false , #{}}),
399+ {ok , Msg3 } = amqp10_client :get_msg (QReceiver ),
398400 ? assertMatch (#{delivery_count := 1 ,
399401 first_acquirer := false },
400- amqp10_msg :headers (M4 )),
402+ amqp10_msg :headers (Msg3 )),
403+ ok = amqp10_client :settle_msg (DLQReceiver , Msg3 , {modified , true , true , #{}}),
404+ {ok , Msg4 } = amqp10_client :get_msg (DLQReceiver ),
405+ ? assertMatch (#{delivery_count := 2 ,
406+ first_acquirer := false },
407+ amqp10_msg :headers (Msg4 )),
408+ ok = amqp10_client :settle_msg (DLQReceiver , Msg4 , {modified , false , true , #{}}),
409+ {ok , Msg5 } = amqp10_client :get_msg (QReceiver ),
410+ ? assertMatch (#{delivery_count := 2 ,
411+ first_acquirer := false },
412+ amqp10_msg :headers (Msg5 )),
401413
402- % % delivery-failed=false in modified coutcome must not increment the delivery-count
403- ok = amqp10_client :settle_msg (QReceiver , M4 , {modified , false , true , #{}}),
404- {ok , M5 } = amqp10_client :get_msg (DLQReceiver ),
405- ? assertMatch (#{delivery_count := 1 ,
414+ % % released coutcome must not increment the delivery-count
415+ ok = amqp10_client :settle_msg (QReceiver , Msg5 , released ),
416+
417+ % % Let the message expire.
418+ % % Since there wasn't a delivery attempt, the delivery-count must not be incremented.
419+ {ok , Msg6 } = amqp10_client :get_msg (DLQReceiver , 15_000 ),
420+ ? assertMatch (#{<<" x-last-death-reason" >> := <<" expired" >>},
421+ amqp10_msg :message_annotations (Msg6 )),
422+ ? assertMatch (#{delivery_count := 2 ,
406423 first_acquirer := false },
407- amqp10_msg :headers (M5 )),
424+ amqp10_msg :headers (Msg6 )),
408425
409426 % % rejected coutcome must increment the delivery-count
410- ok = amqp10_client :settle_msg (DLQReceiver , M5 , rejected ),
411- {ok , M6 } = amqp10_client :get_msg (QReceiver ),
412- ? assertMatch (#{delivery_count := 2 ,
427+ ok = amqp10_client :settle_msg (DLQReceiver , Msg6 , rejected ),
428+ {ok , Msg7 } = amqp10_client :get_msg (QReceiver ),
429+ ? assertMatch (#{delivery_count := 3 ,
413430 first_acquirer := false },
414- amqp10_msg :headers (M6 )),
431+ amqp10_msg :headers (Msg7 )),
432+
433+ ok = amqp10_client :settle_msg (QReceiver , Msg7 , released ),
434+ % % Dead letter the message due to x-max-length.
435+ % % Since there wasn't a delivery attempt, the delivery-count must not be incremented.
436+ ok = amqp10_client :send_msg (Sender , amqp10_msg :new (<<" t2" >>, <<" second message" >>, true )),
437+ {ok , Msg8 } = amqp10_client :get_msg (DLQReceiver ),
438+ ? assertEqual (<<" first message" >>, amqp10_msg :body_bin (Msg8 )),
439+ ? assertMatch (#{<<" x-last-death-reason" >> := <<" maxlen" >>},
440+ amqp10_msg :message_annotations (Msg8 )),
441+ ? assertMatch (#{delivery_count := 3 ,
442+ first_acquirer := false },
443+ amqp10_msg :headers (Msg8 )),
444+
445+ ok = amqp10_client :settle_msg (DLQReceiver , Msg8 , accepted ),
415446
416- ok = amqp10_client : settle_msg ( QReceiver , M6 , accepted ),
447+ ok = detach_link_sync ( Sender ),
417448 ok = detach_link_sync (QReceiver ),
418449 ok = detach_link_sync (DLQReceiver ),
419- ? assertMatch ({ok , #{message_count := 0 }},
420- rabbitmq_amqp_client :delete_queue (LinkPair , QName )),
421- ? assertMatch ({ok , #{message_count := 0 }},
422- rabbitmq_amqp_client :delete_queue (LinkPair , DLQName )),
450+ {ok , _ } = rabbitmq_amqp_client :delete_queue (LinkPair , QName ),
451+ {ok , _ } = rabbitmq_amqp_client :delete_queue (LinkPair , DLQName ),
423452 ok = close (Init ).
424453
425454% % We test the modified outcome with classic queues.
0 commit comments