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 47587318bbe Add more test cases on MetaDataContextsFactoryTest (#37213)
47587318bbe is described below

commit 47587318bbe4fe1ac6bed9e988eb0c3f625f6956
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Nov 28 18:10:02 2025 +0800

    Add more test cases on MetaDataContextsFactoryTest (#37213)
    
    * Add more test cases on MetaDataContextsFactoryTest
    
    * Add more test cases on MetaDataContextsFactoryTest
---
 .../factory/MetaDataContextsFactoryTest.java       | 172 ++++++++++++++++++++-
 1 file changed, 164 insertions(+), 8 deletions(-)

diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
index 7d4affe4823..78fb17ab4ed 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactoryTest.java
@@ -18,22 +18,42 @@
 package org.apache.shardingsphere.mode.metadata.factory;
 
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
+import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
 import 
org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData;
 import 
org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabaseFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabasesFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
+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.resource.unit.StorageUnitNodeMapCreator;
+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.statistics.ShardingSphereStatistics;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
+import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
 import 
org.apache.shardingsphere.mode.manager.builder.ContextManagerBuilderParameter;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import 
org.apache.shardingsphere.mode.metadata.manager.resource.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.infra.fixture.rule.MockedRule;
+import 
org.apache.shardingsphere.test.infra.fixture.rule.MockedRuleConfiguration;
 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;
@@ -44,23 +64,31 @@ import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 
+import javax.sql.DataSource;
 import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.isA;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.anyCollection;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyCollection;
 import static org.mockito.Mockito.anyMap;
+import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
-@StaticMockSettings({ShardingSphereDatabasesFactory.class, 
GlobalRulesBuilder.class})
+@StaticMockSettings({ShardingSphereDatabasesFactory.class, 
GlobalRulesBuilder.class, DatabaseTypeEngine.class,
+        ShardingSphereDatabaseFactory.class, 
ShardingSphereStatisticsFactory.class, StorageUnitNodeMapCreator.class, 
DatabaseTypeFactory.class})
 @MockitoSettings(strictness = Strictness.LENIENT)
 class MetaDataContextsFactoryTest {
     
@@ -69,20 +97,29 @@ class MetaDataContextsFactoryTest {
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private MetaDataPersistFacade metaDataPersistFacade;
     
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    @Mock
     private PersistRepository repository;
     
     @BeforeEach
-    void setUp() {
-        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(database.getName()).thenReturn("foo_db");
-        when(database.getProtocolType()).thenReturn(databaseType);
-        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.emptyList());
+    void setUp() throws SQLException {
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
+                databaseType, new ResourceMetaData(Collections.emptyMap(), 
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), 
Collections.emptyList());
         when(ShardingSphereDatabasesFactory.create(anyMap(), anyMap(), any(), 
any())).thenReturn(Collections.singleton(database));
+        when(ShardingSphereDatabasesFactory.create(anyMap(), 
any(ConfigurationProperties.class), 
any(ComputeNodeInstanceContext.class))).thenReturn(Collections.singleton(database));
+        when(ShardingSphereDatabaseFactory.create(anyString(), 
any(DatabaseType.class), any(DatabaseConfiguration.class), 
any(ConfigurationProperties.class), any(ComputeNodeInstanceContext.class)))
+                .thenAnswer(invocation -> 
createDatabaseFromConfiguration(invocation.getArgument(0), 
invocation.getArgument(1), invocation.getArgument(2), Collections.emptyList()));
         when(GlobalRulesBuilder.buildRules(anyCollection(), anyCollection(), 
any(ConfigurationProperties.class))).thenReturn(Collections.singleton(new 
MockedRule()));
+        
when(DatabaseTypeEngine.getProtocolType(any(DatabaseConfiguration.class), 
any(ConfigurationProperties.class))).thenReturn(databaseType);
+        when(DatabaseTypeFactory.get(anyString())).thenReturn(databaseType);
         when(metaDataPersistFacade.getRepository()).thenReturn(repository);
     }
     
+    private ShardingSphereDatabase createDatabaseFromConfiguration(final 
String databaseName, final DatabaseType protocolType,
+                                                                   final 
DatabaseConfiguration databaseConfiguration, final 
Collection<ShardingSphereSchema> schemas) {
+        return new ShardingSphereDatabase(databaseName, protocolType,
+                new ResourceMetaData(databaseConfiguration.getDataSources(), 
databaseConfiguration.getStorageUnits()), new 
RuleMetaData(Collections.emptyList()), schemas);
+    }
+    
     @Test
     void assertCreateWithJDBCInstanceMetaData() throws SQLException {
         ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
@@ -100,6 +137,92 @@ class MetaDataContextsFactoryTest {
         assertThat(actual.getMetaData().getAllDatabases().size(), is(1));
     }
     
+    @Test
+    void assertCreateWithoutRegisteredDatabasesUsesLocalFactory() throws 
SQLException {
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).create(createContextManagerBuilderParameter());
+        assertTrue(actual.getMetaData().containsDatabase("foo_db"));
+        
assertThat(actual.getMetaData().getGlobalRuleMetaData().getRules().iterator().next(),
 isA(MockedRule.class));
+    }
+    
+    @Test
+    void assertCreateBySwitchResourceFiltersStaleResources() throws 
SQLException {
+        StorageNode staleNode = new StorageNode("stale_ds");
+        StorageNode activeNode = new StorageNode("active_ds");
+        Map<StorageNode, DataSource> currentStorageNodes = new 
LinkedHashMap<>(2, 1F);
+        currentStorageNodes.put(staleNode, new MockedDataSource());
+        currentStorageNodes.put(activeNode, new MockedDataSource());
+        Map<String, StorageUnit> currentStorageUnits = new LinkedHashMap<>(2, 
1F);
+        currentStorageUnits.put("stale_ds", createStorageUnit("stale_ds"));
+        currentStorageUnits.put("active_ds", createStorageUnit("active_ds"));
+        ResourceMetaData resourceMetaData = new 
ResourceMetaData(currentStorageNodes, currentStorageUnits);
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, resourceMetaData, new RuleMetaData(Collections.emptyList()), 
Collections.emptyList());
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database),
+                new ResourceMetaData(Collections.emptyMap(), 
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), new 
ConfigurationProperties(new Properties()));
+        MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
+        Map<StorageNode, DataSource> newDataSources = 
Collections.singletonMap(new StorageNode("new_ds"), new MockedDataSource());
+        SwitchingResource switchingResource = new 
SwitchingResource(newDataSources, Collections.singletonMap(staleNode, new 
MockedDataSource()),
+                Collections.singleton("stale_ds"), 
createDataSourcePoolPropertiesMap("active_ds", "new_ds"));
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", false, switchingResource, 
originalMetaDataContexts);
+        ResourceMetaData actualResourceMetaData = 
actual.getMetaData().getDatabase("foo_db").getResourceMetaData();
+        
assertFalse(actualResourceMetaData.getDataSources().containsKey(staleNode));
+        
assertTrue(actualResourceMetaData.getDataSources().containsKey(activeNode));
+        assertTrue(actualResourceMetaData.getDataSources().containsKey(new 
StorageNode("new_ds")));
+        
assertFalse(actualResourceMetaData.getStorageUnits().containsKey("stale_ds"));
+        
assertTrue(actualResourceMetaData.getStorageUnits().containsKey("active_ds"));
+        
assertTrue(actualResourceMetaData.getStorageUnits().containsKey("new_ds"));
+    }
+    
+    @Test
+    void assertCreateBySwitchResourceKeepsExistingNodesWhenNoNewDataSources() 
throws SQLException {
+        ResourceMetaData resourceMetaData = 
createResourceMetaDataWithSingleUnit();
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, resourceMetaData, new RuleMetaData(Collections.emptyList()), 
Collections.emptyList());
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database),
+                new ResourceMetaData(Collections.emptyMap(), 
Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), new 
ConfigurationProperties(new Properties()));
+        MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
+        SwitchingResource switchingResource = new 
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(), 
Collections.emptyList(), createDataSourcePoolPropertiesMap("foo_ds"));
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, 
mock()).createBySwitchResource("foo_db", false, switchingResource, 
originalMetaDataContexts);
+        ResourceMetaData actualResourceMetaData = 
actual.getMetaData().getDatabase("foo_db").getResourceMetaData();
+        assertTrue(actualResourceMetaData.getDataSources().containsKey(new 
StorageNode("foo_ds")));
+        
assertTrue(actualResourceMetaData.getStorageUnits().containsKey("foo_ds"));
+    }
+    
+    @Test
+    void 
assertCreateByAlterRuleLoadsSchemasFromRepositoryWhenPersistenceDisabled() 
throws SQLException {
+        Collection<ShardingSphereSchema> loadedSchemas = 
Arrays.asList(createSchemaWithTable("foo_schema", "persisted_table"), 
createSchemaWithTable("new_schema", "new_table"));
+        
when(metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(loadedSchemas);
+        ShardingSphereSchema originSchema = 
createSchemaWithTable("foo_schema", "origin_table");
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, createResourceMetaDataWithSingleUnit(),
+                new RuleMetaData(Collections.emptyList()), 
Collections.singleton(originSchema));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                Collections.singleton(database), new 
ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()), new 
RuleMetaData(Collections.emptyList()),
+                new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.PERSIST_SCHEMAS_TO_REPOSITORY_ENABLED.getKey(),
 Boolean.FALSE.toString()))));
