BewareMyPower commented on code in PR #20948:
URL: https://github.com/apache/pulsar/pull/20948#discussion_r1310154051


##########
pulsar-broker/src/test/java/org/apache/pulsar/client/impl/MessageChunkingSharedTest.java:
##########
@@ -211,6 +214,116 @@ private static String createChunkedMessage(int numChunks) 
{
         return Schema.STRING.decode(payload);
     }
 
+    @Test
+    public void testSendChunkMessageWithSameSequenceID() throws Exception {
+        this.conf.setBrokerDeduplicationEnabled(true);
+        restartBroker();
+        String topicName = 
"persistent://my-property/my-ns/testSendChunkMessageWithSameSequenceID";
+        String producerName = "test-producer";
+        @Cleanup
+        Consumer<String> consumer = pulsarClient
+                .newConsumer(Schema.STRING)
+                .subscriptionName("test-sub")
+                .topic(topicName)
+                .subscribe();
+        @Cleanup
+        Producer<String> producer = pulsarClient
+                .newProducer(Schema.STRING)
+                .producerName(producerName)
+                .topic(topicName)
+                .enableChunking(true)
+                .enableBatching(false)
+                .create();
+        int messageSize = 6000; // payload size in KB
+        String message = "a".repeat(messageSize * 1000);
+        producer.newMessage().value(message).sequenceId(10).send();
+        Message<String> msg = consumer.receive(10, TimeUnit.SECONDS);
+        assertNotNull(msg);
+        assertTrue(msg.getMessageId() instanceof ChunkMessageIdImpl);
+        assertEquals(msg.getValue(), message);
+        producer.newMessage().value(message).sequenceId(10).send();
+        msg = consumer.receive(3, TimeUnit.SECONDS);
+        assertNull(msg);
+    }
+
+    @Test
+    public void testDuplicateForChunkMessage() throws Exception {
+        this.conf.setBrokerDeduplicationEnabled(true);
+        restartBroker();
+        String topicName = 
"persistent://my-property/my-ns/testDuplicateForChunkMessage";
+        String producerName = "test-producer";
+        @Cleanup
+        Consumer<String> consumer = pulsarClient
+                .newConsumer(Schema.STRING)
+                .subscriptionName("test-sub")
+                .topic(topicName)
+                .subscribe();
+        @Cleanup
+        Producer<String> partProducer = pulsarClient
+                .newProducer(Schema.STRING)
+                .producerName(producerName)
+                .topic(topicName)
+                .enableChunking(true)
+                .enableBatching(false)
+                .create();
+        int messageSize = 6000; // payload size in KB
+        String message = "a".repeat(messageSize * 1000);
+        partProducer.newMessage().value(message).send();
+        Message<String> msg = consumer.receive(5, TimeUnit.SECONDS);
+        assertNotNull(msg);
+        assertTrue(msg.getMessageId() instanceof ChunkMessageIdImpl);
+        assertEquals(msg.getValue(), message);
+
+        Field msgIdGenerator = 
ProducerImpl.class.getDeclaredField("msgIdGenerator");
+        msgIdGenerator.setAccessible(true);
+        assertEquals(msg.getSequenceId() + 1, 
msgIdGenerator.get(partProducer));
+
+        String message2 = "b".repeat(messageSize * 2);
+        partProducer.newMessage().value(message2).send();
+        Message<String> msg2 = consumer.receive(5, TimeUnit.SECONDS);
+        assertFalse(msg2.getMessageId() instanceof ChunkMessageIdImpl);
+        assertEquals(msg2.getValue(), message2);
+
+        long sequenceID = (long) msgIdGenerator.get(partProducer) + 1024L;
+        String message3 = "c".repeat(messageSize * 1000);
+        
partProducer.newMessage().value(message3).sequenceId(sequenceID).send();
+        Message<String> msg3 = consumer.receive(5, TimeUnit.SECONDS);
+        assertNotNull(msg3);
+        assertTrue(msg3.getMessageId() instanceof ChunkMessageIdImpl);
+        assertEquals(msg3.getValue(), message3);
+        assertEquals(msg3.getSequenceId(), sequenceID);
+    }
+
+    @Test
+    public void testDeduplicateChunksInSingleChunkMessages() throws Exception {
+        this.conf.setBrokerDeduplicationEnabled(true);
+        restartBroker();
+        String topicName = 
"persistent://my-property/my-ns/testDeduplicateChunksInSingleChunkMessage";
+        String producerName = "test-producer";
+        @Cleanup
+        Consumer<String> consumer = pulsarClient
+                .newConsumer(Schema.STRING)
+                .subscriptionName("test-sub")
+                .topic(topicName)
+                .subscribe();
+        final PersistentTopic persistentTopic = (PersistentTopic) 
pulsar.getBrokerService()
+                .getTopicIfExists(topicName).get().orElse(null);
+        assertNotNull(persistentTopic);
+        sendChunk(persistentTopic, producerName, 1, 0, 2);

Review Comment:
   If you added the tests into `MessageChunkingSharedTest` just for this 
method, you can remove the `private` modifier of the `sendChunk` method.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to