@@ -29,6 +29,7 @@ groups() ->
29
29
dropwhile_fetchwhile ,
30
30
info_head_message_timestamp ,
31
31
info_backing_queue_version ,
32
+ info_oldest_message_received_timestamp ,
32
33
unknown_info_key ,
33
34
matching ,
34
35
purge ,
@@ -415,6 +416,53 @@ info_backing_queue_version(Config) ->
415
416
passed
416
417
end .
417
418
419
+ info_oldest_message_received_timestamp (Config ) ->
420
+ passed = rabbit_ct_broker_helpers :rpc (Config , 0 ,
421
+ ? MODULE , info_oldest_message_received_timestamp1 , [Config ]).
422
+
423
+ info_oldest_message_received_timestamp1 (_Config ) ->
424
+ QName = rabbit_misc :r (<<" /" >>, queue ,
425
+ <<" info_oldest_message_received_timestamp-queue" >>),
426
+ ExName = rabbit_misc :r (<<" /" >>, exchange , <<>>),
427
+ Q0 = rabbit_amqqueue :pseudo_queue (QName , self ()),
428
+ Q1 = amqqueue :set_arguments (Q0 , [{<<" x-max-priority" >>, long , 2 }]),
429
+ PQ = rabbit_priority_queue ,
430
+ BQS1 = PQ :init (Q1 , new , fun (_ , _ ) -> ok end ),
431
+ % % The queue is empty: no timestamp.
432
+ true = PQ :is_empty (BQS1 ),
433
+ '' = PQ :info (oldest_message_received_timestamp , BQS1 ),
434
+ % % Publish one message.
435
+ Content1 = # content {properties = # 'P_basic' {priority = 1 },
436
+ payload_fragments_rev = []},
437
+ {ok , Msg1 } = mc_amqpl :message (ExName , <<>>, Content1 , #{id => <<" msg1" >>}),
438
+ BQS2 = PQ :publish (Msg1 , # message_properties {size = 0 }, false , self (),
439
+ noflow , BQS1 ),
440
+ Ts1 = PQ :info (oldest_message_received_timestamp , BQS2 ),
441
+ ? assert (is_integer (Ts1 )),
442
+ % % Publish a higher priority message.
443
+ Content2 = # content {properties = # 'P_basic' {priority = 2 },
444
+ payload_fragments_rev = []},
445
+ {ok , Msg2 } = mc_amqpl :message (ExName , <<>>, Content2 , #{id => <<" msg2" >>}),
446
+ BQS3 = PQ :publish (Msg2 , # message_properties {size = 0 }, false , self (),
447
+ noflow , BQS2 ),
448
+ % % Even though is highest priority, the lower priority message is older.
449
+ % % Timestamp hasn't changed.
450
+ ? assertEqual (Ts1 , PQ :info (oldest_message_received_timestamp , BQS3 )),
451
+ % % Consume message.
452
+ {{Msg2 , _ , _ }, BQS4 } = PQ :fetch (false , BQS3 ),
453
+ ? assertEqual (Ts1 , PQ :info (oldest_message_received_timestamp , BQS4 )),
454
+ % % Consume the first message, but do not acknowledge it
455
+ % % yet. The goal is to verify that the unacknowledged message's
456
+ % % timestamp is returned.
457
+ {{Msg1 , _ , AckTag }, BQS5 } = PQ :fetch (true , BQS4 ),
458
+ ? assertEqual (Ts1 , PQ :info (oldest_message_received_timestamp , BQS5 )),
459
+ % % Ack message. The queue is empty now.
460
+ {[<<" msg1" >>], BQS6 } = PQ :ack ([AckTag ], BQS5 ),
461
+ true = PQ :is_empty (BQS6 ),
462
+ ? assertEqual ('' , PQ :info (oldest_message_received_timestamp , BQS6 )),
463
+ PQ :delete_and_terminate (a_whim , BQS6 ),
464
+ passed .
465
+
418
466
unknown_info_key (Config ) ->
419
467
{Conn , Ch } = rabbit_ct_client_helpers :open_connection_and_channel (Config , 0 ),
420
468
Q = <<" info-priority-queue" >>,
0 commit comments