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 a8a56552b42 Add ContextManagerTest (#37157)
a8a56552b42 is described below

commit a8a56552b42bbb6ec94544a120cec0ab2793def7
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Nov 22 14:08:56 2025 +0800

    Add ContextManagerTest (#37157)
    
    * Add ContextManagerTest
    
    * Add ContextManagerTest
    
    * Add ContextManagerTest
---
 .../mode/manager/ContextManagerTest.java           | 187 +++++++++++++++++++--
 1 file changed, 170 insertions(+), 17 deletions(-)

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 5cd0a317c30..73e75abb718 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
@@ -17,11 +17,13 @@
 
 package org.apache.shardingsphere.mode.manager;
 
+import lombok.SneakyThrows;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.exception.core.exception.syntax.database.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.database.exception.core.exception.syntax.database.UnknownDatabaseException;
 import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
@@ -31,19 +33,33 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 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.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.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
+import 
org.apache.shardingsphere.mode.metadata.manager.resource.SwitchingResource;
+import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
+import org.apache.shardingsphere.mode.persist.PersistServiceFacade;
 import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
 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.MockedConstruction;
+import org.mockito.MockedStatic;
+import org.mockito.internal.configuration.plugins.Plugins;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
@@ -60,9 +76,16 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 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.anyCollection;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anySet;
+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.mockConstruction;
+import static org.mockito.Mockito.mockStatic;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -70,18 +93,22 @@ import static org.mockito.Mockito.when;
 @MockitoSettings(strictness = Strictness.LENIENT)
 class ContextManagerTest {
     
+    private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
+    
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private MetaDataContexts metaDataContexts;
     
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ComputeNodeInstanceContext computeNodeInstanceContext;
     
+    private ShardingSphereDatabase database;
+    
     private ContextManager contextManager;
     
     @BeforeEach
     void setUp() throws SQLException {
         when(metaDataContexts.getMetaData().getProps()).thenReturn(new 
ConfigurationProperties(new Properties()));
-        ShardingSphereDatabase database = mockDatabase();
+        database = mockDatabase();
         
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
         
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
         
when(metaDataContexts.getMetaData().getAllDatabases()).thenReturn(Collections.singleton(database));
@@ -93,7 +120,7 @@ class ContextManagerTest {
     private ShardingSphereDatabase mockDatabase() throws SQLException {
         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.getProtocolType()).thenReturn(databaseType);
         MutableDataNodeRuleAttribute ruleAttribute = 
mock(MutableDataNodeRuleAttribute.class);
         when(ruleAttribute.findTableDataNode("foo_schema", 
"foo_tbl")).thenReturn(Optional.of(mock(DataNode.class)));
         ShardingSphereRule rule = mock(ShardingSphereRule.class);
@@ -105,7 +132,7 @@ class ContextManagerTest {
         ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema", 
Collections.singleton(table), Collections.emptyList());
         when(result.getAllSchemas()).thenReturn(Collections.singleton(schema));
         StorageUnit storageUnit = mock(StorageUnit.class, RETURNS_DEEP_STUBS);
-        
when(storageUnit.getStorageType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        when(storageUnit.getStorageType()).thenReturn(databaseType);
         Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
         ResultSet resultSet = mock(ResultSet.class);
         when(resultSet.next()).thenReturn(true, false);
@@ -115,6 +142,14 @@ class ContextManagerTest {
         return result;
     }
     
+    @Test
+    void assertGetDatabaseType() {
+        ResourceMetaData resourceMetaData = new 
ResourceMetaData(Collections.emptyMap(), Collections.emptyMap());
+        ShardingSphereDatabase emptyDatabase = new 
ShardingSphereDatabase("bar_db", databaseType, resourceMetaData, 
mock(RuleMetaData.class), Collections.emptyList());
+        
when(metaDataContexts.getMetaData().getAllDatabases()).thenReturn(Collections.singleton(emptyDatabase));
+        assertThat(contextManager.getDatabaseType(), 
is(DatabaseTypeEngine.getDefaultStorageType()));
+    }
+    
     @Test
     void assertGetAllDatabaseNames() {
         assertThat(contextManager.getAllDatabaseNames(), 
is(Collections.singletonList("foo_db")));
@@ -145,25 +180,121 @@ class ContextManagerTest {
     }
     
     @Test
-    void assertReloadSchema() throws SQLException {
-        
when(metaDataContexts.getMetaData().getDatabase("foo_db").getName()).thenReturn("foo_db");
-        ShardingSphereDatabase database = mockDatabase();
-        contextManager.reloadSchema(database, "foo_schema", "foo_ds");
-        
verify(contextManager.getPersistServiceFacade().getRepository()).delete("/metadata/foo_db/schemas/foo_schema");
+    void assertReloadDatabase() {
+        PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+        setPersistServiceFacade(persistServiceFacade);
+        MetaDataContextManager metaDataContextManager = 
mock(MetaDataContextManager.class, RETURNS_DEEP_STUBS);
+        SwitchingResource switchingResource = new 
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(), 
Collections.emptyList(), Collections.emptyMap());
+        
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
 anyMap())).thenReturn(switchingResource);
+        setMetaDataContextManager(metaDataContextManager);
+        
when(metaDataContexts.getMetaData().getGlobalResourceMetaData()).thenReturn(mock(ResourceMetaData.class));
+        try (
+                MockedStatic<GenericSchemaManager> genericSchemaManager = 
mockStatic(GenericSchemaManager.class);
+                MockedStatic<GlobalRulesBuilder> globalRulesBuilder = 
mockStatic(GlobalRulesBuilder.class);
+                MockedStatic<ShardingSphereStatisticsFactory> 
statisticsFactory = mockStatic(ShardingSphereStatisticsFactory.class);
+                MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
+                        (mock, context) -> 
when(mock.createChangedDatabase("foo_db", false, switchingResource, 
Collections.emptyList(), metaDataContexts)).thenReturn(database))) {
+            genericSchemaManager.when(() -> 
GenericSchemaManager.getToBeDroppedSchemaNames(any(ShardingSphereDatabase.class),
 any(ShardingSphereDatabase.class)))
+                    .thenReturn(Collections.singleton("foo_schema"));
+            globalRulesBuilder.when(() -> 
GlobalRulesBuilder.buildRules(anyCollection(), anyCollection(), 
any(ConfigurationProperties.class))).thenReturn(Collections.emptyList());
+            statisticsFactory.when(() -> 
ShardingSphereStatisticsFactory.create(any(), 
any())).thenReturn(mock(ShardingSphereStatistics.class));
+            contextManager.reloadDatabase(database);
+        }
+        
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getSchema()).drop("foo_db",
 "foo_schema");
+        
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getSchema()).alterByRefresh(eq("foo_db"),
 any(ShardingSphereSchema.class));
+    }
+    
+    @Test
+    void assertReloadDatabaseWhenSQLExceptionThrown() {
+        setPersistServiceFacade(mockPersistServiceFacade());
+        MetaDataContextManager metaDataContextManager = 
mock(MetaDataContextManager.class, RETURNS_DEEP_STUBS);
+        SwitchingResource switchingResource = new 
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(), 
Collections.emptyList(), Collections.emptyMap());
+        
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
 anyMap())).thenReturn(switchingResource);
