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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 289f7c433a7 Add more test cases on ResponsePacketBuilderTest (#37913)
289f7c433a7 is described below

commit 289f7c433a7c4e8d52bfa817da76bafc24f7e5da
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jan 30 22:59:55 2026 +0800

    Add more test cases on ResponsePacketBuilderTest (#37913)
    
    * Add more test cases on ResponsePacketBuilderTest
    
    * Add more test cases on ResponsePacketBuilderTest
    
    * Add more test cases on ResponsePacketBuilderTest
    
    * Add more test cases on ResponsePacketBuilderTest
---
 .../query/builder/ResponsePacketBuilderTest.java   | 104 +++++++++++++++------
 1 file changed, 74 insertions(+), 30 deletions(-)

diff --git 
a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilderTest.java
 
b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilderTest.java
index d9c5914d47f..ace4cf8c8f5 100644
--- 
a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilderTest.java
+++ 
b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/builder/ResponsePacketBuilderTest.java
@@ -17,8 +17,11 @@
 
 package org.apache.shardingsphere.proxy.frontend.mysql.command.query.builder;
 
+import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import 
org.apache.shardingsphere.database.protocol.mysql.constant.MySQLCharacterSets;
 import 
org.apache.shardingsphere.database.protocol.mysql.packet.command.query.MySQLColumnDefinition41Packet;
+import 
org.apache.shardingsphere.database.protocol.mysql.packet.command.query.MySQLColumnDefinitionFlag;
 import 
org.apache.shardingsphere.database.protocol.mysql.packet.command.query.MySQLFieldCountPacket;
 import 
org.apache.shardingsphere.database.protocol.mysql.packet.generic.MySQLEofPacket;
 import 
org.apache.shardingsphere.database.protocol.mysql.packet.generic.MySQLOKPacket;
@@ -28,32 +31,60 @@ import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import java.nio.charset.StandardCharsets;
+import java.sql.Types;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
+import java.util.stream.Stream;
 
-import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.isA;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 class ResponsePacketBuilderTest {
     
-    @Test
-    void assertBuildQueryResponsePackets() {
-        QueryHeader queryHeader1 = new QueryHeader("schema1", "table1", 
"columnLabel1", "columnName1", 5, "VARCHAR", 4, 6, false, true, false, true);
-        QueryHeader queryHeader2 = new QueryHeader("schema2", "table2", 
"columnLabel2", "columnName2", 8, "VARCHAR", 7, 9, false, true, true, true);
-        List<QueryHeader> queryHeaders = Arrays.asList(queryHeader1, 
queryHeader2);
-        QueryResponseHeader queryResponseHeader = new 
QueryResponseHeader(queryHeaders);
-        Collection<DatabasePacket> actual = 
ResponsePacketBuilder.buildQueryResponsePackets(queryResponseHeader, 255, 0);
-        assertTrue(actual.stream().findAny().isPresent());
-        assertThat(actual.stream().findAny().get(), 
anyOf(isA(MySQLFieldCountPacket.class), 
isA(MySQLColumnDefinition41Packet.class), isA(MySQLEofPacket.class)));
+    private static final int SESSION_CHARACTER_SET = 
MySQLCharacterSets.UTF8_GENERAL_CI.getId();
+    
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("queryResponsePacketsProvider")
+    void assertBuildQueryResponsePackets(final String name, final QueryHeader 
queryHeader, final int sessionCharacterSet, final int statusFlags,
+                                         final int expectedCharacterSet, final 
int expectedFlags, final int expectedDecimals) {
+        QueryResponseHeader queryResponseHeader = new 
QueryResponseHeader(Collections.singletonList(queryHeader));
+        Collection<DatabasePacket> actual = 
ResponsePacketBuilder.buildQueryResponsePackets(queryResponseHeader, 
sessionCharacterSet, statusFlags);
+        List<DatabasePacket> actualPackets = new ArrayList<>(actual);
+        assertThat(name, actualPackets.size(), is(3));
+        MySQLFieldCountPacket fieldCountPacket = (MySQLFieldCountPacket) 
actualPackets.get(0);
+        assertThat(fieldCountPacket.getColumnCount(), is(1));
+        MySQLColumnDefinition41Packet columnDefinitionPacket = 
(MySQLColumnDefinition41Packet) actualPackets.get(1);
+        ByteBuf buffer = Unpooled.buffer();
+        columnDefinitionPacket.write(new MySQLPacketPayload(buffer, 
StandardCharsets.UTF_8));
+        buffer.readerIndex(0);
+        MySQLPacketPayload payload = new MySQLPacketPayload(buffer, 
StandardCharsets.UTF_8);
+        payload.readStringLenenc();
+        payload.readStringLenenc();
+        payload.readStringLenenc();
+        payload.readStringLenenc();
+        payload.readStringLenenc();
+        payload.readStringLenenc();
+        payload.readIntLenenc();
+        int actualCharacterSet = payload.readInt2();
+        payload.readInt4();
+        payload.readInt1();
+        int actualFlags = payload.readInt2();
+        assertThat(actualCharacterSet, is(expectedCharacterSet));
+        assertThat(actualFlags, is(expectedFlags));
+        int actualDecimals = payload.readInt1();
+        assertThat(actualDecimals, is(expectedDecimals));
+        MySQLEofPacket eofPacket = (MySQLEofPacket) actualPackets.get(2);
+        assertThat(eofPacket.getStatusFlags(), is(statusFlags));
     }
     
     @Test
@@ -61,28 +92,41 @@ class ResponsePacketBuilderTest {
         UpdateResponseHeader updateResponseHeader = 
mock(UpdateResponseHeader.class);
         when(updateResponseHeader.getUpdateCount()).thenReturn(10L);
         when(updateResponseHeader.getLastInsertId()).thenReturn(100L);
-        Collection<DatabasePacket> actual = 
ResponsePacketBuilder.buildUpdateResponsePackets(updateResponseHeader, 0);
-        assertTrue(actual.stream().findAny().isPresent());
-        MySQLOKPacket actualItem = (MySQLOKPacket) 
actual.stream().findAny().get();
+        Collection<DatabasePacket> actual = 
ResponsePacketBuilder.buildUpdateResponsePackets(updateResponseHeader, 3);
+        List<DatabasePacket> actualPackets = new ArrayList<>(actual);
+        assertThat(actualPackets.size(), is(1));
+        MySQLOKPacket actualItem = (MySQLOKPacket) actualPackets.get(0);
         assertThat(actualItem, isA(MySQLOKPacket.class));
         assertThat(actualItem.getAffectedRows(), is(10L));
         assertThat(actualItem.getLastInsertId(), is(100L));
+        assertThat(actualItem.getStatusFlag(), is(3));
     }
     
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    @Test
-    void assertBuildQueryResponsePacketsWithBinaryColumnType() {
-        QueryHeader nonBinaryHeader = new QueryHeader("s", "t", 
"columnLabel1", "columnName1", 5, "VARCHAR", 1, 1, false, false, false, false);
-        QueryHeader binaryHeader = new QueryHeader("s", "t", "columnLabel2", 
"columnName2", 8, "VARBINARY", 1, 1, false, false, false, false);
-        List<QueryHeader> queryHeaders = Arrays.asList(nonBinaryHeader, 
binaryHeader);
-        QueryResponseHeader queryResponseHeader = new 
QueryResponseHeader(queryHeaders);
-        List<DatabasePacket> actual = new 
ArrayList(ResponsePacketBuilder.buildQueryResponsePackets(queryResponseHeader, 
255, 0));
-        assertThat(actual.size(), is(4));
-        byte[] actualNonBinaryData = new byte[48];
-        actual.get(1).write(new 
MySQLPacketPayload(Unpooled.wrappedBuffer(actualNonBinaryData).writerIndex(0), 
StandardCharsets.UTF_8));
-        assertThat(actualNonBinaryData[43] & 0x80, is(0));
-        byte[] actualBinaryData = new byte[48];
-        actual.get(2).write(new 
MySQLPacketPayload(Unpooled.wrappedBuffer(actualBinaryData).writerIndex(0), 
StandardCharsets.UTF_8));
-        assertThat(actualBinaryData[43] & 0x80, is(0x80));
+    private static Stream<Arguments> queryResponsePacketsProvider() {
+        return Stream.of(
+                Arguments.of(
+                        "Non-binary column uses session charset and 
unsigned/auto_increment flags",
+                        new QueryHeader("schema1", "table1", "columnLabel1", 
"columnName1", Types.INTEGER, "INTEGER", 6, 2, false, true, false, true),
+                        SESSION_CHARACTER_SET,
+                        1,
+                        SESSION_CHARACTER_SET,
+                        MySQLColumnDefinitionFlag.PRIMARY_KEY.getValue() + 
MySQLColumnDefinitionFlag.UNSIGNED.getValue() + 
MySQLColumnDefinitionFlag.AUTO_INCREMENT.getValue(),
+                        2),
+                Arguments.of(
+                        "Binary column type sets BINARY charset, binary 
collation and blob flag",
+                        new QueryHeader("schema2", "table2", "columnLabel2", 
"columnName2", Types.BINARY, "BLOB", 9, 1, true, false, true, false),
+                        SESSION_CHARACTER_SET,
+                        2,
+                        MySQLCharacterSets.BINARY.getId(),
+                        MySQLColumnDefinitionFlag.NOT_NULL.getValue() + 
MySQLColumnDefinitionFlag.BINARY_COLLATION.getValue() + 
MySQLColumnDefinitionFlag.BLOB.getValue(),
+                        1),
+                Arguments.of(
+                        "Binary type name only keeps session charset and 
binary collation without blob flag",
+                        new QueryHeader("schema3", "table3", "columnLabel3", 
"columnName3", Types.VARCHAR, "VARBINARY", 12, 0, true, false, false, false),
+                        SESSION_CHARACTER_SET,
+                        4,
+                        SESSION_CHARACTER_SET,
+                        MySQLColumnDefinitionFlag.BINARY_COLLATION.getValue(),
+                        0));
     }
 }

Reply via email to