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 f5127afc4ae Add test cases of CreateBroadcastTableRuleExecutor (#33107)
f5127afc4ae is described below

commit f5127afc4ae70e43e72708ac0bd3cabea11841e2
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Oct 3 18:05:02 2024 +0800

    Add test cases of CreateBroadcastTableRuleExecutor (#33107)
---
 .../update/CreateBroadcastTableRuleExecutor.java   |  3 +-
 .../CreateBroadcastTableRuleExecutorTest.java      | 90 ++++++++++++++--------
 ...tDefaultSingleTableStorageUnitExecutorTest.java | 16 ++--
 3 files changed, 66 insertions(+), 43 deletions(-)

diff --git 
a/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutor.java
 
b/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutor.java
index a9b4c82e455..4a15ede2a42 100644
--- 
a/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutor.java
+++ 
b/features/broadcast/distsql/handler/src/main/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutor.java
@@ -50,8 +50,7 @@ public final class CreateBroadcastTableRuleExecutor 
implements DatabaseRuleCreat
     }
     
     private void checkDuplicate(final CreateBroadcastTableRuleStatement 
sqlStatement) {
-        Collection<String> duplicatedRuleNames = 
getDuplicatedRuleNames(sqlStatement);
-        ShardingSpherePreconditions.checkMustEmpty(duplicatedRuleNames, () -> 
new DuplicateRuleException("Broadcast", sqlStatement.getTables()));
+        
ShardingSpherePreconditions.checkMustEmpty(getDuplicatedRuleNames(sqlStatement),
 () -> new DuplicateRuleException("Broadcast", sqlStatement.getTables()));
     }
     
     private Collection<String> getDuplicatedRuleNames(final 
CreateBroadcastTableRuleStatement sqlStatement) {
diff --git 
a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java
 
b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java
index 1a7089d6fbe..26ce0e839af 100644
--- 
a/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java
+++ 
b/features/broadcast/distsql/handler/src/test/java/org/apache/shardingsphere/broadcast/distsql/handler/update/CreateBroadcastTableRuleExecutorTest.java
@@ -20,67 +20,91 @@ package 
org.apache.shardingsphere.broadcast.distsql.handler.update;
 import org.apache.shardingsphere.broadcast.config.BroadcastRuleConfiguration;
 import 
org.apache.shardingsphere.broadcast.distsql.statement.CreateBroadcastTableRuleStatement;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.DuplicateRuleException;
+import 
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecuteEngine;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.DuplicateRuleException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentMatchers;
 
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
-import java.util.LinkedList;
+import java.util.HashSet;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+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.verify;
 import static org.mockito.Mockito.when;
 
 class CreateBroadcastTableRuleExecutorTest {
     
-    private final CreateBroadcastTableRuleExecutor executor = new 
CreateBroadcastTableRuleExecutor();
+    private ContextManager mockContextManager(final ShardingSphereDatabase 
database, final BroadcastRule rule) {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        when(database.getName()).thenReturn("foo_db");
+        when(database.getRuleMetaData()).thenReturn(new RuleMetaData(null == 
rule ? Collections.emptyList() : Collections.singleton(rule)));
+        when(result.getDatabase("foo_db")).thenReturn(database);
+        return result;
+    }
     
     @Test
-    void assertCheckSQLStatementWithEmptyStorageUnit() {
-        BroadcastRuleConfiguration currentConfig = 
mock(BroadcastRuleConfiguration.class);
-        
when(currentConfig.getTables()).thenReturn(Collections.singleton("t_address"));
+    void assertExecuteUpdateWithEmptyStorageUnits() {
+        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("t_address"));
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
-        executor.setDatabase(database);
         BroadcastRule rule = mock(BroadcastRule.class);
-        when(rule.getConfiguration()).thenReturn(currentConfig);
-        executor.setRule(rule);
-        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("t_address"));
-        assertThrows(EmptyStorageUnitException.class, () -> 
executor.checkBeforeUpdate(sqlStatement));
+        assertThrows(EmptyStorageUnitException.class, () -> new 
DistSQLUpdateExecuteEngine(sqlStatement, "foo_db", mockContextManager(database, 
rule)).executeUpdate());
     }
     
     @Test
-    void assertCheckSQLStatementWithDuplicateBroadcastRule() {
-        executor.setDatabase(mockShardingSphereDatabase());
+    void assertExecuteUpdateWithDuplicateBroadcastTables() {
+        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("foo_tbl"));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         BroadcastRule rule = mock(BroadcastRule.class);
-        when(rule.getTables()).thenReturn(Collections.singleton("t_address"));
-        executor.setRule(rule);
-        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("t_address"));
-        assertThrows(DuplicateRuleException.class, () -> 
executor.checkBeforeUpdate(sqlStatement));
+        when(rule.getTables()).thenReturn(Collections.singleton("foo_tbl"));
+        assertThrows(DuplicateRuleException.class, () -> new 
DistSQLUpdateExecuteEngine(sqlStatement, "foo_db", mockContextManager(database, 
rule)).executeUpdate());
     }
     
     @Test
-    void assertBuildToBeCreatedRuleConfiguration() {
-        BroadcastRuleConfiguration currentConfig = new 
BroadcastRuleConfiguration(new LinkedList<>());
-        executor.setDatabase(mockShardingSphereDatabase());
+    void assertExecuteUpdateWithIfNotExists() throws SQLException {
+        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(true, new 
ArrayList<>(Arrays.asList("foo_tbl", "bar_tbl")));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         BroadcastRule rule = mock(BroadcastRule.class);
-        when(rule.getConfiguration()).thenReturn(currentConfig);
-        executor.setRule(rule);
-        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("t_address"));
-        executor.checkBeforeUpdate(sqlStatement);
-        BroadcastRuleConfiguration toBeCreatedRuleConfig = 
executor.buildToBeCreatedRuleConfiguration(sqlStatement);
-        assertThat(toBeCreatedRuleConfig.getTables().size(), is(1));
-        assertThat(toBeCreatedRuleConfig.getTables().iterator().next(), 
is("t_address"));
+        when(rule.getTables()).thenReturn(Collections.singleton("foo_tbl"));
+        ContextManager contextManager = mockContextManager(database, rule);
+        new DistSQLUpdateExecuteEngine(sqlStatement, "foo_db", 
contextManager).executeUpdate();
+        MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
+        
verify(metaDataManagerPersistService).alterRuleConfiguration(eq("foo_db"),
+                ArgumentMatchers.<BroadcastRuleConfiguration>argThat(x -> 
x.getTables().equals(new HashSet<>(Arrays.asList("foo_tbl", "bar_tbl")))));
     }
     
-    private ShardingSphereDatabase mockShardingSphereDatabase() {
+    @Test
+    void assertExecuteUpdateWithoutIfNotExists() throws SQLException {
+        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, Collections.singleton("bar_tbl"));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        BroadcastRule rule = mock(BroadcastRule.class);
+        when(rule.getTables()).thenReturn(Collections.singleton("foo_tbl"));
+        ContextManager contextManager = mockContextManager(database, rule);
+        new DistSQLUpdateExecuteEngine(sqlStatement, "foo_db", 
contextManager).executeUpdate();
+        MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
+        
verify(metaDataManagerPersistService).alterRuleConfiguration(eq("foo_db"),
+                ArgumentMatchers.<BroadcastRuleConfiguration>argThat(x -> 
x.getTables().equals(new HashSet<>(Arrays.asList("foo_tbl", "bar_tbl")))));
+    }
+    
+    @Test
+    void assertExecuteUpdateWithoutExistedRule() throws SQLException {
+        CreateBroadcastTableRuleStatement sqlStatement = new 
CreateBroadcastTableRuleStatement(false, new 
ArrayList<>(Arrays.asList("foo_tbl", "bar_tbl")));
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("ds_0",
 mock(StorageUnit.class)));
-        return database;
+        ContextManager contextManager = mockContextManager(database, null);
+        new DistSQLUpdateExecuteEngine(sqlStatement, "foo_db", 
contextManager).executeUpdate();
+        MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
+        
verify(metaDataManagerPersistService).alterRuleConfiguration(eq("foo_db"),
+                ArgumentMatchers.<BroadcastRuleConfiguration>argThat(x -> 
x.getTables().equals(new HashSet<>(Arrays.asList("foo_tbl", "bar_tbl")))));
     }
 }