+        MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, mock())
+                .createByAlterRule("foo_db", true, Collections.singleton(new 
MockedRuleConfiguration("alter_rule")), originalMetaDataContexts);
+        ShardingSphereSchema mergedSchema = loadedSchemas.stream().filter(each 
-> 
"foo_schema".equals(each.getName())).findFirst().orElseThrow(IllegalStateException::new);
+        assertThat(mergedSchema.getAllTables().size(), is(2));
+        ShardingSphereSchema untouchedSchema = 
loadedSchemas.stream().filter(each -> 
"new_schema".equals(each.getName())).findFirst().orElseThrow(IllegalStateException::new);
+        assertThat(untouchedSchema.getAllTables().size(), is(1));
+        assertTrue(actual.getMetaData().containsDatabase("foo_db"));
+    }
+    
+    @Test
+    void assertCreateByAlterRuleKeepsPersistedSchemasWhenEnabled() throws 
SQLException {
+        ShardingSphereDatabase database = new ShardingSphereDatabase(
+                "foo_db", databaseType, 
createResourceMetaDataWithSingleUnit(), new 
RuleMetaData(Collections.emptyList()), Collections.emptyList());
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                Collections.singleton(database), new 
ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()), new 
RuleMetaData(Collections.emptyList()),
+                new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.PERSIST_SCHEMAS_TO_REPOSITORY_ENABLED.getKey(),
 Boolean.TRUE.toString()))));
