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 2026/03/15 13:24:54 UTC

(shardingsphere) branch master updated: Add more test cases on SystemSchemaUtilsTest (#38448)

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 a3f94678f09 Add more test cases on SystemSchemaUtilsTest (#38448)
a3f94678f09 is described below

commit a3f94678f0931b2a39a5cd6fc29aa7df6e1ad8ce
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Mar 15 21:24:47 2026 +0800

    Add more test cases on SystemSchemaUtilsTest (#38448)
    
    * Add more test cases on SystemSchemaUtilsTest
    
    * Add more test cases on SystemSchemaUtilsTest
---
 .../schema/util/SystemSchemaUtilsTest.java         | 146 +++++++++------------
 1 file changed, 59 insertions(+), 87 deletions(-)

diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilsTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilsTest.java
index e5e1e7d3d86..e16f556985b 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilsTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SystemSchemaUtilsTest.java
@@ -22,117 +22,89 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.stream.Stream;
 
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 class SystemSchemaUtilsTest {
     
-    @Test
-    void assertContainsSystemSchemaForMySQL() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL");
-        ShardingSphereDatabase informationSchemaDatabase = mockDatabase("information_schema", false);
-        assertTrue(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "mysql"), informationSchemaDatabase));
-        ShardingSphereDatabase shardingSchemaDatabase = mockDatabase("sharding_db", false);
-        assertFalse(SystemSchemaUtils.containsSystemSchema(databaseType, Collections.singletonList("sharding_db"), shardingSchemaDatabase));
-        ShardingSphereDatabase customizedInformationSchemaDatabase = mockDatabase("information_schema", true);
-        assertFalse(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "mysql"), customizedInformationSchemaDatabase));
-    }
-    
-    @Test
-    void assertContainsSystemSchemaForPostgreSQL() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
-        ShardingSphereDatabase informationSchemaDatabase = mockDatabase("information_schema", false);
-        assertTrue(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "pg_catalog"), informationSchemaDatabase));
-        ShardingSphereDatabase shardingSchemaDatabase = mockDatabase("sharding_db", false);
-        assertFalse(SystemSchemaUtils.containsSystemSchema(databaseType, Collections.singletonList("sharding_db"), shardingSchemaDatabase));
-        ShardingSphereDatabase customizedInformationSchemaDatabase = mockDatabase("information_schema", true);
-        assertTrue(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "pg_catalog"), customizedInformationSchemaDatabase));
-    }
+    private static final DatabaseType MYSQL_DATABASE_TYPE = TypedSPILoader.getService(DatabaseType.class, "MySQL");
     
-    @Test
-    void assertContainsSystemSchemaForOpenGaussSQL() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "openGauss");
-        ShardingSphereDatabase informationSchemaDatabase = mockDatabase("information_schema", false);
-        assertTrue(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "pg_catalog"), informationSchemaDatabase));
-        ShardingSphereDatabase shardingSchemaDatabase = mockDatabase("sharding_db", false);
-        assertFalse(SystemSchemaUtils.containsSystemSchema(databaseType, Collections.singletonList("sharding_db"), shardingSchemaDatabase));
-        ShardingSphereDatabase customizedInformationSchemaDatabase = mockDatabase("information_schema", true);
-        assertTrue(SystemSchemaUtils.containsSystemSchema(databaseType, Arrays.asList("information_schema", "pg_catalog"), customizedInformationSchemaDatabase));
-        ShardingSphereDatabase customizedGaussDBDatabase = mockDatabase("gaussdb", true);
-        assertFalse(SystemSchemaUtils.containsSystemSchema(databaseType, Collections.emptyList(), customizedGaussDBDatabase));
-    }
+    private static final DatabaseType POSTGRESQL_DATABASE_TYPE = TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
     
-    @Test
-    void assertIsSystemSchemaWithUnCompleteDatabase() {
-        ShardingSphereDatabase informationSchemaDatabase = mockDatabase("information_schema", false);
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL");
-        when(informationSchemaDatabase.getProtocolType()).thenReturn(databaseType);
-        assertTrue(SystemSchemaUtils.isSystemSchema(informationSchemaDatabase));
-    }
+    private static final DatabaseType OPEN_GAUSS_DATABASE_TYPE = TypedSPILoader.getService(DatabaseType.class, "openGauss");
     
