@@ -3249,6 +3249,60 @@ TEST(BasicEndToEndTest, testNegativeAcksWithPartitions) {
32493249 testNegativeAcks (topicName, true );
32503250}
32513251
3252+ int64_t getCurrentTimeMs () {
3253+ return std::chrono::duration_cast<std::chrono::milliseconds>(
3254+ std::chrono::system_clock::now ().time_since_epoch ())
3255+ .count ();
3256+ }
3257+
3258+ void testNegativeAckPrecisionBitCnt (const std::string &topic, int precisionBitCnt) {
3259+ constexpr int delayMs = 2000 ;
3260+ const int64_t timeDeviation = 1L << precisionBitCnt;
3261+
3262+ Client client (lookupUrl);
3263+
3264+ Consumer consumer;
3265+ ConsumerConfiguration conf;
3266+ conf.setNegativeAckRedeliveryDelayMs (delayMs);
3267+ conf.setNegativeAckPrecisionBitCnt (precisionBitCnt);
3268+
3269+ Result result = client.subscribe (topic, " sub1" , conf, consumer);
3270+ ASSERT_EQ (ResultOk, result);
3271+
3272+ Producer producer;
3273+ ProducerConfiguration producerConf;
3274+ result = client.createProducer (topic, producerConf, producer);
3275+ ASSERT_EQ (ResultOk, result);
3276+
3277+ Message msg = MessageBuilder ().setContent (" test-0" ).build ();
3278+ producer.sendAsync (msg, nullptr );
3279+ producer.flush ();
3280+
3281+ // receive and trigger negative ack
3282+ Message received;
3283+ consumer.receive (received);
3284+ consumer.negativeAcknowledge (received);
3285+
3286+ int64_t expectedRedeliveryTime = getCurrentTimeMs () + delayMs;
3287+
3288+ Message redelivered;
3289+ consumer.receive (redelivered);
3290+ int64_t now = getCurrentTimeMs ();
3291+ ASSERT_GE (now, expectedRedeliveryTime - timeDeviation);
3292+ ASSERT_EQ (redelivered.getDataAsString (), " test-0" );
3293+
3294+ consumer.acknowledge (redelivered);
3295+ client.shutdown ();
3296+ }
3297+
3298+ TEST (BasicEndToEndTest, testNegativeAckPrecisionBitCnt) {
3299+ for (int precisionBitCnt = 1 ; precisionBitCnt <= 12 ; precisionBitCnt++) {
3300+ std::string topic = " testNegativeAckPrecisionBitCnt-" + std::to_string (precisionBitCnt) + " -" +
3301+ std::to_string (time (nullptr ));
3302+ testNegativeAckPrecisionBitCnt (topic, precisionBitCnt);
3303+ }
3304+ }
3305+
32523306static long regexTestMessagesReceived = 0 ;
32533307
32543308static void regexMessageListenerFunction (const Consumer &consumer, const Message &msg) {
0 commit comments