You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by ji...@apache.org on 2026/10/15 02:26:22 UTC
(rocketmq) branch develop updated: fix: preserve message body whitespace in mqadmin sendMessage (#11414)
This is an automated email from the ASF dual-hosted git repository.
RongtongJin pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/rocketmq.git
The following commit(s) were added to refs/heads/develop by this push:
new 39a0c76798 fix: preserve message body whitespace in mqadmin sendMessage (#11414)
39a0c76798 is described below
commit 39a0c767988cb476192c55142c06e033f3edabf1
Author: Adrian Wang <12...@users.noreply.github.com>
AuthorDate: Thu Oct 15 10:26:16 2026 +0800
fix: preserve message body whitespace in mqadmin sendMessage (#11414)
---
.../tools/command/message/SendMessageCommand.java | 2 +-
.../command/message/SendMessageCommandTest.java | 51 ++++++++++++++++++++++
2 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java
index 970da6b169..bd9b7a8795 100644
--- a/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java
+++ b/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java
@@ -91,7 +91,7 @@ public class SendMessageCommand implements SubCommand {
public void execute(CommandLine commandLine, Options options, RPCHook rpcHook) throws SubCommandException {
Message msg = null;
String topic = commandLine.getOptionValue('t').trim();
- String body = commandLine.getOptionValue('p').trim();
+ String body = commandLine.getOptionValue('p');
String tag = null;
String keys = null;
String brokerName = null;
diff --git a/tools/src/test/java/org/apache/rocketmq/tools/command/message/SendMessageCommandTest.java b/tools/src/test/java/org/apache/rocketmq/tools/command/message/SendMessageCommandTest.java
index 6f750d530b..88e793b8f8 100644
--- a/tools/src/test/java/org/apache/rocketmq/tools/command/message/SendMessageCommandTest.java
+++ b/tools/src/test/java/org/apache/rocketmq/tools/command/message/SendMessageCommandTest.java
@@ -20,6 +20,7 @@ package org.apache.rocketmq.tools.command.message;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
+import java.nio.charset.StandardCharsets;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
@@ -37,9 +38,12 @@ import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class SendMessageCommandTest {
@@ -88,4 +92,51 @@ public class SendMessageCommandTest {
String s = new String(bos.toByteArray());
Assert.assertTrue(s.contains("SEND_OK"));
}
+
+ @Test
+ public void testExecutePreservesBodyWhitespace() throws Exception {
+ assertMessageBody("\t message \r\n", false);
+ }
+
+ @Test
+ public void testExecutePreservesWhitespaceOnlyBody() throws Exception {
+ assertMessageBody(" ", false);
+ }
+
+ @Test
+ public void testExecutePreservesBodyWhenQueueIsSpecified() throws Exception {
+ assertMessageBody(" \u6d88\u606f\u6b63\u6587 ", true);
+ }
+
+ @Test
+ public void testExecutePreservesOrdinaryBody() throws Exception {
+ assertMessageBody("message body", false);
+ }
+
+ private void assertMessageBody(String body, boolean sendToQueue) throws Exception {
+ SendMessageCommand command = new SendMessageCommand();
+ DefaultMQProducer producer = mock(DefaultMQProducer.class);
+ MessageQueue queue = new MessageQueue("mytopic", "broker-a", 1);
+ SendResult result = new SendResult(SendStatus.SEND_OK, "message-id", "offset-id", queue, 0);
+ when(producer.send(any(Message.class))).thenReturn(result);
+ when(producer.send(any(Message.class), any(MessageQueue.class))).thenReturn(result);
+ Field producerField = SendMessageCommand.class.getDeclaredField("producer");
+ producerField.setAccessible(true);
+ producerField.set(command, producer);
+
+ Options options = command.buildCommandlineOptions(new Options());
+ String[] arguments = sendToQueue
+ ? new String[] {"-t", "mytopic", "-p", body, "-b", "broker-a", "-i", "1"}
+ : new String[] {"-t", "mytopic", "-p", body};
+ CommandLine commandLine = new DefaultParser().parse(options, arguments);
+ command.execute(commandLine, options, null);
+
+ ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+ if (sendToQueue) {
+ verify(producer).send(messageCaptor.capture(), eq(queue));
+ } else {
+ verify(producer).send(messageCaptor.capture());
+ }
+ Assert.assertArrayEquals(body.getBytes(StandardCharsets.UTF_8), messageCaptor.getValue().getBody());
+ }
}