This is an automated email from the ASF dual-hosted git repository.

chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 3978783370b KAFKA-20826 Fix 
EndToEndLatencyTest#testInvalidRecordHeaderValue (#22909)
3978783370b is described below

commit 3978783370bb25ddc293a79e8f830334baea05c7
Author: majialong <[email protected]>
AuthorDate: Mon Jul 27 13:54:43 2026 +0800

    KAFKA-20826 Fix EndToEndLatencyTest#testInvalidRecordHeaderValue (#22909)
    
    `testInvalidRecordHeaderValue` incorrectly treats -1 as invalid,
    although it represents a null header value.
    
    This change uses -2 for the invalid case and validates options directly,
    avoiding unnecessary Kafka client initialization and the resulting
    connection timeout.
    
    Reviewers: Chia-Ping Tsai <[email protected]>
---
 .../apache/kafka/tools/EndToEndLatencyTest.java    | 41 +++++++++++++++-------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git 
a/tools/src/test/java/org/apache/kafka/tools/EndToEndLatencyTest.java 
b/tools/src/test/java/org/apache/kafka/tools/EndToEndLatencyTest.java
index da6be533574..10320c6f0cb 100644
--- a/tools/src/test/java/org/apache/kafka/tools/EndToEndLatencyTest.java
+++ b/tools/src/test/java/org/apache/kafka/tools/EndToEndLatencyTest.java
@@ -92,7 +92,7 @@ public class EndToEndLatencyTest {
                     .toArray(String[]::new);
         }
 
-        public ArgsBuilder withNegative(String param) {
+        public ArgsBuilder withMinusOne(String param) {
             return with(param, "-1");
         }
         
@@ -128,37 +128,39 @@ public class EndToEndLatencyTest {
     private void testInvalidNumRecords() {
         String expectedMsg = "Value for --num-records must be a positive 
integer.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-            ArgsBuilder.defaults().withNegative("--num-records").build(), 
expectedMsg);
+            ArgsBuilder.defaults().withZero("--num-records").build(), 
expectedMsg);
+        assertInitializeInvalidOptionsExitCodeAndMsg(
+            ArgsBuilder.defaults().withMinusOne("--num-records").build(), 
expectedMsg);
     }
 
     private void testInvalidRecordSize() {
         String expectedMsg = "Value for --record-size must be a non-negative 
integer.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-            ArgsBuilder.defaults().withNegative("--record-size").build(), 
expectedMsg);
+            ArgsBuilder.defaults().withMinusOne("--record-size").build(), 
expectedMsg);
     }
 
     private void testInvalidRecordKey() {
         String expectedMsg = "Value for --record-key-size must be a 
non-negative integer.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-            ArgsBuilder.defaults().withNegative("--record-key-size").build(), 
expectedMsg);
+            ArgsBuilder.defaults().withMinusOne("--record-key-size").build(), 
expectedMsg);
     }
 
     private void testInvalidNumHeaders() {
         String expectedMsg = "Value for --num-headers must be a non-negative 
integer.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-                ArgsBuilder.defaults().withNegative("--num-headers").build(), 
expectedMsg);
+                ArgsBuilder.defaults().withMinusOne("--num-headers").build(), 
expectedMsg);
     }
 
     private void testInvalidRecordHeaderKey() {
         String expectedMsg = "Value for --record-header-key-size must be a 
non-negative integer.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-            
ArgsBuilder.defaults().withNegative("--record-header-key-size").build(), 
expectedMsg);
+            
ArgsBuilder.defaults().withMinusOne("--record-header-key-size").build(), 
expectedMsg);
     }
 
     private void testInvalidRecordHeaderValue() {
-        String expectedMsg = "Value for --record-header-size must be a 
non-negative integer.";
+        String expectedMsg = "Value for --record-header-size must be a 
non-negative integer or -1 for null header value.";
         assertInitializeInvalidOptionsExitCodeAndMsg(
-            
ArgsBuilder.defaults().withNegative("--record-header-size").build(), 
expectedMsg);
+            ArgsBuilder.defaults().with("--record-header-size", "-2").build(), 
expectedMsg);
     }
 
     private void testInvalidProducerAcks() {
@@ -168,13 +170,17 @@ public class EndToEndLatencyTest {
     }
 
     private void assertInitializeInvalidOptionsExitCodeAndMsg(String[] args, 
String expectedMsg) {
+        AtomicReference<Integer> exitStatus = new AtomicReference<>();
+        AtomicReference<String> exitMessage = new AtomicReference<>();
         Exit.setExitProcedure((exitCode, message) -> {
-            assertEquals(1, exitCode);
-            assertTrue(message.contains(expectedMsg));
+            exitStatus.set(exitCode);
+            exitMessage.set(message);
             throw new RuntimeException();
         });
         try {
-            assertThrows(RuntimeException.class, () -> 
EndToEndLatency.execute(args));
+            assertThrows(RuntimeException.class, () -> new 
EndToEndLatency.EndToEndLatencyCommandOptions(args));
+            assertEquals(Integer.valueOf(1), exitStatus.get());
+            assertEquals(expectedMsg, exitMessage.get());
         } finally {
             Exit.resetExitProcedure();
         }
@@ -320,14 +326,23 @@ public class EndToEndLatencyTest {
     }
 
     @Test
-    public void shouldPassWithNamedArgs() {
+    public void shouldAcceptValidNamedArgs() {
+        
assertInitializeValidOptionsDoesNotExit(ArgsBuilder.defaults().build());
+    }
+
+    @Test
+    public void shouldAcceptMinusOneForRecordHeaderValueSize() {
+        
assertInitializeValidOptionsDoesNotExit(ArgsBuilder.defaults().withMinusOne("--record-header-size").build());
+    }
+
+    private void assertInitializeValidOptionsDoesNotExit(String[] args) {
         AtomicReference<Integer> exitStatus = new AtomicReference<>();
         Exit.setExitProcedure((status, __) -> {
             exitStatus.set(status);
             throw new RuntimeException();
         });
         try {
-            assertDoesNotThrow(() -> new 
EndToEndLatency.EndToEndLatencyCommandOptions(ArgsBuilder.defaults().build()));
+            assertDoesNotThrow(() -> new 
EndToEndLatency.EndToEndLatencyCommandOptions(args));
             assertNull(exitStatus.get());
         } finally {
             Exit.resetExitProcedure();

Reply via email to