You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2022/05/24 07:16:04 UTC

[shardingsphere] branch master updated: Refactor SelectInformationExecutorTest (#17900)

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

menghaoran 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 8135aa2c25c Refactor SelectInformationExecutorTest (#17900)
8135aa2c25c is described below

commit 8135aa2c25cce8b08dd69e4cdd95ef45fc72b9a6
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue May 24 15:15:59 2022 +0800

    Refactor SelectInformationExecutorTest (#17900)
---
 .../information/SelectInformationExecutorTest.java | 181 +++++++++------------
 1 file changed, 80 insertions(+), 101 deletions(-)

diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
index 8f99eecc485..2b856df016b 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.information;
 
-import com.zaxxer.hikari.pool.HikariProxyResultSet;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
@@ -37,7 +36,6 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
 import org.apache.shardingsphere.proxy.backend.util.ProxyContextRestorer;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import org.apache.shardingsphere.test.mock.MockedDataSource;
 import org.junit.Before;
@@ -46,11 +44,8 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
-import javax.sql.DataSource;
-import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -70,8 +65,6 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public final class SelectInformationExecutorTest extends ProxyContextRestorer {
     
-    private static final ResultSet RESULT_SET = mock(HikariProxyResultSet.class);
-    
     private final ParserConfiguration parserConfig = new SQLParserRule(new DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
     
     @Mock
@@ -79,8 +72,6 @@ public final class SelectInformationExecutorTest extends ProxyContextRestorer {
     
     @Before
     public void setUp() throws IllegalAccessException, NoSuchFieldException, SQLException {
-        Field contextManagerField = ProxyContext.getInstance().getClass().getDeclaredField("contextManager");
-        contextManagerField.setAccessible(true);
         ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         MetaDataContexts metaDataContexts = new MetaDataContexts(
                 mock(MetaDataPersistService.class), new HashMap<>(), mock(ShardingSphereRuleMetaData.class), mock(OptimizerContext.class), new ConfigurationProperties(new Properties()));
@@ -89,62 +80,28 @@ public final class SelectInformationExecutorTest extends ProxyContextRestorer {
         when(connectionSession.getGrantee()).thenReturn(new Grantee("root", "127.0.0.1"));
     }
     
-    private void mockResultSet(final Map<String, String> mockMap) throws SQLException {
-        ResultSetMetaData metaData = mock(ResultSetMetaData.class);
-        List<String> keys = new ArrayList<>(mockMap.keySet());
-        for (int i = 0; i < keys.size(); i++) {
-            when(metaData.getColumnName(i + 1)).thenReturn(keys.get(i));
-            when(metaData.getColumnLabel(i + 1)).thenReturn(keys.get(i));
-            when(RESULT_SET.getString(i + 1)).thenReturn(mockMap.get(keys.get(i)));
-        }
-        when(RESULT_SET.next()).thenReturn(true, false);
-        when(metaData.getColumnCount()).thenReturn(mockMap.size());
-        when(RESULT_SET.getMetaData()).thenReturn(metaData);
-    }
-    
-    private ShardingSphereDatabase getDatabase() throws SQLException {
-        ShardingSphereRuleMetaData ruleMetaData = mock(ShardingSphereRuleMetaData.class);
-        when(ruleMetaData.getRules()).thenReturn(Collections.singletonList(mock(AuthorityRule.class, RETURNS_DEEP_STUBS)));
-        return new ShardingSphereDatabase("sharding_db", new MySQLDatabaseType(), new ShardingSphereResource(mockDatasourceMap()), ruleMetaData, Collections.emptyMap());
-    }
-    
-    private ShardingSphereDatabase getEmptyDatabase(final String schemaName) {
-        ShardingSphereRuleMetaData ruleMetaData = mock(ShardingSphereRuleMetaData.class);
-        when(ruleMetaData.getRules()).thenReturn(Collections.singletonList(mock(AuthorityRule.class, RETURNS_DEEP_STUBS)));
-        return new ShardingSphereDatabase(schemaName, new MySQLDatabaseType(), new ShardingSphereResource(Collections.emptyMap()), ruleMetaData, Collections.emptyMap());
-    }
-    
-    private Map<String, DataSource> mockDatasourceMap() throws SQLException {
-        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
-        when(connection.getMetaData().getURL()).thenReturn("jdbc:mysql://localhost:3306/foo_ds");
-        when(connection.prepareStatement(any(String.class)).executeQuery()).thenReturn(RESULT_SET);
-        return Collections.singletonMap("ds_0", new MockedDataSource(connection));
-    }
-    
     @Test
     public void assertSelectSchemataExecute() throws SQLException {
-        final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
-        Map<String, String> mockResultSetMap = new HashMap<>();
-        mockResultSetMap.put("SCHEMA_NAME", "foo_ds");
-        mockResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4_0900_ai_ci");
-        mockResultSetMap.put("DEFAULT_COLLATION_NAME", "utf8mb4");
-        mockResultSet(mockResultSetMap);
+        Map<String, String> expectedResultSetMap = new HashMap<>();
+        expectedResultSetMap.put("SCHEMA_NAME", "foo_ds");
+        expectedResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4_0900_ai_ci");
+        expectedResultSetMap.put("DEFAULT_COLLATION_NAME", "utf8mb4");
         Map<String, ShardingSphereDatabase> databaseMap = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getDatabaseMap();
-        databaseMap.put("sharding_db", getDatabase());
-        databaseMap.put("test", getEmptyDatabase("test"));
-        SelectInformationSchemataExecutor selectSchemataExecutor = new SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
-        selectSchemataExecutor.execute(connectionSession);
-        assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), is(mockResultSetMap.size()));
+        databaseMap.put("sharding_db", createDatabase(expectedResultSetMap));
+        databaseMap.put("test", createEmptyDatabase("test"));
+        String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA";
+        SelectInformationSchemataExecutor executor = new SelectInformationSchemataExecutor((SelectStatement) new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        executor.execute(connectionSession);
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(expectedResultSetMap.size()));
         int count = 0;
-        while (selectSchemataExecutor.getMergedResult().next()) {
+        while (executor.getMergedResult().next()) {
             count++;
-            if ("sharding_db".equals(selectSchemataExecutor.getMergedResult().getValue(1, String.class))) {
-                assertThat(selectSchemataExecutor.getMergedResult().getValue(2, String.class), is("utf8mb4"));
-                assertThat(selectSchemataExecutor.getMergedResult().getValue(3, String.class), is("utf8mb4_0900_ai_ci"));
-            } else if ("test".equals(selectSchemataExecutor.getMergedResult().getValue(1, String.class))) {
-                assertThat(selectSchemataExecutor.getMergedResult().getValue(2, String.class), is(""));
-                assertThat(selectSchemataExecutor.getMergedResult().getValue(3, String.class), is(""));
+            if ("sharding_db".equals(executor.getMergedResult().getValue(1, String.class))) {
+                assertThat(executor.getMergedResult().getValue(2, String.class), is("utf8mb4"));
+                assertThat(executor.getMergedResult().getValue(3, String.class), is("utf8mb4_0900_ai_ci"));
+            } else if ("test".equals(executor.getMergedResult().getValue(1, String.class))) {
+                assertThat(executor.getMergedResult().getValue(2, String.class), is(""));
+                assertThat(executor.getMergedResult().getValue(3, String.class), is(""));
             } else {
                 fail("expected : `sharding_db` or `test`");
             }
@@ -154,63 +111,85 @@ public final class SelectInformationExecutorTest extends ProxyContextRestorer {
     
     @Test
     public void assertSelectSchemataInSchemaWithoutDataSourceExecute() throws SQLException {
-        final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
-        Map<String, String> mockResultSetMap = new HashMap<>(4, 1);
-        mockResultSetMap.put("SCHEMA_NAME", "foo_ds");
-        mockResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4_0900_ai_ci");
-        mockResultSetMap.put("DEFAULT_COLLATION_NAME", "utf8mb4");
-        mockResultSetMap.put("DEFAULT_ENCRYPTION", "NO");
-        mockResultSet(mockResultSetMap);
         Map<String, ShardingSphereDatabase> databaseMap = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getDatabaseMap();
-        databaseMap.put("sharding_db", getEmptyDatabase("sharding_db"));
-        SelectInformationSchemataExecutor selectSchemataExecutor = new SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
-        selectSchemataExecutor.execute(connectionSession);
-        assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), is(mockResultSetMap.size()));
-        while (selectSchemataExecutor.getMergedResult().next()) {
-            assertThat(selectSchemataExecutor.getMergedResult().getValue(1, String.class), is("sharding_db"));
-            assertThat(selectSchemataExecutor.getMergedResult().getValue(2, String.class), is(""));
-            assertThat(selectSchemataExecutor.getMergedResult().getValue(3, String.class), is(""));
-            assertThat(selectSchemataExecutor.getMergedResult().getValue(4, String.class), is(""));
+        databaseMap.put("empty_db", createEmptyDatabase("empty_db"));
+        String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
+        SelectInformationSchemataExecutor executor = new SelectInformationSchemataExecutor((SelectStatement) new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        executor.execute(connectionSession);
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(4));
+        while (executor.getMergedResult().next()) {
+            assertThat(executor.getMergedResult().getValue(1, String.class), is("empty_db"));
+            assertThat(executor.getMergedResult().getValue(2, String.class), is(""));
+            assertThat(executor.getMergedResult().getValue(3, String.class), is(""));
+            assertThat(executor.getMergedResult().getValue(4, String.class), is(""));
         }
     }
     
     @Test
     public void assertSelectSchemataInNoSchemaExecute() throws SQLException {
-        final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
-        SelectInformationSchemataExecutor selectSchemataExecutor = new SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
-        selectSchemataExecutor.execute(connectionSession);
-        assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), is(0));
+        String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
+        SelectInformationSchemataExecutor executor = new SelectInformationSchemataExecutor((SelectStatement) new ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        executor.execute(connectionSession);
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(0));
     }
     
     @Test
     public void assertSelectSchemaAliasExecute() throws SQLException {
-        final String sql = "SELECT SCHEMA_NAME AS sn, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA";
-        Map<String, String> mockResultSetMap = new HashMap<>();
-        mockResultSetMap.put("sn", "foo_ds");
-        mockResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4");
-        mockResultSet(mockResultSetMap);
+        Map<String, String> expectedResultSetMap = new HashMap<>();
+        expectedResultSetMap.put("sn", "foo_ds");
+        expectedResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4");
         Map<String, ShardingSphereDatabase> databaseMap = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getDatabaseMap();
-        databaseMap.put("foo_ds", getDatabase());
-        databaseMap.put("test", getEmptyDatabase("test"));
-        DefaultDatabaseMetadataExecutor selectExecutor = new DefaultDatabaseMetadataExecutor(sql);
-        selectExecutor.execute(connectionSession);
-        assertThat(selectExecutor.getRows().get(0).get("sn"), is("foo_ds"));
-        assertThat(selectExecutor.getRows().get(0).get("DEFAULT_CHARACTER_SET_NAME"), is("utf8mb4"));
+        databaseMap.put("foo_ds", createDatabase(expectedResultSetMap));
+        databaseMap.put("empty_db", createEmptyDatabase("empty_db"));
+        String sql = "SELECT SCHEMA_NAME AS sn, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA";
+        DefaultDatabaseMetadataExecutor executor = new DefaultDatabaseMetadataExecutor(sql);
+        executor.execute(connectionSession);
+        assertThat(executor.getRows().get(0).get("sn"), is("foo_ds"));
+        assertThat(executor.getRows().get(0).get("DEFAULT_CHARACTER_SET_NAME"), is("utf8mb4"));
     }
     
     @Test
     public void assertDefaultExecute() throws SQLException {
-        final String sql = "SELECT COUNT(*) AS support_ndb FROM information_schema.ENGINES WHERE Engine = 'ndbcluster'";
-        mockResultSet(Collections.singletonMap("support_ndb", "0"));
         Map<String, ShardingSphereDatabase> databaseMap = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getDatabaseMap();
-        databaseMap.put("sharding_db", getDatabase());
-        DefaultDatabaseMetadataExecutor defaultSelectMetaDataExecutor = new DefaultDatabaseMetadataExecutor(sql);
-        defaultSelectMetaDataExecutor.execute(connectionSession);
-        assertThat(defaultSelectMetaDataExecutor.getQueryResultMetaData().getColumnCount(), is(1));
-        while (defaultSelectMetaDataExecutor.getMergedResult().next()) {
-            assertThat(defaultSelectMetaDataExecutor.getMergedResult().getValue(1, String.class), is("0"));
+        databaseMap.put("sharding_db", createDatabase(Collections.singletonMap("support_ndb", "0")));
+        String sql = "SELECT COUNT(*) AS support_ndb FROM information_schema.ENGINES WHERE Engine = 'ndbcluster'";
+        DefaultDatabaseMetadataExecutor executor = new DefaultDatabaseMetadataExecutor(sql);
+        executor.execute(connectionSession);
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
+        while (executor.getMergedResult().next()) {
+            assertThat(executor.getMergedResult().getValue(1, String.class), is("0"));
+        }
+    }
+    
+    private ShardingSphereDatabase createDatabase(final Map<String, String> expectedResultSetMap) throws SQLException {
+        return new ShardingSphereDatabase("sharding_db", new MySQLDatabaseType(), new ShardingSphereResource(
+                Collections.singletonMap("foo_ds", new MockedDataSource(mockConnection(expectedResultSetMap)))), mock(ShardingSphereRuleMetaData.class), Collections.emptyMap());
+    }
+    
+    private ShardingSphereDatabase createEmptyDatabase(final String schemaName) {
+        ShardingSphereRuleMetaData ruleMetaData = mock(ShardingSphereRuleMetaData.class);
+        when(ruleMetaData.getRules()).thenReturn(Collections.singleton(mock(AuthorityRule.class, RETURNS_DEEP_STUBS)));
+        return new ShardingSphereDatabase(schemaName, new MySQLDatabaseType(), new ShardingSphereResource(Collections.emptyMap()), ruleMetaData, Collections.emptyMap());
+    }
+    
+    private Connection mockConnection(final Map<String, String> expectedResultSetMap) throws SQLException {
+        Connection result = mock(Connection.class, RETURNS_DEEP_STUBS);
+        when(result.getMetaData().getURL()).thenReturn("jdbc:mysql://localhost:3306/foo_ds");
+        ResultSet resultSet = mockResultSet(expectedResultSetMap);
+        when(result.prepareStatement(any(String.class)).executeQuery()).thenReturn(resultSet);
+        return result;
+    }
+    
+    private ResultSet mockResultSet(final Map<String, String> expectedResultSetMap) throws SQLException {
+        ResultSet result = mock(ResultSet.class, RETURNS_DEEP_STUBS);
+        List<String> keys = new ArrayList<>(expectedResultSetMap.keySet());
+        for (int i = 0; i < keys.size(); i++) {
+            when(result.getMetaData().getColumnName(i + 1)).thenReturn(keys.get(i));
+            when(result.getMetaData().getColumnLabel(i + 1)).thenReturn(keys.get(i));
+            when(result.getString(i + 1)).thenReturn(expectedResultSetMap.get(keys.get(i)));
         }
+        when(result.next()).thenReturn(true, false);
+        when(result.getMetaData().getColumnCount()).thenReturn(expectedResultSetMap.size());
+        return result;
     }
 }