You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/02/23 12:37:25 UTC
[shardingsphere] branch master updated: Remove ProxyContextRestorer on front-postgresql module (#24323)
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 a645ee55eb1 Remove ProxyContextRestorer on front-postgresql module (#24323)
a645ee55eb1 is described below
commit a645ee55eb1623fd74f74393c47c51d75da3d971
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Feb 23 20:37:16 2023 +0800
Remove ProxyContextRestorer on front-postgresql module (#24323)
* Remove ProxyContextRestorer on PortalTest
* Remove ProxyContextRestorer on PostgreSQLAggregatedBatchedStatementsCommandExecutorTest
* Remove ProxyContextRestorer on PostgreSQLCommandExecuteEngineTest
* Remove ProxyContextRestorer on PostgreSQLComBindExecutorTest
* Remove ProxyContextRestorer on PostgreSQLBatchedStatementsExecutorTest
* Remove ProxyContextRestorer on PostgreSQLAuthenticationEngineTest
* Remove ProxyContextRestorer on PostgreSQLComParseExecutorTest
* Remove ProxyContextRestorer on PostgreSQLComDescribeExecutorTest
* for checkstyle
* for checkstyle
---
.../frontend/postgresql/ProxyContextRestorer.java | 38 ----
.../PostgreSQLAuthenticationEngineTest.java | 70 +++---
.../PostgreSQLCommandExecuteEngineTest.java | 22 +-
.../command/query/extended/PortalTest.java | 49 +++--
...egatedBatchedStatementsCommandExecutorTest.java | 91 ++++----
.../PostgreSQLBatchedStatementsExecutorTest.java | 102 +++++----
.../bind/PostgreSQLComBindExecutorTest.java | 30 ++-
.../PostgreSQLComDescribeExecutorTest.java | 239 ++++++++++++---------
.../parse/PostgreSQLComParseExecutorTest.java | 99 ++++-----
9 files changed, 390 insertions(+), 350 deletions(-)
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/ProxyContextRestorer.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/ProxyContextRestorer.java
deleted file mode 100644
index 43691bca3bc..00000000000
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/ProxyContextRestorer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.postgresql;
-
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.junit.After;
-import org.junit.Before;
-
-public abstract class ProxyContextRestorer {
-
- private ContextManager currentContextManager;
-
- @Before
- public void recordCurrentContextManager() {
- currentContextManager = ProxyContext.getInstance().getContextManager();
- }
-
- @After
- public void restorePreviousContextManager() {
- ProxyContext.init(currentContextManager);
- }
-}
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java
index ecfef45693f..b81d4949cb4 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/authentication/PostgreSQLAuthenticationEngineTest.java
@@ -43,7 +43,6 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.frontend.authentication.AuthenticationResult;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.authentication.authenticator.impl.PostgreSQLMD5PasswordAuthenticator;
import org.junit.Before;
import org.junit.Test;
@@ -51,6 +50,7 @@ import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.MockitoJUnitRunner;
@@ -64,11 +64,12 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLAuthenticationEngineTest extends ProxyContextRestorer {
+public final class PostgreSQLAuthenticationEngineTest {
private final String username = "root";
@@ -81,13 +82,6 @@ public final class PostgreSQLAuthenticationEngineTest extends ProxyContextRestor
@Before
public void setup() {
when(channelHandlerContext.channel().attr(CommonConstants.CHARSET_ATTRIBUTE_KEY)).thenReturn(mock(Attribute.class));
- mockInitProxyContext();
- }
-
- private void mockInitProxyContext() {
- ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
- when(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(mock(AuthorityRule.class))));
- ProxyContext.init(contextManager);
}
@Test
@@ -107,7 +101,11 @@ public final class PostgreSQLAuthenticationEngineTest extends ProxyContextRestor
payload.writeInt4(196608);
payload.writeStringNul("client_encoding");
payload.writeStringNul("UTF8");
- new PostgreSQLAuthenticationEngine().authenticate(channelHandlerContext, payload);
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ new PostgreSQLAuthenticationEngine().authenticate(channelHandlerContext, payload);
+ }
}
@Test(expected = ProtocolViolationException.class)
@@ -117,7 +115,11 @@ public final class PostgreSQLAuthenticationEngineTest extends ProxyContextRestor
PostgreSQLPacketPayload payload = new PostgreSQLPacketPayload(createByteBuf(8, 16), StandardCharsets.UTF_8);
payload.writeInt1('F');
payload.writeInt8(0);
- authenticationEngine.authenticate(channelHandlerContext, payload);
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ authenticationEngine.authenticate(channelHandlerContext, payload);
+ }
}
@SneakyThrows(ReflectiveOperationException.class)
@@ -145,31 +147,39 @@ public final class PostgreSQLAuthenticationEngineTest extends ProxyContextRestor
payload.writeStringNul("client_encoding");
payload.writeStringNul("UTF8");
PostgreSQLAuthenticationEngine engine = new PostgreSQLAuthenticationEngine();
- AuthenticationResult actual = engine.authenticate(channelHandlerContext, payload);
- assertFalse(actual.isFinished());
- assertThat(actual.getUsername(), is(username));
- ArgumentCaptor<PostgreSQLMD5PasswordAuthenticationPacket> argumentCaptor = ArgumentCaptor.forClass(PostgreSQLMD5PasswordAuthenticationPacket.class);
- verify(channelHandlerContext).writeAndFlush(argumentCaptor.capture());
- PostgreSQLMD5PasswordAuthenticationPacket md5PasswordPacket = argumentCaptor.getValue();
- byte[] md5Salt = getMd5Salt(md5PasswordPacket);
- payload = new PostgreSQLPacketPayload(createByteBuf(16, 128), StandardCharsets.UTF_8);
- String md5Digest = (String) Plugins.getMemberAccessor().invoke(PostgreSQLMD5PasswordAuthenticator.class.getDeclaredMethod("md5Encode", String.class, String.class, byte[].class),
- new PostgreSQLMD5PasswordAuthenticator(), username, inputPassword, md5Salt);
- payload.writeInt1('p');
- payload.writeInt4(4 + md5Digest.length() + 1);
- payload.writeStringNul(md5Digest);
- MetaDataContexts metaDataContexts = getMetaDataContexts(new ShardingSphereUser(username, password, ""));
- ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
- when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
- ProxyContext.init(contextManager);
- actual = engine.authenticate(channelHandlerContext, payload);
- assertThat(actual.isFinished(), is(password.equals(inputPassword)));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ AuthenticationResult actual = engine.authenticate(channelHandlerContext, payload);
+ assertFalse(actual.isFinished());
+ assertThat(actual.getUsername(), is(username));
+ ArgumentCaptor<PostgreSQLMD5PasswordAuthenticationPacket> argumentCaptor = ArgumentCaptor.forClass(PostgreSQLMD5PasswordAuthenticationPacket.class);
+ verify(channelHandlerContext).writeAndFlush(argumentCaptor.capture());
+ PostgreSQLMD5PasswordAuthenticationPacket md5PasswordPacket = argumentCaptor.getValue();
+ byte[] md5Salt = getMd5Salt(md5PasswordPacket);
+ payload = new PostgreSQLPacketPayload(createByteBuf(16, 128), StandardCharsets.UTF_8);
+ String md5Digest = (String) Plugins.getMemberAccessor().invoke(PostgreSQLMD5PasswordAuthenticator.class.getDeclaredMethod("md5Encode", String.class, String.class, byte[].class),
+ new PostgreSQLMD5PasswordAuthenticator(), username, inputPassword, md5Salt);
+ payload.writeInt1('p');
+ payload.writeInt4(4 + md5Digest.length() + 1);
+ payload.writeStringNul(md5Digest);
+ MetaDataContexts metaDataContexts = getMetaDataContexts(new ShardingSphereUser(username, password, ""));
+ when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
+ actual = engine.authenticate(channelHandlerContext, payload);
+ assertThat(actual.isFinished(), is(password.equals(inputPassword)));
+ }
}
private ByteBuf createByteBuf(final int initialCapacity, final int maxCapacity) {
return new UnpooledHeapByteBuf(UnpooledByteBufAllocator.DEFAULT, initialCapacity, maxCapacity);
}
+ private ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(mock(AuthorityRule.class))));
+ return result;
+ }
+
private MetaDataContexts getMetaDataContexts(final ShardingSphereUser user) {
return new MetaDataContexts(
mock(MetaDataPersistService.class), new ShardingSphereMetaData(new LinkedHashMap<>(), buildGlobalRuleMetaData(user), new ConfigurationProperties(new Properties())));
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java
index 9f6804b00cc..61aad503805 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/PostgreSQLCommandExecuteEngineTest.java
@@ -33,13 +33,13 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.transaction.TransactionStatus;
import org.apache.shardingsphere.proxy.frontend.command.executor.ResponseType;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor;
import org.apache.shardingsphere.transaction.api.TransactionType;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnitRunner;
import java.sql.SQLException;
@@ -48,11 +48,12 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLCommandExecuteEngineTest extends ProxyContextRestorer {
+public final class PostgreSQLCommandExecuteEngineTest {
@Mock
private ChannelHandlerContext channelHandlerContext;
@@ -68,7 +69,6 @@ public final class PostgreSQLCommandExecuteEngineTest extends ProxyContextRestor
@Before
public void setUp() {
- ProxyContext.init(new ContextManager(new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()), mock(InstanceContext.class)));
when(channelHandlerContext.channel()).thenReturn(channel);
when(connectionSession.getTransactionStatus()).thenReturn(new TransactionStatus(TransactionType.LOCAL));
}
@@ -117,11 +117,15 @@ public final class PostgreSQLCommandExecuteEngineTest extends ProxyContextRestor
PostgreSQLPacket packet = mock(PostgreSQLPacket.class);
when(queryCommandExecutor.getQueryRowPacket()).thenReturn(packet);
PostgreSQLCommandExecuteEngine commandExecuteEngine = new PostgreSQLCommandExecuteEngine();
- commandExecuteEngine.writeQueryData(channelHandlerContext, backendConnection, queryCommandExecutor, 0);
- verify(resourceLock).doAwait();
- verify(channelHandlerContext).write(packet);
- verify(channelHandlerContext).write(isA(PostgreSQLCommandCompletePacket.class));
- verify(channelHandlerContext).flush();
- verify(channelHandlerContext).write(isA(PostgreSQLReadyForQueryPacket.class));
+ ContextManager contextManager = new ContextManager(new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()), mock(InstanceContext.class));
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ commandExecuteEngine.writeQueryData(channelHandlerContext, backendConnection, queryCommandExecutor, 0);
+ verify(resourceLock).doAwait();
+ verify(channelHandlerContext).write(packet);
+ verify(channelHandlerContext).write(isA(PostgreSQLCommandCompletePacket.class));
+ verify(channelHandlerContext).flush();
+ verify(channelHandlerContext).write(isA(PostgreSQLReadyForQueryPacket.class));
+ }
}
}
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
index 03736dbc496..a920f666fca 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PortalTest.java
@@ -46,7 +46,6 @@ 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.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssignSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -85,42 +84,52 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PortalTest extends ProxyContextRestorer {
+public final class PortalTest {
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ContextManager mockContextManager;
+ private MockedStatic<ProxyContext> mockedProxyContext;
- @Mock
- private ProxyBackendHandler proxyBackendHandler;
+ private MockedStatic<ProxyBackendHandlerFactory> mockedProxyBackendHandlerFactory;
@Mock
- private ConnectionSession connectionSession;
+ private ProxyBackendHandler proxyBackendHandler;
@Mock
private BackendConnection backendConnection;
- private MockedStatic<ProxyBackendHandlerFactory> mockedStatic;
-
@Before
public void setup() {
- ProxyContext.init(mockContextManager);
- when(mockContextManager.getMetaDataContexts().getMetaData().containsDatabase("db")).thenReturn(true);
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+ mockedProxyContext = mockProxyContext();
+ ConnectionSession connectionSession = mock(ConnectionSession.class);
when(connectionSession.getDefaultDatabaseName()).thenReturn("db");
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
- when(database.getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
- when(ProxyContext.getInstance().getDatabase("db")).thenReturn(database);
+ mockedProxyBackendHandlerFactory = mockProxyBackendHandlerFactory(connectionSession);
when(backendConnection.getConnectionSession()).thenReturn(connectionSession);
- mockedStatic = mockStatic(ProxyBackendHandlerFactory.class);
- mockedStatic.when(() -> ProxyBackendHandlerFactory.newInstance(any(PostgreSQLDatabaseType.class), anyString(), any(SQLStatement.class), eq(connectionSession), any(HintValueContext.class)))
- .thenReturn(proxyBackendHandler);
- mockedStatic.when(() -> ProxyBackendHandlerFactory.newInstance(any(PostgreSQLDatabaseType.class), any(QueryContext.class), eq(connectionSession), anyBoolean()))
+ }
+
+ private MockedStatic<ProxyBackendHandlerFactory> mockProxyBackendHandlerFactory(final ConnectionSession connectionSession) {
+ MockedStatic<ProxyBackendHandlerFactory> result = mockStatic(ProxyBackendHandlerFactory.class);
+ result.when(() -> ProxyBackendHandlerFactory.newInstance(any(PostgreSQLDatabaseType.class), anyString(), any(SQLStatement.class), eq(connectionSession), any(HintValueContext.class)))
.thenReturn(proxyBackendHandler);
+ result.when(() -> ProxyBackendHandlerFactory.newInstance(any(PostgreSQLDatabaseType.class), any(QueryContext.class), eq(connectionSession), anyBoolean())).thenReturn(proxyBackendHandler);
+ return result;
+ }
+
+ private MockedStatic<ProxyContext> mockProxyContext() {
+ MockedStatic<ProxyContext> result = mockStatic(ProxyContext.class);
+ result.when(() -> ProxyContext.getInstance()).thenReturn(mock(ProxyContext.class, RETURNS_DEEP_STUBS));
+ ContextManager mockedContextManager = mock(ContextManager.class, Answers.RETURNS_DEEP_STUBS);
+ result.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(mockedContextManager);
+ when(mockedContextManager.getMetaDataContexts().getMetaData().containsDatabase("db")).thenReturn(true);
+ when(mockedContextManager.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(database.getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
+ result.when(() -> ProxyContext.getInstance().getDatabase("db")).thenReturn(database);
+ return result;
}
@After
public void tearDown() {
- mockedStatic.close();
+ mockedProxyContext.close();
+ mockedProxyBackendHandlerFactory.close();
}
@Test
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
index 7e8d9280af7..99d7b8ed091 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
@@ -46,13 +46,11 @@ import org.apache.shardingsphere.proxy.backend.connector.jdbc.statement.JDBCBack
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
import org.apache.shardingsphere.sqltranslator.rule.builder.DefaultSQLTranslatorRuleConfigurationBuilder;
-import org.junit.Before;
import org.junit.Test;
+import org.mockito.MockedStatic;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -70,9 +68,10 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
-public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest extends ProxyContextRestorer {
+public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest {
private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new ShardingSphereSQLParserEngine("PostgreSQL", new CacheOption(2000, 65535L), new CacheOption(128, 1024L), false);
@@ -80,39 +79,38 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest exte
private static final String STATEMENT_ID = "S_1";
- private static final String SQL = "insert into t_order (id) values (?)";
+ private static final String SQL = "INSERT INTO t_order (id) VALUES (?)";
private static final int BATCH_SIZE = 10;
- @Before
- public void setup() {
- ProxyContext.init(mock(ContextManager.class, RETURNS_DEEP_STUBS));
- }
-
- @SuppressWarnings("rawtypes")
@Test
public void assertExecute() throws SQLException {
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(0);
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY)).thenReturn(1);
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
- ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
- new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
- ConnectionSession connectionSession = mock(ConnectionSession.class);
- when(connectionSession.getDatabaseName()).thenReturn("db");
- when(connectionSession.getConnectionContext()).thenReturn(new ConnectionContext());
- when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
- when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("ds_0"));
- when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase("db")).thenReturn(database);
- SQLStatement sqlStatement = SQL_PARSER_ENGINE.parse(SQL, false);
+ ConnectionSession connectionSession = mockConnectionSession();
+ PostgreSQLAggregatedBatchedStatementsCommandExecutor executor = new PostgreSQLAggregatedBatchedStatementsCommandExecutor(connectionSession, createPackets());
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ List<DatabasePacket<?>> actualPackets = new ArrayList<>(executor.execute());
+ assertThat(actualPackets.size(), is(BATCH_SIZE * 3));
+ for (int i = 0; i < BATCH_SIZE; i++) {
+ assertThat(actualPackets.get(i * 3), is(PostgreSQLBindCompletePacket.getInstance()));
+ assertThat(actualPackets.get(i * 3 + 1), is(PostgreSQLNoDataPacket.getInstance()));
+ assertThat(actualPackets.get(i * 3 + 2), instanceOf(PostgreSQLCommandCompletePacket.class));
+ }
+ }
+ }
+
+ private static ConnectionSession mockConnectionSession() throws SQLException {
+ ConnectionSession result = mock(ConnectionSession.class);
+ @SuppressWarnings("rawtypes")
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
- when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(STATEMENT_ID,
+ when(sqlStatementContext.getSqlStatement()).thenReturn(SQL_PARSER_ENGINE.parse(SQL, false));
+ when(result.getDatabaseName()).thenReturn("db");
+ when(result.getConnectionContext()).thenReturn(new ConnectionContext());
+ when(result.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
+ result.getServerPreparedStatementRegistry().addPreparedStatement(STATEMENT_ID,
new PostgreSQLServerPreparedStatement(SQL, sqlStatementContext, Collections.singletonList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4)));
- when(connectionSession.getConnectionId()).thenReturn(CONNECTION_ID);
+ when(result.getConnectionId()).thenReturn(CONNECTION_ID);
BackendConnection backendConnection = mock(BackendConnection.class);
Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
when(connection.getMetaData().getURL()).thenReturn("jdbc:postgresql://127.0.0.1/db");
@@ -122,20 +120,13 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest exte
JDBCBackendStatement backendStatement = mock(JDBCBackendStatement.class);
when(backendStatement.createStorageResource(any(ExecutionUnit.class), any(Connection.class), any(ConnectionMode.class), any(StatementOption.class), nullable(DatabaseType.class)))
.thenReturn(preparedStatement);
- when(connectionSession.getStatementManager()).thenReturn(backendStatement);
- when(connectionSession.getBackendConnection()).thenReturn(backendConnection);
- PostgreSQLAggregatedBatchedStatementsCommandExecutor batchedStatementsCommandExecutor = new PostgreSQLAggregatedBatchedStatementsCommandExecutor(connectionSession, preparePackets());
- List<DatabasePacket<?>> actualPackets = new ArrayList<>(batchedStatementsCommandExecutor.execute());
- assertThat(actualPackets.size(), is(BATCH_SIZE * 3));
- for (int i = 0; i < BATCH_SIZE; i++) {
- assertThat(actualPackets.get(i * 3), is(PostgreSQLBindCompletePacket.getInstance()));
- assertThat(actualPackets.get(i * 3 + 1), is(PostgreSQLNoDataPacket.getInstance()));
- assertThat(actualPackets.get(i * 3 + 2), instanceOf(PostgreSQLCommandCompletePacket.class));
- }
+ when(result.getStatementManager()).thenReturn(backendStatement);
+ when(result.getBackendConnection()).thenReturn(backendConnection);
+ return result;
}
- private List<PostgreSQLCommandPacket> preparePackets() {
- List<PostgreSQLCommandPacket> result = new ArrayList<>();
+ private List<PostgreSQLCommandPacket> createPackets() {
+ List<PostgreSQLCommandPacket> result = new ArrayList<>(BATCH_SIZE);
for (int i = 0; i < BATCH_SIZE; i++) {
PostgreSQLComBindPacket bindPacket = mock(PostgreSQLComBindPacket.class);
when(bindPacket.getStatementId()).thenReturn(STATEMENT_ID);
@@ -148,4 +139,20 @@ public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest exte
}
return result;
}
+
+ private static ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(0);
+ when(result.getMetaDataContexts().getMetaData().getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY)).thenReturn(1);
+ when(result.getMetaDataContexts().getMetaData().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+ ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
+ new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
+ when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("ds_0"));
+ when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
+ when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
+ when(result.getMetaDataContexts().getMetaData().getDatabase("db")).thenReturn(database);
+ return result;
+ }
}
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
index a6fa60f1c2b..cff1a6f872e 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutorTest.java
@@ -37,16 +37,15 @@ import org.apache.shardingsphere.proxy.backend.connector.BackendConnection;
import org.apache.shardingsphere.proxy.backend.connector.jdbc.statement.JDBCBackendStatement;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dml.PostgreSQLInsertStatement;
import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
import org.apache.shardingsphere.sqltranslator.rule.builder.DefaultSQLTranslatorRuleConfigurationBuilder;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Answers;
import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.MockitoJUnitRunner;
@@ -67,13 +66,11 @@ import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLBatchedStatementsExecutorTest extends ProxyContextRestorer {
-
- @Mock
- private ConnectionSession connectionSession;
+public final class PostgreSQLBatchedStatementsExecutorTest {
@Mock
private BackendConnection backendConnection;
@@ -81,39 +78,8 @@ public final class PostgreSQLBatchedStatementsExecutorTest extends ProxyContextR
@Mock
private JDBCBackendStatement backendStatement;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ContextManager contextManager;
-
- @Before
- public void setup() {
- when(connectionSession.getDatabaseName()).thenReturn("db");
- when(connectionSession.getBackendConnection()).thenReturn(backendConnection);
- when(connectionSession.getStatementManager()).thenReturn(backendStatement);
- when(connectionSession.getConnectionContext()).thenReturn(new ConnectionContext());
- ProxyContext.init(contextManager);
- when(contextManager.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(1);
- when(contextManager.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY)).thenReturn(1);
- when(contextManager.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
- when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("ds_0"));
- when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
- when(contextManager.getMetaDataContexts().getMetaData().getDatabase("db")).thenReturn(database);
- ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
- new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
- }
-
@Test
public void assertExecuteBatch() throws SQLException {
- PostgreSQLInsertStatement insertStatement = mock(PostgreSQLInsertStatement.class, RETURNS_DEEP_STUBS);
- when(insertStatement.getTable().getTableName().getIdentifier().getValue()).thenReturn("t");
- InsertStatementContext insertStatementContext = mock(InsertStatementContext.class);
- when(insertStatementContext.getSqlStatement()).thenReturn(insertStatement);
- PostgreSQLServerPreparedStatement postgreSQLPreparedStatement = new PostgreSQLServerPreparedStatement("insert into t (id, col) values (?, ?)", insertStatementContext,
- Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_VARCHAR));
- List<List<Object>> parameterSets = Arrays.asList(Arrays.asList(1, new PostgreSQLTypeUnspecifiedSQLParameter("foo")),
- Arrays.asList(2, new PostgreSQLTypeUnspecifiedSQLParameter("bar")), Arrays.asList(3, new PostgreSQLTypeUnspecifiedSQLParameter("baz")));
Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
when(connection.getMetaData().getURL()).thenReturn("jdbc:postgresql://127.0.0.1/db");
when(backendConnection.getConnections(nullable(String.class), anyInt(), any(ConnectionMode.class))).thenReturn(Collections.singletonList(connection));
@@ -122,18 +88,60 @@ public final class PostgreSQLBatchedStatementsExecutorTest extends ProxyContextR
when(preparedStatement.executeBatch()).thenReturn(new int[]{1, 1, 1});
when(backendStatement.createStorageResource(any(ExecutionUnit.class), eq(connection), any(ConnectionMode.class), any(StatementOption.class), nullable(DatabaseType.class)))
.thenReturn(preparedStatement);
- PostgreSQLBatchedStatementsExecutor actual = new PostgreSQLBatchedStatementsExecutor(connectionSession, postgreSQLPreparedStatement, parameterSets);
- prepareExecutionUnitParameters(actual, parameterSets);
- int actualUpdated = actual.executeBatch();
- assertThat(actualUpdated, is(3));
- InOrder inOrder = inOrder(preparedStatement);
- for (List<Object> each : parameterSets) {
- inOrder.verify(preparedStatement).setObject(1, each.get(0));
- inOrder.verify(preparedStatement).setObject(2, each.get(1).toString());
- inOrder.verify(preparedStatement).addBatch();
+ ContextManager contextManager = mockContextManager();
+ ConnectionSession connectionSession = mockConnectionSession();
+ PostgreSQLServerPreparedStatement postgreSQLPreparedStatement = new PostgreSQLServerPreparedStatement("insert into t (id, col) values (?, ?)", mockInsertStatementContext(),
+ Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_VARCHAR));
+ List<List<Object>> parameterSets = Arrays.asList(Arrays.asList(1, new PostgreSQLTypeUnspecifiedSQLParameter("foo")),
+ Arrays.asList(2, new PostgreSQLTypeUnspecifiedSQLParameter("bar")), Arrays.asList(3, new PostgreSQLTypeUnspecifiedSQLParameter("baz")));
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, Mockito.RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ PostgreSQLBatchedStatementsExecutor actual = new PostgreSQLBatchedStatementsExecutor(connectionSession, postgreSQLPreparedStatement, parameterSets);
+ prepareExecutionUnitParameters(actual, parameterSets);
+ int actualUpdated = actual.executeBatch();
+ assertThat(actualUpdated, is(3));
+ InOrder inOrder = inOrder(preparedStatement);
+ for (List<Object> each : parameterSets) {
+ inOrder.verify(preparedStatement).setObject(1, each.get(0));
+ inOrder.verify(preparedStatement).setObject(2, each.get(1).toString());
+ inOrder.verify(preparedStatement).addBatch();
+ }
}
}
+ private static InsertStatementContext mockInsertStatementContext() {
+ PostgreSQLInsertStatement insertStatement = mock(PostgreSQLInsertStatement.class, RETURNS_DEEP_STUBS);
+ when(insertStatement.getTable().getTableName().getIdentifier().getValue()).thenReturn("t");
+ InsertStatementContext result = mock(InsertStatementContext.class);
+ when(result.getSqlStatement()).thenReturn(insertStatement);
+ return result;
+ }
+
+ private ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.KERNEL_EXECUTOR_SIZE)).thenReturn(1);
+ when(result.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY)).thenReturn(1);
+ when(result.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(database.getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
+ when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("ds_0"));
+ when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
+ when(result.getMetaDataContexts().getMetaData().getDatabase("db")).thenReturn(database);
+ ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
+ new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
+ when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ return result;
+ }
+
+ private ConnectionSession mockConnectionSession() {
+ ConnectionSession result = mock(ConnectionSession.class);
+ when(result.getDatabaseName()).thenReturn("db");
+ when(result.getBackendConnection()).thenReturn(backendConnection);
+ when(result.getStatementManager()).thenReturn(backendStatement);
+ when(result.getConnectionContext()).thenReturn(new ConnectionContext());
+ return result;
+ }
+
@SuppressWarnings("unchecked")
@SneakyThrows(ReflectiveOperationException.class)
private void prepareExecutionUnitParameters(final PostgreSQLBatchedStatementsExecutor target, final List<List<Object>> parameterSets) {
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
index 9f0372fb20a..16792e07309 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/bind/PostgreSQLComBindExecutorTest.java
@@ -29,7 +29,6 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
import org.apache.shardingsphere.proxy.backend.session.transaction.TransactionStatus;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.PortalContext;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.PostgreSQLServerPreparedStatement;
@@ -37,8 +36,11 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal
import org.apache.shardingsphere.transaction.api.TransactionType;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Answers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import java.sql.SQLException;
@@ -49,13 +51,13 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLComBindExecutorTest extends ProxyContextRestorer {
+public final class PostgreSQLComBindExecutorTest {
@Mock
private PortalContext portalContext;
@@ -71,11 +73,8 @@ public final class PostgreSQLComBindExecutorTest extends ProxyContextRestorer {
@Test
public void assertExecuteBind() throws SQLException {
- ProxyContext.init(mock(ContextManager.class, RETURNS_DEEP_STUBS));
String databaseName = "postgres";
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().containsDatabase(databaseName)).thenReturn(true);
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
- when(ProxyContext.getInstance().getDatabase(databaseName)).thenReturn(database);
when(database.getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
BackendConnection backendConnection = mock(BackendConnection.class);
@@ -90,9 +89,20 @@ public final class PostgreSQLComBindExecutorTest extends ProxyContextRestorer {
when(bindPacket.getPortal()).thenReturn("C_1");
when(bindPacket.readParameters(anyList())).thenReturn(Collections.emptyList());
when(bindPacket.readResultFormats()).thenReturn(Collections.emptyList());
- Collection<DatabasePacket<?>> actual = executor.execute();
- assertThat(actual.size(), is(1));
- assertThat(actual.iterator().next(), is(PostgreSQLBindCompletePacket.getInstance()));
- verify(portalContext).add(any(Portal.class));
+ ContextManager contextManager = mockContextManager(databaseName);
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, Mockito.RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(databaseName)).thenReturn(database);
+ Collection<DatabasePacket<?>> actual = executor.execute();
+ assertThat(actual.size(), is(1));
+ assertThat(actual.iterator().next(), is(PostgreSQLBindCompletePacket.getInstance()));
+ verify(portalContext).add(any(Portal.class));
+ }
+ }
+
+ private ContextManager mockContextManager(final String databaseName) {
+ ContextManager result = mock(ContextManager.class, Answers.RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().containsDatabase(databaseName)).thenReturn(true);
+ return result;
}
}
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
index 9a20c3a9b96..349cc395663 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
@@ -46,7 +46,6 @@ import org.apache.shardingsphere.proxy.backend.connector.BackendConnection;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.PortalContext;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.PostgreSQLServerPreparedStatement;
@@ -54,12 +53,11 @@ import org.apache.shardingsphere.sql.parser.api.CacheOption;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
import org.apache.shardingsphere.sqltranslator.rule.builder.DefaultSQLTranslatorRuleConfigurationBuilder;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Answers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.MockitoJUnitRunner;
@@ -83,12 +81,13 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestorer {
+public final class PostgreSQLComDescribeExecutorTest {
private static final String DATABASE_NAME = "postgres";
@@ -96,9 +95,6 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new ShardingSphereSQLParserEngine("PostgreSQL", new CacheOption(2000, 65535L), new CacheOption(128, 1024L), false);
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ContextManager contextManager;
-
@Mock
private PortalContext portalContext;
@@ -111,33 +107,6 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
@InjectMocks
private PostgreSQLComDescribeExecutor executor;
- @Before
- public void setup() {
- ProxyContext.init(contextManager);
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
- when(connectionSession.getDatabaseName()).thenReturn(DATABASE_NAME);
- when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
- ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
- new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
- when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
- when(contextManager.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap(DATABASE_NAME, mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS)));
- prepareTableMetaData();
- }
-
- private void prepareTableMetaData() {
- Collection<ShardingSphereColumn> columnMetaData = Arrays.asList(
- new ShardingSphereColumn("id", Types.INTEGER, true, false, false, true, false),
- new ShardingSphereColumn("k", Types.INTEGER, true, false, false, true, false),
- new ShardingSphereColumn("c", Types.CHAR, true, false, false, true, false),
- new ShardingSphereColumn("pad", Types.CHAR, true, false, false, true, false));
- ShardingSphereTable table = new ShardingSphereTable(TABLE_NAME, columnMetaData, Collections.emptyList(), Collections.emptyList());
- when(contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getSchema("public").getTable(TABLE_NAME)).thenReturn(table);
- when(contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
- when(contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getResourceMetaData().getStorageTypes())
- .thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(contextManager.getMetaDataContexts().getMetaData().containsDatabase(DATABASE_NAME)).thenReturn(true);
- }
-
@Test
public void assertDescribePortal() throws SQLException {
when(packet.getType()).thenReturn('P');
@@ -165,17 +134,23 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
}
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(2));
- Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
- PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
- PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
- actualParameterDescription.write(mockPayload);
- verify(mockPayload).writeInt2(4);
- verify(mockPayload, times(2)).writeInt4(23);
- verify(mockPayload, times(2)).writeInt4(18);
- assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(2));
+ Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
+ PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
+ PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
+ actualParameterDescription.write(mockPayload);
+ verify(mockPayload).writeInt2(4);
+ verify(mockPayload, times(2)).writeInt4(23);
+ verify(mockPayload, times(2)).writeInt4(18);
+ assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ }
}
@SuppressWarnings("rawtypes")
@@ -192,17 +167,23 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
}
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(2));
- Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
- PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
- PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
- actualParameterDescription.write(mockPayload);
- verify(mockPayload).writeInt2(5);
- verify(mockPayload, times(2)).writeInt4(23);
- verify(mockPayload, times(3)).writeInt4(18);
- assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(2));
+ Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
+ PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
+ PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
+ actualParameterDescription.write(mockPayload);
+ verify(mockPayload).writeInt2(5);
+ verify(mockPayload, times(2)).writeInt4(23);
+ verify(mockPayload, times(3)).writeInt4(18);
+ assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ }
}
@SuppressWarnings("rawtypes")
@@ -219,17 +200,23 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
}
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(2));
- Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
- PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
- PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
- actualParameterDescription.write(mockPayload);
- verify(mockPayload).writeInt2(5);
- verify(mockPayload, times(2)).writeInt4(23);
- verify(mockPayload, times(3)).writeInt4(18);
- assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(2));
+ Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
+ PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
+ PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
+ actualParameterDescription.write(mockPayload);
+ verify(mockPayload).writeInt2(5);
+ verify(mockPayload, times(2)).writeInt4(23);
+ verify(mockPayload, times(3)).writeInt4(18);
+ assertThat(actualPacketsIterator.next(), is(PostgreSQLNoDataPacket.getInstance()));
+ }
}
@SuppressWarnings("rawtypes")
@@ -246,8 +233,14 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
}
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- executor.execute();
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ executor.execute();
+ }
}
@SuppressWarnings("rawtypes")
@@ -265,19 +258,25 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
}
SQLStatementContext sqlStatementContext = mock(InsertStatementContext.class);
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(2));
- Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
- PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
- PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
- actualParameterDescription.write(mockPayload);
- verify(mockPayload).writeInt2(3);
- verify(mockPayload).writeInt4(23);
- verify(mockPayload, times(2)).writeInt4(18);
- DatabasePacket<?> actualRowDescriptionPacket = actualPacketsIterator.next();
- assertThat(actualRowDescriptionPacket, is(instanceOf(PostgreSQLRowDescriptionPacket.class)));
- assertRowDescriptions((PostgreSQLRowDescriptionPacket) actualRowDescriptionPacket);
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(2));
+ Iterator<DatabasePacket<?>> actualPacketsIterator = actualPackets.iterator();
+ PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
+ PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
+ actualParameterDescription.write(mockPayload);
+ verify(mockPayload).writeInt2(3);
+ verify(mockPayload).writeInt4(23);
+ verify(mockPayload, times(2)).writeInt4(18);
+ DatabasePacket<?> actualRowDescriptionPacket = actualPacketsIterator.next();
+ assertThat(actualRowDescriptionPacket, is(instanceOf(PostgreSQLRowDescriptionPacket.class)));
+ assertRowDescriptions((PostgreSQLRowDescriptionPacket) actualRowDescriptionPacket);
+ }
}
private void assertRowDescriptions(final PostgreSQLRowDescriptionPacket actualRowDescriptionPacket) {
@@ -342,33 +341,61 @@ public final class PostgreSQLComDescribeExecutorTest extends ProxyContextRestore
when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
prepareJDBCBackendConnection(sql);
List<PostgreSQLColumnType> parameterTypes = new ArrayList<>(Collections.singleton(PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED));
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
- Collection<DatabasePacket<?>> actual = executor.execute();
- assertThat(actual.size(), is(2));
- Iterator<DatabasePacket<?>> actualPacketsIterator = actual.iterator();
- PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
- assertThat(actualParameterDescription, instanceOf(PostgreSQLParameterDescriptionPacket.class));
- PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
- actualParameterDescription.write(mockPayload);
- verify(mockPayload).writeInt2(1);
- verify(mockPayload).writeInt4(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4.getValue());
- PostgreSQLRowDescriptionPacket actualRowDescription = (PostgreSQLRowDescriptionPacket) actualPacketsIterator.next();
- List<PostgreSQLColumnDescription> actualColumnDescriptions = getColumnDescriptions(actualRowDescription);
- List<PostgreSQLColumnDescription> expectedColumnDescriptions = Arrays.asList(
- new PostgreSQLColumnDescription("id", 1, Types.INTEGER, 11, "int4"),
- new PostgreSQLColumnDescription("k", 2, Types.INTEGER, 11, "int4"),
- new PostgreSQLColumnDescription("c", 3, Types.CHAR, 60, "int4"),
- new PostgreSQLColumnDescription("pad", 4, Types.CHAR, 120, "int4"));
- for (int i = 0; i < expectedColumnDescriptions.size(); i++) {
- PostgreSQLColumnDescription expectedColumnDescription = expectedColumnDescriptions.get(i);
- PostgreSQLColumnDescription actualColumnDescription = actualColumnDescriptions.get(i);
- assertThat(actualColumnDescription.getColumnName(), is(expectedColumnDescription.getColumnName()));
- assertThat(actualColumnDescription.getColumnIndex(), is(expectedColumnDescription.getColumnIndex()));
- assertThat(actualColumnDescription.getColumnLength(), is(expectedColumnDescription.getColumnLength()));
- assertThat(actualColumnDescription.getTypeOID(), is(expectedColumnDescription.getTypeOID()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME);
+ proxyContext.when(() -> ProxyContext.getInstance().getDatabase(DATABASE_NAME)).thenReturn(database);
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new PostgreSQLServerPreparedStatement(sql, sqlStatementContext, parameterTypes));
+ Collection<DatabasePacket<?>> actual = executor.execute();
+ assertThat(actual.size(), is(2));
+ Iterator<DatabasePacket<?>> actualPacketsIterator = actual.iterator();
+ PostgreSQLParameterDescriptionPacket actualParameterDescription = (PostgreSQLParameterDescriptionPacket) actualPacketsIterator.next();
+ assertThat(actualParameterDescription, instanceOf(PostgreSQLParameterDescriptionPacket.class));
+ PostgreSQLPacketPayload mockPayload = mock(PostgreSQLPacketPayload.class);
+ actualParameterDescription.write(mockPayload);
+ verify(mockPayload).writeInt2(1);
+ verify(mockPayload).writeInt4(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4.getValue());
+ PostgreSQLRowDescriptionPacket actualRowDescription = (PostgreSQLRowDescriptionPacket) actualPacketsIterator.next();
+ List<PostgreSQLColumnDescription> actualColumnDescriptions = getColumnDescriptions(actualRowDescription);
+ List<PostgreSQLColumnDescription> expectedColumnDescriptions = Arrays.asList(
+ new PostgreSQLColumnDescription("id", 1, Types.INTEGER, 11, "int4"),
+ new PostgreSQLColumnDescription("k", 2, Types.INTEGER, 11, "int4"),
+ new PostgreSQLColumnDescription("c", 3, Types.CHAR, 60, "int4"),
+ new PostgreSQLColumnDescription("pad", 4, Types.CHAR, 120, "int4"));
+ for (int i = 0; i < expectedColumnDescriptions.size(); i++) {
+ PostgreSQLColumnDescription expectedColumnDescription = expectedColumnDescriptions.get(i);
+ PostgreSQLColumnDescription actualColumnDescription = actualColumnDescriptions.get(i);
+ assertThat(actualColumnDescription.getColumnName(), is(expectedColumnDescription.getColumnName()));
+ assertThat(actualColumnDescription.getColumnIndex(), is(expectedColumnDescription.getColumnIndex()));
+ assertThat(actualColumnDescription.getColumnLength(), is(expectedColumnDescription.getColumnLength()));
+ assertThat(actualColumnDescription.getTypeOID(), is(expectedColumnDescription.getTypeOID()));
+ }
}
}
+ private ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().getProps().getValue(ConfigurationPropertyKey.SQL_SHOW)).thenReturn(false);
+ when(connectionSession.getDatabaseName()).thenReturn(DATABASE_NAME);
+ when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
+ ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Arrays.asList(new SQLTranslatorRule(new DefaultSQLTranslatorRuleConfigurationBuilder().build()),
+ new LoggingRule(new DefaultLoggingRuleConfigurationBuilder().build())));
+ when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
+ when(result.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap(DATABASE_NAME, mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS)));
+ Collection<ShardingSphereColumn> columnMetaData = Arrays.asList(
+ new ShardingSphereColumn("id", Types.INTEGER, true, false, false, true, false),
+ new ShardingSphereColumn("k", Types.INTEGER, true, false, false, true, false),
+ new ShardingSphereColumn("c", Types.CHAR, true, false, false, true, false),
+ new ShardingSphereColumn("pad", Types.CHAR, true, false, false, true, false));
+ ShardingSphereTable table = new ShardingSphereTable(TABLE_NAME, columnMetaData, Collections.emptyList(), Collections.emptyList());
+ when(result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getSchema("public").getTable(TABLE_NAME)).thenReturn(table);
+ when(result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
+ when(result.getMetaDataContexts().getMetaData().getDatabase(DATABASE_NAME).getResourceMetaData().getStorageTypes())
+ .thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
+ return result;
+ }
+
private void prepareJDBCBackendConnection(final String sql) throws SQLException {
BackendConnection backendConnection = mock(BackendConnection.class);
Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
diff --git a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
index 42f6858b6cc..33d421af973 100644
--- a/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
+++ b/proxy/frontend/type/postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutorTest.java
@@ -34,16 +34,15 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext;
import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
import org.apache.shardingsphere.proxy.backend.session.ServerPreparedStatementRegistry;
-import org.apache.shardingsphere.proxy.frontend.postgresql.ProxyContextRestorer;
import org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.PostgreSQLServerPreparedStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dml.PostgreSQLInsertStatement;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Answers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.MockitoJUnitRunner;
@@ -54,12 +53,13 @@ import java.util.Collections;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
-public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
-
- private final ShardingSphereRuleMetaData globalRuleMetaData = new ShardingSphereRuleMetaData(Collections.singleton(new SQLParserRule(new DefaultSQLParserRuleConfigurationBuilder().build())));
+public final class PostgreSQLComParseExecutorTest {
@Mock
private PostgreSQLComParsePacket parsePacket;
@@ -70,13 +70,10 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
@InjectMocks
private PostgreSQLComParseExecutor executor;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ContextManager mockedContextManager;
-
@Before
public void setup() {
- ProxyContext.init(mockedContextManager);
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
+ when(connectionSession.getDatabaseName()).thenReturn("db");
}
@Test
@@ -85,19 +82,18 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
final String statementId = "S_1";
when(parsePacket.getSql()).thenReturn(expectedSQL);
when(parsePacket.getStatementId()).thenReturn(statementId);
- when(connectionSession.getDatabaseName()).thenReturn("db");
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getStorageTypes())
- .thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
- when(mockedContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(1));
- assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
- PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
- assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(CommonSQLStatementContext.class));
- assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(EmptyStatement.class));
- assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
- assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(1));
+ assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
+ PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(CommonSQLStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(EmptyStatement.class));
+ assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
+ assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
+ }
}
@Test
@@ -108,21 +104,20 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
when(parsePacket.getSql()).thenReturn(rawSQL);
when(parsePacket.getStatementId()).thenReturn(statementId);
when(parsePacket.readParameterTypes()).thenReturn(Collections.singletonList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4));
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getStorageTypes())
- .thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
- when(mockedContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
when(connectionSession.getDefaultDatabaseName()).thenReturn("db");
- when(connectionSession.getDatabaseName()).thenReturn("db");
setConnectionSession();
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(1));
- assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
- PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
- assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(InsertStatementContext.class));
- assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(PostgreSQLInsertStatement.class));
- assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
- assertThat(actualPreparedStatement.getParameterTypes(), is(Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED)));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(1));
+ assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
+ PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(InsertStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(PostgreSQLInsertStatement.class));
+ assertThat(actualPreparedStatement.getSql(), is(expectedSQL));
+ assertThat(actualPreparedStatement.getParameterTypes(), is(Arrays.asList(PostgreSQLColumnType.POSTGRESQL_TYPE_INT4, PostgreSQLColumnType.POSTGRESQL_TYPE_UNSPECIFIED)));
+ }
}
@SneakyThrows(ReflectiveOperationException.class)
@@ -136,18 +131,26 @@ public final class PostgreSQLComParseExecutorTest extends ProxyContextRestorer {
String statementId = "";
when(parsePacket.getSql()).thenReturn(sql);
when(parsePacket.getStatementId()).thenReturn(statementId);
- when(connectionSession.getDatabaseName()).thenReturn("db");
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getStorageTypes())
- .thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
- when(mockedContextManager.getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
- when(mockedContextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
- Collection<DatabasePacket<?>> actualPackets = executor.execute();
- assertThat(actualPackets.size(), is(1));
- assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
- PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
- assertThat(actualPreparedStatement.getSql(), is(sql));
- assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(DistSQLStatementContext.class));
- assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(ShowDistVariableStatement.class));
- assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
+ ContextManager contextManager = mockContextManager();
+ try (MockedStatic<ProxyContext> proxyContext = mockStatic(ProxyContext.class, RETURNS_DEEP_STUBS)) {
+ proxyContext.when(() -> ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
+ Collection<DatabasePacket<?>> actualPackets = executor.execute();
+ assertThat(actualPackets.size(), is(1));
+ assertThat(actualPackets.iterator().next(), is(PostgreSQLParseCompletePacket.getInstance()));
+ PostgreSQLServerPreparedStatement actualPreparedStatement = connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(statementId);
+ assertThat(actualPreparedStatement.getSql(), is(sql));
+ assertThat(actualPreparedStatement.getSqlStatementContext(), instanceOf(DistSQLStatementContext.class));
+ assertThat(actualPreparedStatement.getSqlStatementContext().getSqlStatement(), instanceOf(ShowDistVariableStatement.class));
+ assertThat(actualPreparedStatement.getParameterTypes(), is(Collections.emptyList()));
+ }
+ }
+
+ private ContextManager mockContextManager() {
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts().getMetaData().getDatabase("db").getResourceMetaData().getStorageTypes()).thenReturn(Collections.singletonMap("ds_0", new PostgreSQLDatabaseType()));
+ when(result.getMetaDataContexts().getMetaData().getDatabase("db").getProtocolType()).thenReturn(new PostgreSQLDatabaseType());
+ when(result.getMetaDataContexts().getMetaData().getGlobalRuleMetaData())
+ .thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(new SQLParserRule(new DefaultSQLParserRuleConfigurationBuilder().build()))));
+ return result;
}
}