diff --git 
a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
index 3446ca49999..85f18249981 100644
--- 
a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
+++ 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
@@ -52,16 +52,16 @@ class SetDefaultSingleTableStorageUnitExecutorTest {
         
when(database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
         SingleRule rule = mock(SingleRule.class, RETURNS_DEEP_STUBS);
         
when(rule.getAttributes().findAttribute(DataSourceMapperRuleAttribute.class)).thenReturn(Optional.empty());
-        DistSQLUpdateExecuteEngine engine = new DistSQLUpdateExecuteEngine(new 
SetDefaultSingleTableStorageUnitStatement("foo_ds"), "foo_db", 
mockContextManager(rule, database));
+        DistSQLUpdateExecuteEngine engine = new DistSQLUpdateExecuteEngine(new 
SetDefaultSingleTableStorageUnitStatement("foo_ds"), "foo_db", 
mockContextManager(database, rule));
         assertThrows(MissingRequiredStorageUnitsException.class, 
engine::executeUpdate);
     }
     
     @Test
     void assertExecuteUpdateWithoutDefaultStorageUnit() throws SQLException {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         SingleRule rule = mock(SingleRule.class);
         when(rule.getConfiguration()).thenReturn(new 
SingleRuleConfiguration(Collections.emptyList(), "foo_ds"));
-        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        ContextManager contextManager = mockContextManager(rule, database);
+        ContextManager contextManager = mockContextManager(database, rule);
         new DistSQLUpdateExecuteEngine(new 
SetDefaultSingleTableStorageUnitStatement(null), "foo_db", 
contextManager).executeUpdate();
         MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
         verify(metaDataManagerPersistService)
@@ -71,20 +71,20 @@ class SetDefaultSingleTableStorageUnitExecutorTest {
     
     @Test
     void assertExecuteUpdateWithDefaultStorageUnit() throws SQLException {
-        SingleRule rule = mock(SingleRule.class, RETURNS_DEEP_STUBS);
-        when(rule.getConfiguration()).thenReturn(new 
SingleRuleConfiguration(Collections.emptyList(), "foo_ds"));
-        
when(rule.getAttributes().findAttribute(DataSourceMapperRuleAttribute.class)).thenReturn(Optional.empty());
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         
when(database.getResourceMetaData().getStorageUnits().keySet()).thenReturn(new 
HashSet<>(Arrays.asList("foo_ds", "bar_ds")));
         
when(database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)).thenReturn(Collections.emptyList());
-        ContextManager contextManager = mockContextManager(rule, database);
+        SingleRule rule = mock(SingleRule.class, RETURNS_DEEP_STUBS);
+        when(rule.getConfiguration()).thenReturn(new 
SingleRuleConfiguration(Collections.emptyList(), "foo_ds"));
+        
when(rule.getAttributes().findAttribute(DataSourceMapperRuleAttribute.class)).thenReturn(Optional.empty());
+        ContextManager contextManager = mockContextManager(database, rule);
         new DistSQLUpdateExecuteEngine(new 
SetDefaultSingleTableStorageUnitStatement("bar_ds"), "foo_db", 
contextManager).executeUpdate();
         MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
         
verify(metaDataManagerPersistService).removeRuleConfigurationItem("foo_db", 
null);
         
verify(metaDataManagerPersistService).alterRuleConfiguration(eq("foo_db"), 
ArgumentMatchers.<SingleRuleConfiguration>argThat(x -> 
x.getDefaultDataSource().equals(Optional.of("bar_ds"))));
     }
     
-    private ContextManager mockContextManager(final SingleRule rule, final 
ShardingSphereDatabase database) {
+    private ContextManager mockContextManager(final ShardingSphereDatabase 
database, final SingleRule rule) {
         ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(database.getName()).thenReturn("foo_db");
         when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(rule)));

Reply via email to