+        setMetaDataContextManager(metaDataContextManager);
+        try (
+                MockedConstruction<MetaDataContextsFactory> ignored = 
mockConstruction(MetaDataContextsFactory.class,
+                        (mock, context) -> 
when(mock.createChangedDatabase("foo_db", false, switchingResource, 
Collections.emptyList(), metaDataContexts)).thenThrow(SQLException.class))) {
+            contextManager.reloadDatabase(database);
+        }
+    }
+    
+    @Test
+    void assertReloadSchemaWhenNoTablesFound() {
+        PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+        
when(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getView().load(anyString(),
 anyString())).thenReturn(Collections.emptyList());
+        setPersistServiceFacade(persistServiceFacade);
+        ShardingSphereSchema emptySchema = new 
ShardingSphereSchema("foo_schema");
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> 
GenericSchemaBuilder.build(any(DatabaseType.class), 
any(GenericSchemaBuilderMaterial.class)))
+                    .thenReturn(Collections.singletonMap("foo_schema", 
emptySchema));
+            contextManager.reloadSchema(database, "foo_schema", "foo_ds");
+        }
+        verify(database).dropSchema("foo_schema");
+        
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getSchema()).drop("foo_db",
 "foo_schema");
+    }
+    
+    @Test
+    void assertReloadSchemaWithTables() {
+        PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+        
when(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getView().load(anyString(),
 anyString())).thenReturn(Collections.emptyList());
+        setPersistServiceFacade(persistServiceFacade);
+        ShardingSphereTable table = mock(ShardingSphereTable.class);
+        when(table.getName()).thenReturn("foo_tbl");
+        ShardingSphereSchema reloadedSchema = new 
ShardingSphereSchema("foo_schema", Collections.singleton(table), 
Collections.emptyList());
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> 
GenericSchemaBuilder.build(any(DatabaseType.class), 
any(GenericSchemaBuilderMaterial.class)))
+                    .thenReturn(Collections.singletonMap("foo_schema", 
reloadedSchema));
+            contextManager.reloadSchema(database, "foo_schema", "foo_ds");
+        }
+        verify(database).addSchema(reloadedSchema);
+        
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getSchema()).alterByRefresh("foo_db",
 reloadedSchema);