-    @Test
-    void assertIsSystemSchemaWithCompleteDatabaseAndDefaultSchema() {
-        ShardingSphereDatabase pgCatalogDatabase = mockDatabase("pg_catalog", true);
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
-        when(pgCatalogDatabase.getProtocolType()).thenReturn(databaseType);
-        assertTrue(SystemSchemaUtils.isSystemSchema(pgCatalogDatabase));
-    }
+    private static final DatabaseType FIXTURE_DATABASE_TYPE = TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
-    @Test
-    void assertIsSystemSchemaWithEmptyDatabase() {
-        ShardingSphereDatabase userDatabase = mockDatabase("foo_db", true);
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
-        when(userDatabase.getProtocolType()).thenReturn(databaseType);
-        assertFalse(SystemSchemaUtils.isSystemSchema(userDatabase));
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("containsSystemSchemaArguments")
+    void assertContainsSystemSchema(final String name, final DatabaseType databaseType, final Collection<String> schemaNames,
+                                    final String databaseName, final boolean complete, final boolean expectedContainsSystemSchema) {
+        assertThat(SystemSchemaUtils.containsSystemSchema(databaseType, schemaNames, mockDatabase(databaseName, complete, databaseType)), is(expectedContainsSystemSchema));
     }
     
-    @Test
-    void assertIsSystemSchemaWithoutDefaultSchema() {
-        ShardingSphereDatabase userDatabase = mockDatabase("foo_db", false);
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
-        when(userDatabase.getProtocolType()).thenReturn(databaseType);
-        assertFalse(SystemSchemaUtils.isSystemSchema(userDatabase));
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("isSystemSchemaArguments")
+    void assertIsSystemSchema(final String name, final DatabaseType databaseType, final String databaseName, final boolean complete, final boolean expectedSystemSchema) {
+        assertThat(SystemSchemaUtils.isSystemSchema(mockDatabase(databaseName, complete, databaseType)), is(expectedSystemSchema));
     }
     
-    @Test
-    void assertIsDriverQuerySystemCatalogWithoutOption() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL");
-        ExpressionProjectionSegment projection = new ExpressionProjectionSegment(0, 10, "version()");
-        assertFalse(SystemSchemaUtils.isDriverQuerySystemCatalog(databaseType, Collections.singleton(projection)));
+    private ShardingSphereDatabase mockDatabase(final String databaseName, final boolean complete, final DatabaseType databaseType) {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+        when(result.getName()).thenReturn(databaseName);
+        when(result.isComplete()).thenReturn(complete);
+        when(result.getProtocolType()).thenReturn(databaseType);
+        return result;
     }
     
-    @Test
-    void assertIsDriverQuerySystemCatalogWithMultipleProjections() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "openGauss");
-        ExpressionProjectionSegment projection1 = new ExpressionProjectionSegment(0, 10, "version()");
-        ExpressionProjectionSegment projection2 = new ExpressionProjectionSegment(11, 20, "current_database()");
-        assertFalse(SystemSchemaUtils.isDriverQuerySystemCatalog(databaseType, Arrays.asList(projection1, projection2)));
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("isDriverQuerySystemCatalogArguments")
+    void assertIsDriverQuerySystemCatalog(final String name, final DatabaseType databaseType, final Collection<ProjectionSegment> projections, final boolean expectedDriverQuerySystemCatalog) {
+        assertThat(SystemSchemaUtils.isDriverQuerySystemCatalog(databaseType, projections), is(expectedDriverQuerySystemCatalog));
     }
     
-    @Test
-    void assertIsDriverQuerySystemCatalogWithNonExpressionProjection() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "openGauss");
-        assertFalse(SystemSchemaUtils.isDriverQuerySystemCatalog(databaseType, Collections.singleton(mock(ProjectionSegment.class))));
+    private static Stream<Arguments> containsSystemSchemaArguments() {
+        return Stream.of(
+                Arguments.of("returns true when input schema names contain a MySQL system schema", MYSQL_DATABASE_TYPE,
+                        Arrays.asList("information_schema", "mysql"), "information_schema", false, true),
+                Arguments.of("returns false immediately for a complete MySQL database without default schema", MYSQL_DATABASE_TYPE,
+                        Collections.emptyList(), "information_schema", true, false),
+                Arguments.of("returns true when incomplete MySQL database name is a system schema", MYSQL_DATABASE_TYPE,
+                        Collections.emptyList(), "information_schema", false, true),
+                Arguments.of("returns false when schema names do not contain a MySQL system schema", MYSQL_DATABASE_TYPE,
+                        Collections.singletonList("sharding_db"), "sharding_db", false, false),
+                Arguments.of("returns false when PostgreSQL falls back to database name with default schema", POSTGRESQL_DATABASE_TYPE,
+                        Collections.emptyList(), "pg_catalog", true, false));
     }
     
-    @Test
-    void assertIsDriverQuerySystemCatalogWithValidExpression() {
-        DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "openGauss");
-        ExpressionProjectionSegment projection = new ExpressionProjectionSegment(0, 10, "version()");
-        assertTrue(SystemSchemaUtils.isDriverQuerySystemCatalog(databaseType, Collections.singleton(projection)));
+    private static Stream<Arguments> isSystemSchemaArguments() {
+        return Stream.of(
+                Arguments.of("returns true for an incomplete MySQL system database", MYSQL_DATABASE_TYPE, "information_schema", false, true),
+                Arguments.of("returns true for a complete PostgreSQL system schema", POSTGRESQL_DATABASE_TYPE, "pg_catalog", true, true),
+                Arguments.of("returns false for a complete MySQL database without default schema", MYSQL_DATABASE_TYPE, "information_schema", true, false),
+                Arguments.of("returns false for a non-system fixture database", FIXTURE_DATABASE_TYPE, "foo_db", false, false));
     }
     
-    private ShardingSphereDatabase mockDatabase(final String databaseName, final boolean isComplete) {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
-        when(result.getName()).thenReturn(databaseName);
-        when(result.isComplete()).thenReturn(isComplete);
-        return result;
+    private static Stream<Arguments> isDriverQuerySystemCatalogArguments() {
+        return Stream.of(
+                Arguments.of("returns false when multiple projections are present", OPEN_GAUSS_DATABASE_TYPE,
+                        Arrays.asList(new ExpressionProjectionSegment(0, "version()".length(), "version()"), new ExpressionProjectionSegment(0, "current_database()".length(), "current_database()")),
+                        false),
+                Arguments.of("returns false when the only projection is not an expression", OPEN_GAUSS_DATABASE_TYPE,
+                        Collections.singletonList(mock(ProjectionSegment.class)), false),
+                Arguments.of("returns false when the database type does not define system catalog expressions", MYSQL_DATABASE_TYPE,
+                        Collections.singletonList(new ExpressionProjectionSegment(0, "version()".length(), "version()")), false),
+                Arguments.of("returns true when openGauss projection matches a system catalog expression", OPEN_GAUSS_DATABASE_TYPE,
+                        Collections.singletonList(new ExpressionProjectionSegment(0, "version()".length(), "version()")), true));
     }
 }