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));
}
}