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 2cd866fef00 Add more test cases on DatabaseMetaDataPersistFacadeTest
(#37218)
2cd866fef00 is described below
commit 2cd866fef00b2f6df143be873e3cfc81aaa0ae39
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Nov 29 17:11:48 2025 +0800
Add more test cases on DatabaseMetaDataPersistFacadeTest (#37218)
---
.../DatabaseMetaDataPersistFacadeTest.java | 184 ++++++++++++++++++---
1 file changed, 165 insertions(+), 19 deletions(-)
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
index 939087c0ecb..0bc65472acf 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
@@ -17,34 +17,68 @@
package org.apache.shardingsphere.mode.metadata.persist.metadata;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
+import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import
org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
+import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
import
org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import
org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.mode.metadata.persist.metadata.service.SchemaMetaDataPersistService;
+import
org.apache.shardingsphere.mode.metadata.persist.metadata.service.TableMetaDataPersistDisabledService;
+import
org.apache.shardingsphere.mode.metadata.persist.metadata.service.TableMetaDataPersistEnabledService;
+import
org.apache.shardingsphere.mode.metadata.persist.metadata.service.ViewMetaDataPersistService;
+import
org.apache.shardingsphere.mode.metadata.persist.version.VersionPersistService;
import
org.apache.shardingsphere.mode.persist.service.TableMetaDataPersistService;
+import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
import
org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
import
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockSettings;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
+import org.mockito.MockedStatic;
import org.mockito.internal.configuration.plugins.Plugins;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.isA;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyCollection;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings({DataSourcePoolPropertiesCreator.class,
GenericSchemaManager.class})
+@StaticMockSettings({DataSourcePoolPropertiesCreator.class,
GenericSchemaManager.class, GenericSchemaBuilder.class})
class DatabaseMetaDataPersistFacadeTest {
- private DatabaseMetaDataPersistFacade databaseMetaDataFacade;
+ private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
@Mock
private SchemaMetaDataPersistService schemaMetaDataService;
@@ -52,34 +86,146 @@ class DatabaseMetaDataPersistFacadeTest {
@Mock
private TableMetaDataPersistService tableMetaDataService;
+ @Mock
+ private ViewMetaDataPersistService viewMetaDataService;
+
+ @Mock
+ private PersistRepository repository;
+
+ @Mock
+ private VersionPersistService versionPersistService;
+
+ private DatabaseMetaDataPersistFacade databaseMetaDataFacade;
+
@BeforeEach
void setUp() throws ReflectiveOperationException {
- databaseMetaDataFacade = new DatabaseMetaDataPersistFacade(mock(),
mock(), true);
- setField("schema", schemaMetaDataService);
- setField("table", tableMetaDataService);
+ databaseMetaDataFacade = new DatabaseMetaDataPersistFacade(repository,
versionPersistService, true);
+
Plugins.getMemberAccessor().set(DatabaseMetaDataPersistFacade.class.getDeclaredField("schema"),
databaseMetaDataFacade, schemaMetaDataService);
+
Plugins.getMemberAccessor().set(DatabaseMetaDataPersistFacade.class.getDeclaredField("table"),
databaseMetaDataFacade, tableMetaDataService);
+
Plugins.getMemberAccessor().set(DatabaseMetaDataPersistFacade.class.getDeclaredField("view"),
databaseMetaDataFacade, viewMetaDataService);
}
- private void setField(final String name, final Object value) throws
ReflectiveOperationException {
-
Plugins.getMemberAccessor().set(DatabaseMetaDataPersistFacade.class.getDeclaredField(name),
databaseMetaDataFacade, value);
+ @Test
+ void assertConstructorChoosesTablePersistService() {
+ DatabaseMetaDataPersistFacade enabledFacade = new
DatabaseMetaDataPersistFacade(repository, versionPersistService, true);
+ DatabaseMetaDataPersistFacade disabledFacade = new
DatabaseMetaDataPersistFacade(repository, versionPersistService, false);
+ assertThat(enabledFacade.getTable(),
isA(TableMetaDataPersistEnabledService.class));
+ assertThat(disabledFacade.getTable(),
isA(TableMetaDataPersistDisabledService.class));
}
@Test
void assertPersistReloadDatabase() {
- ShardingSphereSchema toBeDeletedSchema = new
ShardingSphereSchema("to_be_deleted");
- ShardingSphereSchema toBeAddedSchema = new
ShardingSphereSchema("to_be_added");
-
when(GenericSchemaManager.getToBeAlteredSchemasWithTablesDropped(any(),
any())).thenReturn(Collections.singleton(toBeDeletedSchema));
- when(GenericSchemaManager.getToBeAlteredSchemasWithTablesAdded(any(),
any())).thenReturn(Collections.singleton(toBeAddedSchema));
+
when(GenericSchemaManager.getToBeAlteredSchemasWithTablesDropped(any(),
any())).thenReturn(Collections.singleton(new
ShardingSphereSchema("Foo_Dropped")));
+ when(GenericSchemaManager.getToBeAlteredSchemasWithTablesAdded(any(),
any())).thenReturn(Collections.singleton(new
ShardingSphereSchema("Foo_Added")));
databaseMetaDataFacade.persistReloadDatabase("foo_db",
mock(ShardingSphereDatabase.class), mock(ShardingSphereDatabase.class));
- verify(tableMetaDataService).drop(eq("foo_db"), eq("to_be_deleted"),
anyCollection());
+ verify(tableMetaDataService).persist(eq("foo_db"), eq("foo_added"),
anyCollection());
+ verify(tableMetaDataService).drop(eq("foo_db"), eq("foo_dropped"),
anyCollection());
}
@Test
- void assertPersistReloadDatabaseByDrop() {
- ShardingSphereSchema toBeDeletedSchema = new
ShardingSphereSchema("to_be_deleted");
- ShardingSphereSchema toBeAlterSchema = new
ShardingSphereSchema("to_be_altered");
-
when(GenericSchemaManager.getToBeAlteredSchemasWithTablesDropped(any(),
any())).thenReturn(Collections.singleton(toBeDeletedSchema));
- when(GenericSchemaManager.getToBeAlteredSchemasWithTablesAdded(any(),
any())).thenReturn(Collections.singleton(toBeAlterSchema));
- databaseMetaDataFacade.persistReloadDatabase("foo_db",
mock(ShardingSphereDatabase.class), mock(ShardingSphereDatabase.class));
- verify(tableMetaDataService).drop(eq("foo_db"), eq("to_be_deleted"),
anyCollection());
+ void assertRenameSchemaWithEmptySchema() {
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(new ShardingSphereSchema("foo_schema")));
+ databaseMetaDataFacade.renameSchema(createMetaData(database),
database, "foo_schema", "bar_schema");
+ verify(schemaMetaDataService).add("foo_db", "bar_schema");
+ verify(schemaMetaDataService).drop("foo_db", "foo_schema");
+ }
+
+ @Test
+ void assertRenameSchemaWhenSchemaNotEmpty() {
+ ShardingSphereTable table = new ShardingSphereTable("foo_table",
+ Collections.singleton(new ShardingSphereColumn("foo_column",
0, false, false, false, true, false, true)),
+ Collections.emptyList(), Collections.emptyList());
+ ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
Collections.singleton(table), Collections.singleton(new
ShardingSphereView("foo_view", "select 1")));
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(schema));
+ databaseMetaDataFacade.renameSchema(createMetaData(database),
database, "foo_schema", "bar_schema");
+ verify(tableMetaDataService).persist("foo_db", "bar_schema",
schema.getAllTables());
+ verify(viewMetaDataService).persist("foo_db", "bar_schema",
schema.getAllViews());
+ verify(schemaMetaDataService).drop("foo_db", "foo_schema");
+ verify(schemaMetaDataService, never()).add(anyString(), anyString());
+ }
+
+ @Test
+ void assertUnregisterStorageUnitsDropsTables() throws SQLException {
+ DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
+ when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new
DefaultSchemaOption(false, null));
+ try (MockedStatic<DatabaseTypedSPILoader> mocked =
mockStatic(DatabaseTypedSPILoader.class)) {
+ mocked.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
+ ShardingSphereSchema schema = new
ShardingSphereSchema("foo_schema");
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(schema));
+ ShardingSphereTable toBeDroppedTable = new
ShardingSphereTable("foo_table", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
+ when(GenericSchemaBuilder.build(eq(databaseType),
any(GenericSchemaBuilderMaterial.class))).thenReturn(Collections.singletonMap("foo_schema",
schema));
+ when(GenericSchemaManager.getToBeDroppedTables(schema,
schema)).thenReturn(Collections.singleton(toBeDroppedTable));
+ databaseMetaDataFacade.unregisterStorageUnits("foo_db", new
MetaDataContexts(createMetaData(database), mock()));
+ verify(tableMetaDataService).drop("foo_db", "foo_schema",
"foo_table");
+ }
+ }
+
+ @Test
+ void assertUnregisterStorageUnitsWhenLoadFailed() throws SQLException {
+ DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
+ when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new
DefaultSchemaOption(false, null));
+ try (MockedStatic<DatabaseTypedSPILoader> mocked =
mockStatic(DatabaseTypedSPILoader.class)) {
+ mocked.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(new ShardingSphereSchema("foo_schema")));
+ MetaDataContexts reloadMetaDataContexts = new
MetaDataContexts(createMetaData(database), mock());
+ when(GenericSchemaBuilder.build(eq(databaseType),
any(GenericSchemaBuilderMaterial.class))).thenThrow(SQLException.class);
+ assertThrows(LoadTableMetaDataFailedException.class, () ->
databaseMetaDataFacade.unregisterStorageUnits("foo_db",
reloadMetaDataContexts));
+ }
+ }
+
+ @Test
+ void assertPersistAlteredTables() throws SQLException {
+ DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
+ when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new
DefaultSchemaOption(false, null));
+ try (MockedStatic<DatabaseTypedSPILoader> mocked =
mockStatic(DatabaseTypedSPILoader.class)) {
+ mocked.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
+ ShardingSphereSchema existedSchema = new
ShardingSphereSchema("foo_schema");
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(existedSchema));
+ MetaDataContexts reloadMetaDataContexts = new
MetaDataContexts(createMetaData(database), mock());
+ ShardingSphereSchema schema = new
ShardingSphereSchema("foo_schema");
+ ShardingSphereTable addedTable = new
ShardingSphereTable("foo_table", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
+ Collection<ShardingSphereTable> expectedTables =
Collections.singletonList(addedTable);
+ Collection<String> needReloadTables =
Collections.singleton("foo_table");
+ Map<String, ShardingSphereSchema> schemas =
Collections.singletonMap("foo_schema", schema);
+ when(GenericSchemaBuilder.build(eq(needReloadTables),
eq(databaseType), any(GenericSchemaBuilderMaterial.class))).thenReturn(schemas);
+ when(GenericSchemaManager.getToBeAddedTables(schema,
existedSchema)).thenReturn(expectedTables);
+ Map<String, Collection<ShardingSphereTable>> actualTables =
databaseMetaDataFacade.persistAlteredTables("foo_db", reloadMetaDataContexts,
needReloadTables);
+ assertThat(actualTables.get("foo_schema"), is(expectedTables));
+ verify(tableMetaDataService).persist("foo_db", "foo_schema",
expectedTables);
+ }
+ }
+
+ @Test
+ void assertPersistAlteredTablesWhenLoadFailed() throws SQLException {
+ DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
+ when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new
DefaultSchemaOption(false, null));
+ try (MockedStatic<DatabaseTypedSPILoader> mocked =
mockStatic(DatabaseTypedSPILoader.class)) {
+ mocked.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
+ ShardingSphereDatabase database = createDatabase("foo_db",
Collections.singleton(new ShardingSphereSchema("foo_schema")));
+ MetaDataContexts reloadMetaDataContexts = new
MetaDataContexts(createMetaData(database), mock());
+ Collection<String> needReloadTables =
Collections.singleton("foo_table");
+ when(GenericSchemaBuilder.build(eq(needReloadTables),
eq(databaseType),
any(GenericSchemaBuilderMaterial.class))).thenThrow(SQLException.class);
+ assertThrows(LoadTableMetaDataFailedException.class, () ->
databaseMetaDataFacade.persistAlteredTables("foo_db", reloadMetaDataContexts,
needReloadTables));
+ }
+ }
+
+ @Test
+ void assertPersistCreatedDatabaseSchemas() {
+ ShardingSphereSchema emptySchema = new
ShardingSphereSchema("foo_empty");
+ ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
+ Collections.singleton(new ShardingSphereTable("foo_table",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList())),
Collections.emptyList());
+
databaseMetaDataFacade.persistCreatedDatabaseSchemas(createDatabase("foo_db",
Arrays.asList(emptySchema, schema)));
+ verify(schemaMetaDataService).add("foo_db", "foo_empty");
+ verify(tableMetaDataService).persist("foo_db", "foo_schema",
schema.getAllTables());
+ }
+
+ private ShardingSphereDatabase createDatabase(final String databaseName,
final Collection<ShardingSphereSchema> schemas) {
+ return new ShardingSphereDatabase(databaseName, databaseType,
+ new ResourceMetaData(Collections.emptyMap(),
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), schemas);
+ }
+
+ private ShardingSphereMetaData createMetaData(final ShardingSphereDatabase
database) {
+ return new ShardingSphereMetaData(Collections.singleton(database),
+ new ResourceMetaData(Collections.emptyMap(),
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), new
ConfigurationProperties(new Properties()));
}
}