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 a9551804bf9 Add test cases for SchemaMetaDataManager (#32906)
a9551804bf9 is described below

commit a9551804bf9cdc4b1c3e531fe8132dfd5203b685
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Sep 16 23:54:39 2024 +0800

    Add test cases for SchemaMetaDataManager (#32906)
    
    * Add test cases for SchemaMetaDataManager
    
    * Add test cases for SchemaMetaDataManager
    
    * Add test cases for SchemaMetaDataManager
---
 .../core/metadata/data/loader/MetaDataLoader.java  |   2 +-
 .../mode/manager/ContextManager.java               |   6 +-
 .../mode/metadata/MetaDataContextManager.java      |   3 +-
 .../metadata/manager/SchemaMetaDataManager.java    |  67 +++----
 .../mode/manager/ContextManagerTest.java           | 128 +-----------
 .../manager/SchemaMetaDataManagerTest.java         | 215 +++++++++++++++++++++
 6 files changed, 261 insertions(+), 160 deletions(-)

diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
index dd326098d6b..10b8bb73bd8 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
@@ -95,7 +95,7 @@ public final class MetaDataLoader {
         for (String each : material.getActualTableNames()) {
             TableMetaDataLoader.load(material.getDataSource(), each, 
material.getStorageType()).ifPresent(tableMetaData::add);
         }
-        return Collections.singletonList(new 
SchemaMetaData(material.getDefaultSchemaName(), tableMetaData));
+        return Collections.singleton(new 
SchemaMetaData(material.getDefaultSchemaName(), tableMetaData));
     }
     
     private static void merge(final Map<String, SchemaMetaData> 
schemaMetaDataMap, final Collection<SchemaMetaData> addedSchemaMetaDataList) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index d861bdf34d5..99f8d4309d0 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -130,12 +130,10 @@ public final class ContextManager implements 
AutoCloseable {
             ShardingSphereSchema reloadedSchema = loadSchema(database, 
schemaName, dataSourceName);
             if (reloadedSchema.getTables().isEmpty()) {
                 database.dropSchema(schemaName);
-                
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService().dropSchema(database.getName(),
-                        schemaName);
+                
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService().dropSchema(database.getName(),
 schemaName);
             } else {
                 database.addSchema(schemaName, reloadedSchema);
-                
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService()
-                        .compareAndPersist(database.getName(), schemaName, 
reloadedSchema);
+                
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
 schemaName, reloadedSchema);
             }
         } catch (final SQLException ex) {
             log.error("Reload meta data of database: {} schema: {} with data 
source: {} failed", database.getName(), schemaName, dataSourceName, ex);
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
index 5c0c1848653..b39cb56cc11 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
@@ -74,8 +74,7 @@ public class MetaDataContextManager {
     
     private final RuleConfigurationPersistDecorateEngine 
ruleConfigPersistDecorateEngine;
     
-    public MetaDataContextManager(final AtomicReference<MetaDataContexts> 
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
-                                  final PersistRepository repository) {
+    public MetaDataContextManager(final AtomicReference<MetaDataContexts> 
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext, 
final PersistRepository repository) {
         this.metaDataContexts = metaDataContexts;
         this.computeNodeInstanceContext = computeNodeInstanceContext;
         resourceSwitchManager = new ResourceSwitchManager();
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManager.java
index 17742956a7e..97b852601dc 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManager.java
@@ -55,7 +55,7 @@ public final class SchemaMetaDataManager {
     /**
      * Add database.
      *
-     * @param databaseName database name
+     * @param databaseName to be added database name
      */
     public synchronized void addDatabase(final String databaseName) {
         if 
(metaDataContexts.get().getMetaData().containsDatabase(databaseName)) {
@@ -69,7 +69,7 @@ public final class SchemaMetaDataManager {
     /**
      * Drop database.
      *
-     * @param databaseName database name
+     * @param databaseName to be dropped database name
      */
     public synchronized void dropDatabase(final String databaseName) {
         if 
(!metaDataContexts.get().getMetaData().containsDatabase(databaseName)) {
@@ -81,8 +81,8 @@ public final class SchemaMetaDataManager {
     /**
      * Add schema.
      *
-     * @param databaseName database name
-     * @param schemaName schema name
+     * @param databaseName to be added database name
+     * @param schemaName to be added schema name
      */
     public synchronized void addSchema(final String databaseName, final String 
schemaName) {
         ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
@@ -97,14 +97,11 @@ public final class SchemaMetaDataManager {
     /**
      * Drop schema.
      *
-     * @param databaseName database name
-     * @param schemaName schema name
+     * @param databaseName to be dropped database name
+     * @param schemaName to be dropped schema name
      */
     public synchronized void dropSchema(final String databaseName, final 
String schemaName) {
         ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
-        if (!metaData.containsDatabase(databaseName)) {
-            return;
-        }
         ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         if (!database.containsSchema(schemaName)) {
             return;
@@ -118,17 +115,17 @@ public final class SchemaMetaDataManager {
      *
      * @param databaseName database name
      * @param schemaName schema name
-     * @param toBeDeletedTableName to be deleted table name
-     * @param toBeDeletedViewName to be deleted view name
+     * @param toBeChangedTable to be changed table
+     * @param toBeChangedView to be changed view
      */
-    public synchronized void alterSchema(final String databaseName, final 
String schemaName, final String toBeDeletedTableName, final String 
toBeDeletedViewName) {
+    public synchronized void alterSchema(final String databaseName, final 
String schemaName, final ShardingSphereTable toBeChangedTable, final 
ShardingSphereView toBeChangedView) {
         ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
-        if (!metaData.containsDatabase(databaseName) || 
!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
+        if (!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
             return;
         }
-        Optional.ofNullable(toBeDeletedTableName).ifPresent(optional -> 
dropTable(databaseName, schemaName, optional));
-        Optional.ofNullable(toBeDeletedViewName).ifPresent(optional -> 
dropView(databaseName, schemaName, optional));
-        if (!Strings.isNullOrEmpty(toBeDeletedTableName) || 
!Strings.isNullOrEmpty(toBeDeletedViewName)) {
+        Optional.ofNullable(toBeChangedTable).ifPresent(optional -> 
alterTable(databaseName, schemaName, optional));
+        Optional.ofNullable(toBeChangedView).ifPresent(optional -> 
alterView(databaseName, schemaName, optional));
+        if (null != toBeChangedTable || null != toBeChangedView) {
             metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
         }
     }
@@ -138,33 +135,21 @@ public final class SchemaMetaDataManager {
      *
      * @param databaseName database name
      * @param schemaName schema name
-     * @param toBeChangedTable to be changed table
-     * @param toBeChangedView to be changed view
+     * @param toBeDeletedTableName to be deleted table name
+     * @param toBeDeletedViewName to be deleted view name
      */
-    public synchronized void alterSchema(final String databaseName, final 
String schemaName, final ShardingSphereTable toBeChangedTable, final 
ShardingSphereView toBeChangedView) {
+    public synchronized void alterSchema(final String databaseName, final 
String schemaName, final String toBeDeletedTableName, final String 
toBeDeletedViewName) {
         ShardingSphereMetaData metaData = metaDataContexts.get().getMetaData();
-        if (!metaData.containsDatabase(databaseName) || 
!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
+        if (!metaData.getDatabase(databaseName).containsSchema(schemaName)) {
             return;
         }
-        Optional.ofNullable(toBeChangedTable).ifPresent(optional -> 
alterTable(databaseName, schemaName, optional));
-        Optional.ofNullable(toBeChangedView).ifPresent(optional -> 
alterView(databaseName, schemaName, optional));
-        if (null != toBeChangedTable || null != toBeChangedView) {
+        Optional.ofNullable(toBeDeletedTableName).ifPresent(optional -> 
dropTable(databaseName, schemaName, optional));
+        Optional.ofNullable(toBeDeletedViewName).ifPresent(optional -> 
dropView(databaseName, schemaName, optional));
+        if (!Strings.isNullOrEmpty(toBeDeletedTableName) || 
!Strings.isNullOrEmpty(toBeDeletedViewName)) {
             metaData.getGlobalRuleMetaData().getRules().forEach(each -> 
((GlobalRule) each).refresh(metaData.getDatabases(), 
GlobalRuleChangedType.SCHEMA_CHANGED));
         }
     }
     
-    private void dropTable(final String databaseName, final String schemaName, 
final String toBeDeletedTableName) {
-        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchema(schemaName).removeTable(toBeDeletedTableName);
-        metaDataContexts.get().getMetaData().getDatabase(databaseName)
-                
.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class).forEach(each
 -> each.remove(schemaName, toBeDeletedTableName));
-    }
-    
-    private void dropView(final String databaseName, final String schemaName, 
final String toBeDeletedViewName) {
-        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchema(schemaName).removeView(toBeDeletedViewName);
-        metaDataContexts.get().getMetaData().getDatabase(databaseName)
-                
.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class).forEach(each
 -> each.remove(schemaName, toBeDeletedViewName));
-    }
-    
     private void alterTable(final String databaseName, final String 
schemaName, final ShardingSphereTable beBoChangedTable) {
         ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
         if (TableRefreshUtils.isSingleTable(beBoChangedTable.getName(), 
database)) {
@@ -180,4 +165,16 @@ public final class SchemaMetaDataManager {
         }
         database.getSchema(schemaName).putView(beBoChangedView.getName(), 
beBoChangedView);
     }
+    
+    private void dropTable(final String databaseName, final String schemaName, 
final String toBeDeletedTableName) {
+        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchema(schemaName).removeTable(toBeDeletedTableName);
+        metaDataContexts.get().getMetaData().getDatabase(databaseName)
+                
.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class).forEach(each
 -> each.remove(schemaName, toBeDeletedTableName));
+    }
+    
+    private void dropView(final String databaseName, final String schemaName, 
final String toBeDeletedViewName) {
+        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchema(schemaName).removeView(toBeDeletedViewName);
+        metaDataContexts.get().getMetaData().getDatabase(databaseName)
+                
.getRuleMetaData().getAttributes(MutableDataNodeRuleAttribute.class).forEach(each
 -> each.remove(schemaName, toBeDeletedViewName));
+    }
 }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 530190f0851..cc137afb480 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -34,10 +34,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaDa
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-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.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
@@ -46,8 +43,6 @@ import 
org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
-import org.apache.shardingsphere.test.util.PropertiesBuilder;
-import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -57,7 +52,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 
-import java.sql.Types;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -66,16 +60,11 @@ import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -94,7 +83,6 @@ class ContextManagerTest {
         ShardingSphereDatabase database = mockDatabase();
         
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
         
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").containsSchema("foo_schema")).thenReturn(true);
         
when(metaDataContexts.getMetaData().getDatabases().values()).thenReturn(Collections.singleton(database));
         ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class);
         when(computeNodeInstanceContext.getInstance()).thenReturn(new 
ComputeNodeInstance(new ProxyInstanceMetaData("foo_id", 3307), 
Collections.emptyList()));
@@ -106,11 +94,12 @@ class ContextManagerTest {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(result.getName()).thenReturn("foo_db");
         
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        ShardingSphereRule rule = mock(ShardingSphereRule.class);
         MutableDataNodeRuleAttribute ruleAttribute = 
mock(MutableDataNodeRuleAttribute.class);
         when(ruleAttribute.findTableDataNode("foo_schema", 
"foo_tbl")).thenReturn(Optional.of(mock(DataNode.class)));
+        ShardingSphereRule rule = mock(ShardingSphereRule.class);
         when(rule.getAttributes()).thenReturn(new 
RuleAttributes(ruleAttribute));
         when(result.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(rule)));
+        when(result.containsSchema("foo_schema")).thenReturn(true);
         when(result.getSchemas()).thenReturn(new 
HashMap<>(Collections.singletonMap("foo_schema", new 
ShardingSphereSchema(DefaultDatabase.LOGIC_NAME))));
         StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS);
         
when(storageUnit.getStorageType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
@@ -122,16 +111,6 @@ class ContextManagerTest {
         return result;
     }
     
-    @Test
-    void assertGetDataSourceMap() {
-        ResourceMetaData resourceMetaData = new 
ResourceMetaData(Collections.singletonMap("foo_ds", new MockedDataSource()));
-        ShardingSphereDatabase database =
-                new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, 
mock(DatabaseType.class), resourceMetaData, mock(RuleMetaData.class), 
Collections.emptyMap());
-        
when(metaDataContexts.getMetaData().getDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(database);
-        
when(metaDataContexts.getMetaData().containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
-        
assertThat(contextManager.getStorageUnits(DefaultDatabase.LOGIC_NAME).size(), 
is(1));
-    }
-    
     @Test
     void assertRenewMetaDataContexts() {
         MetaDataContexts contexts = mock(MetaDataContexts.class);
@@ -140,88 +119,8 @@ class ContextManagerTest {
     }
     
     @Test
-    void assertAddDatabase() {
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addDatabase("new_db");
-        verify(metaDataContexts.getMetaData()).addDatabase(eq("new_db"), 
any(DatabaseType.class), any(ConfigurationProperties.class));
-    }
-    
-    @Test
-    void assertAddExistedDatabase() {
-        
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addDatabase("foo_db");
-        verify(metaDataContexts.getMetaData(), 
times(0)).addDatabase(eq("foo_db"), any(DatabaseType.class), 
any(ConfigurationProperties.class));
-    }
-    
-    @Test
-    void assertDropDatabase() {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getName()).thenReturn("foo_db");
-        
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().dropDatabase("foo_db");
-        verify(metaDataContexts.getMetaData()).dropDatabase("foo_db");
-    }
-    
-    @Test
-    void assertDropNotExistedDatabase() {
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().dropDatabase("not_existed_db");
-        verify(metaDataContexts.getMetaData(), 
times(0)).dropDatabase("not_existed_db");
-    }
-    
-    @Test
-    void assertAddSchema() {
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addSchema("foo_db",
 "bar_schema");
-        
verify(metaDataContexts.getMetaData().getDatabase("foo_db")).addSchema(anyString(),
 any(ShardingSphereSchema.class));
-    }
-    
-    @Test
-    void assertAddExistedSchema() {
-        
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").containsSchema("foo_schema")).thenReturn(true);
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().addSchema("foo_db",
 "foo_schema");
-        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).addSchema(anyString(), any(ShardingSphereSchema.class));
-    }
-    
-    @Test
-    void assertAlterSchemaForTableAltered() {
-        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
-        ShardingSphereColumn toBeChangedColumn = new 
ShardingSphereColumn("foo_col", Types.VARCHAR, false, false, false, true, 
false, false);
-        ShardingSphereTable toBeChangedTable = new 
ShardingSphereTable("foo_tbl", Collections.singleton(toBeChangedColumn), 
Collections.emptyList(), Collections.emptyList());
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().alterSchema("foo_db",
 "foo_schema", toBeChangedTable, null);
-        ShardingSphereTable table = 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().get("foo_tbl");
-        assertThat(table.getColumnValues().size(), is(1));
-        assertTrue(table.containsColumn("foo_col"));
-    }
-    
-    @Test
-    void assertAlterSchemaForViewAltered() {
-        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
-        ShardingSphereView toBeChangedView = new 
ShardingSphereView("foo_view", "select `foo_view`.`foo_view`.`id` AS `id` from 
`foo_view`.`foo_view`");
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().alterSchema("foo_db",
 "foo_schema", null, toBeChangedView);
-        ShardingSphereView view = 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getView("foo_view");
-        assertThat(view.getName(), is("foo_view"));
-        assertThat(view.getViewDefinition(), is("select 
`foo_view`.`foo_view`.`id` AS `id` from `foo_view`.`foo_view`"));
-    }
-    
-    @Test
-    void assertAlterSchemaForTableDropped() {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 createToBeAlteredSchema()));
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().alterSchema("foo_db",
 "foo_schema", "foo_tbl", null);
-        
assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().containsKey("foo_tbl"));
-    }
-    
-    @Test
-    void assertAlterSchemaForViewDropped() {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 createToBeAlteredSchema()));
-        
contextManager.getMetaDataContextManager().getSchemaMetaDataManager().alterSchema("foo_db",
 "foo_schema", "foo_view", null);
-        
assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getSchema("foo_schema").getViews().containsKey("foo_view"));
-    }
-    
-    private ShardingSphereSchema createToBeAlteredSchema() {
-        ShardingSphereTable beforeChangedTable = new 
ShardingSphereTable("foo_tbl", Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList());
-        ShardingSphereView beforeChangedView = new 
ShardingSphereView("foo_tbl", "");
-        return new ShardingSphereSchema(DefaultDatabase.LOGIC_NAME, 
Collections.singletonMap("foo_tbl", beforeChangedTable), 
Collections.singletonMap("foo_view", beforeChangedView));
+    void assertGetDatabase() {
+        assertNotNull(contextManager.getDatabase("foo_db"));
     }
     
     @Test
@@ -229,25 +128,18 @@ class ContextManagerTest {
         assertThrows(NoDatabaseSelectedException.class, () -> 
contextManager.getDatabase(null));
     }
     
-    @Test
-    void assertGetDatabaseWithEmptyString() {
-        assertThrows(NoDatabaseSelectedException.class, () -> 
contextManager.getDatabase(""));
-    }
-    
     @Test
     void assertGetDatabaseWhenNotExisted() {
         assertThrows(UnknownDatabaseException.class, () -> 
contextManager.getDatabase("bar_db"));
     }
     
     @Test
-    void assertGetDatabase() {
-        assertNotNull(contextManager.getDatabase("foo_db"));
-    }
-    
-    @Test
-    void assertAlterProperties() {
-        
contextManager.getMetaDataContextManager().getGlobalConfigurationManager().alterProperties(PropertiesBuilder.build(new
 Property("foo", "foo_value")));
-        
assertThat(contextManager.getMetaDataContexts().getMetaData().getProps().getProps().getProperty("foo"),
 is("foo_value"));
+    void assertGetStorageUnits() {
+        ResourceMetaData resourceMetaData = new 
ResourceMetaData(Collections.singletonMap("foo_ds", new MockedDataSource()));
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, mock(DatabaseType.class), 
resourceMetaData, mock(RuleMetaData.class), Collections.emptyMap());
+        
when(metaDataContexts.getMetaData().getDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(database);
+        
when(metaDataContexts.getMetaData().containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
+        
assertThat(contextManager.getStorageUnits(DefaultDatabase.LOGIC_NAME).size(), 
is(1));
     }
     
     @Test
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManagerTest.java
new file mode 100644
index 00000000000..cd3eb5c1e76
--- /dev/null
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/SchemaMetaDataManagerTest.java
@@ -0,0 +1,215 @@
+/*
+ * 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.mode.metadata.manager;
+
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+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.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import java.sql.Types;
+import java.util.Collections;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class SchemaMetaDataManagerTest {
+    
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private MetaDataContexts metaDataContexts;
+    
+    private SchemaMetaDataManager schemaMetaDataManager;
+    
+    @BeforeEach
+    void setUp() {
+        ShardingSphereDatabase database = mockDatabase();
+        
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
+        
when(metaDataContexts.getMetaData().getDatabases().values()).thenReturn(Collections.singleton(database));
+        schemaMetaDataManager = new SchemaMetaDataManager(new 
AtomicReference<>(metaDataContexts), mock(PersistRepository.class));
+    }
+    
+    private ShardingSphereDatabase mockDatabase() {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(result.getName()).thenReturn("foo_db");
+        
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        when(result.containsSchema("foo_schema")).thenReturn(true);
+        return result;
+    }
+    
+    @Test
+    void assertAddNotExistedDatabase() {
+        schemaMetaDataManager.addDatabase("new_db");
+        verify(metaDataContexts.getMetaData()).addDatabase(eq("new_db"), 
any(DatabaseType.class), any(ConfigurationProperties.class));
+    }
+    
+    @Test
+    void assertAddExistedDatabase() {
+        
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
+        schemaMetaDataManager.addDatabase("foo_db");
+        verify(metaDataContexts.getMetaData(), 
times(0)).addDatabase(eq("foo_db"), any(DatabaseType.class), 
any(ConfigurationProperties.class));
+    }
+    
+    @Test
+    void assertDropExistedDatabase() {
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getName()).thenReturn("foo_db");
+        
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
+        schemaMetaDataManager.dropDatabase("foo_db");
+        verify(metaDataContexts.getMetaData()).dropDatabase("foo_db");
+    }
+    
+    @Test
+    void assertDropNotExistedDatabase() {
+        schemaMetaDataManager.dropDatabase("not_existed_db");
+        verify(metaDataContexts.getMetaData(), 
times(0)).dropDatabase("not_existed_db");
+    }
+    
+    @Test
+    void assertAddNotExistedSchema() {
+        schemaMetaDataManager.addSchema("foo_db", "bar_schema");
+        
verify(metaDataContexts.getMetaData().getDatabase("foo_db")).addSchema(anyString(),
 any(ShardingSphereSchema.class));
+    }
+    
+    @Test
+    void assertAddExistedSchema() {
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").containsSchema("foo_schema")).thenReturn(true);
+        schemaMetaDataManager.addSchema("foo_db", "foo_schema");
+        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).addSchema(anyString(), any(ShardingSphereSchema.class));
+    }
+    
+    @Test
+    void assertDropNotExistedSchema() {
+        schemaMetaDataManager.dropSchema("foo_db", "bar_schema");
+        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).dropSchema(anyString());
+    }
+    
+    @Test
+    void assertDropExistedSchema() {
+        schemaMetaDataManager.dropSchema("foo_db", "foo_schema");
+        
verify(metaDataContexts.getMetaData().getDatabase("foo_db")).dropSchema("foo_schema");
+    }
+    
+    @Test
+    void assertAlterNotExistedSchema() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        schemaMetaDataManager.alterSchema("foo_db", "bar_schema", null, 
(ShardingSphereView) null);
+        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).getSchema(any());
+    }
+    
+    @Test
+    void assertAlterSchemaForNothingAltered() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", null, 
(ShardingSphereView) null);
+        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).getSchema(any());
+    }
+    
+    @Test
+    void assertAlterSchemaForTableAltered() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        ShardingSphereColumn toBeChangedColumn = new 
ShardingSphereColumn("foo_col", Types.VARCHAR, false, false, false, true, 
false, false);
+        ShardingSphereTable toBeChangedTable = new 
ShardingSphereTable("foo_tbl", Collections.singleton(toBeChangedColumn), 
Collections.emptyList(), Collections.emptyList());
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", 
toBeChangedTable, null);
+        ShardingSphereTable table = 
metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().get("foo_tbl");
+        assertThat(table.getColumnValues().size(), is(1));
+        assertTrue(table.containsColumn("foo_col"));
+    }
+    
+    @Test
+    void assertAlterSchemaForViewAltered() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        ShardingSphereView toBeChangedView = new 
ShardingSphereView("foo_view", "select `foo_view`.`foo_view`.`id` AS `id` from 
`foo_view`.`foo_view`");
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", null, 
toBeChangedView);
+        ShardingSphereView view = 
metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema").getView("foo_view");
+        assertThat(view.getName(), is("foo_view"));
+        assertThat(view.getViewDefinition(), is("select 
`foo_view`.`foo_view`.`id` AS `id` from `foo_view`.`foo_view`"));
+    }
+    
+    @Test
+    void assertAlterNotExistedSchemaForTableDropped() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        schemaMetaDataManager.alterSchema("foo_db", "bar_schema", "", "");
+        verify(metaDataContexts.getMetaData().getDatabase("foo_db"), 
times(0)).getSchema(any());
+    }
+    
+    @Test
+    void assertAlterSchemaForNothingTableDropped() {
+        ShardingSphereSchema toBeAlteredSchema = createToBeAlteredSchema();
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 toBeAlteredSchema));
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema")).thenReturn(toBeAlteredSchema);
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", "", "");
+        verify(metaDataContexts.getMetaData().getGlobalRuleMetaData(), 
times(0)).getRules();
+    }
+    
+    @Test
+    void assertAlterSchemaForTableDropped() {
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 createToBeAlteredSchema()));
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", "foo_tbl", 
null);
+        
assertFalse(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema").getTables().containsKey("foo_tbl"));
+    }
+    
+    @Test
+    void assertAlterSchemaForViewDropped() {
+        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getSchemas()).thenReturn(Collections.singletonMap("foo_schema",
 createToBeAlteredSchema()));
+        schemaMetaDataManager.alterSchema("foo_db", "foo_schema", "foo_view", 
null);
+        
assertFalse(metaDataContexts.getMetaData().getDatabase("foo_db").getSchema("foo_schema").getViews().containsKey("foo_view"));
+    }
+    
+    private ShardingSphereSchema createToBeAlteredSchema() {
+        ShardingSphereTable beforeChangedTable = new 
ShardingSphereTable("foo_tbl", Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList());
+        ShardingSphereView beforeChangedView = new 
ShardingSphereView("foo_tbl", "");
+        return new ShardingSphereSchema(DefaultDatabase.LOGIC_NAME, 
Collections.singletonMap("foo_tbl", beforeChangedTable), 
Collections.singletonMap("foo_view", beforeChangedView));
+    }
+}


Reply via email to