+    }
+    
+    @Test
+    void assertReloadSchemaWithSQLException() {
+        setPersistServiceFacade(mockPersistServiceFacade());
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> 
GenericSchemaBuilder.build(any(DatabaseType.class), 
any(GenericSchemaBuilderMaterial.class))).thenThrow(SQLException.class);
+            contextManager.reloadSchema(database, "foo_schema", "foo_ds");
+        }
+    }
+    
+    @Test
+    void assertReloadTable() {
+        PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+        setPersistServiceFacade(persistServiceFacade);
+        ShardingSphereTable table = mock(ShardingSphereTable.class);
+        when(table.getName()).thenReturn("foo_tbl");
+        ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema", 
Collections.singleton(table), Collections.emptyList());
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> GenericSchemaBuilder.build(anySet(), 
any(DatabaseType.class), any(GenericSchemaBuilderMaterial.class)))
+                    .thenReturn(Collections.singletonMap("foo_schema", 
schema));
+            contextManager.reloadTable(database, "foo_schema", "foo_tbl");
+        }
+        
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getTable()).persist("foo_db",
 "foo_schema", Collections.singleton(table));
     }
     
     @Test
-    void assertReloadTable() throws SQLException {
-        ShardingSphereDatabase database = mockDatabase();
-        contextManager.reloadTable(database, "foo_schema", "foo_tbl");
-        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnits().containsKey("foo_ds"));
+    void assertReloadTableWithDataSourceName() {
+        PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+        setPersistServiceFacade(persistServiceFacade);
+        ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema");
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> GenericSchemaBuilder.build(anySet(), 
any(DatabaseType.class), any(GenericSchemaBuilderMaterial.class)))
+                    .thenReturn(Collections.singletonMap("foo_schema", 
schema));
+            contextManager.reloadTable(database, "foo_schema", "foo_ds", 
"foo_tbl");
+        }
+        
verify(persistServiceFacade.getModeFacade().getMetaDataManagerService()).dropTables(database,
 "foo_schema", Collections.singleton("foo_tbl"));
     }
     
     @Test
-    void assertReloadTableWithDataSourceName() throws SQLException {
-        ShardingSphereDatabase database = mockDatabase();
-        contextManager.reloadTable(database, "foo_schema", "foo_ds", 
"foo_tbl");
-        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getStorageUnits().containsKey("foo_ds"));
+    void assertReloadTableWithSQLException() {
+        setPersistServiceFacade(mockPersistServiceFacade());
+        try (MockedStatic<GenericSchemaBuilder> schemaBuilderMock = 
mockStatic(GenericSchemaBuilder.class)) {
+            schemaBuilderMock.when(() -> GenericSchemaBuilder.build(anySet(), 
any(DatabaseType.class), 
any(GenericSchemaBuilderMaterial.class))).thenThrow(SQLException.class);
+            contextManager.reloadTable(database, "foo_schema", "foo_tbl");
+            contextManager.reloadTable(database, "foo_schema", "foo_ds", 
"foo_tbl");
+        }
     }
     
     @Test
@@ -183,4 +314,26 @@ class ContextManagerTest {
         contextManager.close();
         verify(metaDataContexts.getMetaData()).close();
     }
+    
+    private PersistServiceFacade mockPersistServiceFacade() {
+        MetaDataPersistFacade metaDataPersistFacade = 
mock(MetaDataPersistFacade.class, RETURNS_DEEP_STUBS);
+        
when(metaDataPersistFacade.getDataSourceUnitService().load("foo_db")).thenReturn(Collections.emptyMap());
+        
when(metaDataPersistFacade.getDatabaseRuleService().load("foo_db")).thenReturn(Collections.emptyList());
+        when(metaDataPersistFacade.getPropsService().load()).thenReturn(new 
Properties());
+        
when(metaDataPersistFacade.getGlobalRuleService().load()).thenReturn(Collections.emptyList());
+        
when(metaDataPersistFacade.getDatabaseMetaDataFacade().getView().load(anyString(),
 anyString())).thenReturn(Collections.emptyList());
+        PersistServiceFacade result = mock(PersistServiceFacade.class, 
RETURNS_DEEP_STUBS);
+        when(result.getMetaDataFacade()).thenReturn(metaDataPersistFacade);
+        return result;
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private void setPersistServiceFacade(final PersistServiceFacade 
persistServiceFacade) {
+        
Plugins.getMemberAccessor().set(ContextManager.class.getDeclaredField("persistServiceFacade"),
 contextManager, persistServiceFacade);
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private void setMetaDataContextManager(final MetaDataContextManager 
metaDataContextManager) {
+        
Plugins.getMemberAccessor().set(ContextManager.class.getDeclaredField("metaDataContextManager"),
 contextManager, metaDataContextManager);
+    }
 }

Reply via email to