+        MetaDataContexts originalMetaDataContexts = new 
MetaDataContexts(metaData, new ShardingSphereStatistics());
+        Collection<ShardingSphereSchema> loadedSchemas = 
Collections.singleton(createSchemaWithTable("persisted_schema", 
"persisted_table"));
+        
when(metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(loadedSchemas);
+        MetaDataContexts actual = new 
MetaDataContextsFactory(metaDataPersistFacade, mock())
+                .createByAlterRule("foo_db", true, Collections.singleton(new 
MockedRuleConfiguration("persist_rule")), originalMetaDataContexts);
+        ShardingSphereSchema persistedSchema = loadedSchemas.iterator().next();
+        assertThat(persistedSchema.getAllTables().size(), is(1));
+        assertTrue(actual.getMetaData().containsDatabase("foo_db"));
+    }
+    
     @Test
     void assertCreateWithProxyInstanceMetaData() throws SQLException {
         ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
@@ -122,4 +245,37 @@ class MetaDataContextsFactoryTest {
         return new ContextManagerBuilderParameter(null, 
Collections.singletonMap("foo_db", databaseConfig), Collections.emptyMap(),
                 Collections.emptyList(), new Properties(), 
Collections.emptyList(), null);
     }
+    
+    private Map<String, DataSourcePoolProperties> 
createDataSourcePoolPropertiesMap(final String... storageUnitNames) {
+        Map<String, DataSourcePoolProperties> result = new 
LinkedHashMap<>(storageUnitNames.length, 1F);
+        for (String each : storageUnitNames) {
+            Map<String, Object> props = new LinkedHashMap<>(2, 1F);
+            props.put("url", "jdbc:mysql://localhost:3306/" + each);
+            props.put("username", "root");
+            result.put(each, new DataSourcePoolProperties("HikariCP", props));
+        }
+        return result;
+    }
+    
+    private StorageUnit createStorageUnit(final String storageUnitName) {
+        Map<String, Object> props = new LinkedHashMap<>(2, 1F);
+        props.put("url", "jdbc:mock://127.0.0.1/" + storageUnitName);
+        props.put("username", "root");
+        StorageUnit result = mock(StorageUnit.class, RETURNS_DEEP_STUBS);
+        when(result.getDataSourcePoolProperties()).thenReturn(new 
DataSourcePoolProperties("HikariCP", props));
+        when(result.getDataSource()).thenReturn(new MockedDataSource());
+        return result;
+    }
+    
+    private ResourceMetaData createResourceMetaDataWithSingleUnit() {
+        Map<StorageNode, DataSource> dataSources = 
Collections.singletonMap(new StorageNode("foo_ds"), new MockedDataSource());
+        Map<String, StorageUnit> storageUnits = 
Collections.singletonMap("foo_ds", createStorageUnit("foo_ds"));
+        return new ResourceMetaData(dataSources, storageUnits);
+    }
+    
+    private ShardingSphereSchema createSchemaWithTable(final String 
schemaName, final String tableName) {
+        Collection<ShardingSphereColumn> columns = 
Collections.singletonList(new ShardingSphereColumn("id", 0, true, false, false, 
true, false, true));
+        ShardingSphereTable table = new ShardingSphereTable(tableName, 
columns, Collections.emptyList(), Collections.emptyList());
+        return new ShardingSphereSchema(schemaName, 
Collections.singleton(table), Collections.emptyList());
+    }
 }

Reply via email to