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 7568580 add test test for CommandExecutorTask (#7053)
7568580 is described below
commit 75685800602a69679483b6ffa50f2ac114f6eb3f
Author: Yanjie Zhou <[email protected]>
AuthorDate: Tue Aug 25 16:18:03 2020 +0800
add test test for CommandExecutorTask (#7053)
---
.../frontend/command/CommandExecutorTaskTest.java | 168 +++++++++++++++++++++
1 file changed, 168 insertions(+)
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/test/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTaskTest.java
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/test/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTaskTest.java
new file mode 100644
index 0000000..370a7a0
--- /dev/null
+++
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-core/src/test/java/org/apache/shardingsphere/proxy/frontend/command/CommandExecutorTaskTest.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.frontend.command;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import lombok.SneakyThrows;
+import org.apache.shardingsphere.db.protocol.codec.DatabasePacketCodecEngine;
+import org.apache.shardingsphere.db.protocol.packet.CommandPacket;
+import org.apache.shardingsphere.db.protocol.packet.CommandPacketType;
+import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
+import org.apache.shardingsphere.db.protocol.payload.PacketPayload;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.ConnectionStateHandler;
+import org.apache.shardingsphere.proxy.frontend.api.CommandExecutor;
+import org.apache.shardingsphere.proxy.frontend.api.QueryCommandExecutor;
+import org.apache.shardingsphere.proxy.frontend.context.FrontendContext;
+import org.apache.shardingsphere.proxy.frontend.engine.CommandExecuteEngine;
+import
org.apache.shardingsphere.proxy.frontend.spi.DatabaseProtocolFrontendEngine;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.Collections;
+import java.util.Optional;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class CommandExecutorTaskTest {
+
+ @Mock
+ private DatabaseProtocolFrontendEngine engine;
+
+ @Mock
+ private DatabasePacketCodecEngine codecEngine;
+
+ @Mock
+ private PacketPayload payload;
+
+ @Mock
+ private BackendConnection backendConnection;
+
+ @Mock
+ private ChannelHandlerContext handlerContext;
+
+ @Mock
+ private ConnectionStateHandler stateHandler;
+
+ @Mock
+ private CommandExecuteEngine executeEngine;
+
+ @Mock
+ private ByteBuf message;
+
+ @Mock
+ private CommandPacketType commandPacketType;
+
+ @Mock
+ private CommandPacket commandPacket;
+
+ @Mock
+ private QueryCommandExecutor queryCommandExecutor;
+
+ @Mock
+ private CommandExecutor commandExecutor;
+
+ @Mock
+ private DatabasePacket databasePacket;
+
+ @Mock
+ private FrontendContext frontendContext;
+
+ @Test
+ @SneakyThrows
+ public void assertRunNeedFlushByFalse() {
+ when(backendConnection.getConnectionSize()).thenReturn(1);
+
when(queryCommandExecutor.execute()).thenReturn(Collections.EMPTY_LIST);
+ when(executeEngine.getCommandPacket(eq(payload),
eq(commandPacketType), eq(backendConnection))).thenReturn(commandPacket);
+ when(executeEngine.getCommandExecutor(eq(commandPacketType),
eq(commandPacket), eq(backendConnection))).thenReturn(queryCommandExecutor);
+
when(executeEngine.getCommandPacketType(eq(payload))).thenReturn(commandPacketType);
+ when(engine.getCommandExecuteEngine()).thenReturn(executeEngine);
+ when(backendConnection.getStateHandler()).thenReturn(stateHandler);
+ when(codecEngine.createPacketPayload(eq(message))).thenReturn(payload);
+ when(engine.getCodecEngine()).thenReturn(codecEngine);
+ CommandExecutorTask actual = new CommandExecutorTask(engine,
backendConnection, handlerContext, message);
+ actual.run();
+ verify(stateHandler).waitUntilConnectionReleasedIfNecessary();
+ verify(stateHandler).setRunningStatusIfNecessary();
+ }
+
+ @Test
+ @SneakyThrows
+ public void assertRunNeedFlushByTrue() {
+ when(backendConnection.getConnectionSize()).thenReturn(1);
+
when(queryCommandExecutor.execute()).thenReturn(Collections.singletonList(databasePacket));
+ when(executeEngine.getCommandPacket(eq(payload),
eq(commandPacketType), eq(backendConnection))).thenReturn(commandPacket);
+ when(executeEngine.getCommandExecutor(eq(commandPacketType),
eq(commandPacket), eq(backendConnection))).thenReturn(queryCommandExecutor);
+
when(executeEngine.getCommandPacketType(eq(payload))).thenReturn(commandPacketType);
+ when(engine.getCommandExecuteEngine()).thenReturn(executeEngine);
+ when(backendConnection.getStateHandler()).thenReturn(stateHandler);
+ when(codecEngine.createPacketPayload(eq(message))).thenReturn(payload);
+ when(engine.getCodecEngine()).thenReturn(codecEngine);
+ CommandExecutorTask actual = new CommandExecutorTask(engine,
backendConnection, handlerContext, message);
+ actual.run();
+ verify(stateHandler).waitUntilConnectionReleasedIfNecessary();
+ verify(stateHandler).setRunningStatusIfNecessary();
+ verify(handlerContext).write(databasePacket);
+ verify(handlerContext).flush();
+ verify(executeEngine).writeQueryData(handlerContext,
backendConnection, queryCommandExecutor, 1);
+ }
+
+ @Test
+ @SneakyThrows
+ public void assertRunByCommandExecutor() {
+ when(frontendContext.isFlushForPerCommandPacket()).thenReturn(true);
+ when(engine.getFrontendContext()).thenReturn(frontendContext);
+ when(backendConnection.getConnectionSize()).thenReturn(1);
+
when(commandExecutor.execute()).thenReturn(Collections.singletonList(databasePacket));
+ when(executeEngine.getCommandPacket(eq(payload),
eq(commandPacketType), eq(backendConnection))).thenReturn(commandPacket);
+ when(executeEngine.getCommandExecutor(eq(commandPacketType),
eq(commandPacket), eq(backendConnection))).thenReturn(commandExecutor);
+
when(executeEngine.getCommandPacketType(eq(payload))).thenReturn(commandPacketType);
+ when(engine.getCommandExecuteEngine()).thenReturn(executeEngine);
+ when(backendConnection.getStateHandler()).thenReturn(stateHandler);
+ when(codecEngine.createPacketPayload(eq(message))).thenReturn(payload);
+ when(engine.getCodecEngine()).thenReturn(codecEngine);
+ CommandExecutorTask actual = new CommandExecutorTask(engine,
backendConnection, handlerContext, message);
+ actual.run();
+ verify(stateHandler).waitUntilConnectionReleasedIfNecessary();
+ verify(stateHandler).setRunningStatusIfNecessary();
+ verify(handlerContext).write(databasePacket);
+ verify(handlerContext).flush();
+ }
+
+ @Test
+ public void assertRunWithError() {
+ RuntimeException mockException = new RuntimeException("mock");
+ when(backendConnection.getStateHandler()).thenThrow(mockException);
+ when(codecEngine.createPacketPayload(message)).thenReturn(payload);
+ when(engine.getCodecEngine()).thenReturn(codecEngine);
+
when(executeEngine.getErrorPacket(eq(mockException))).thenReturn(databasePacket);
+
when(executeEngine.getOtherPacket()).thenReturn(Optional.of(databasePacket));
+ when(engine.getCommandExecuteEngine()).thenReturn(executeEngine);
+ CommandExecutorTask actual = new CommandExecutorTask(engine,
backendConnection, handlerContext, message);
+ actual.run();
+ verify(handlerContext, atLeast(2)).writeAndFlush(databasePacket);
+ }
+
+}