This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 e4b1a47806e Add test cases for DatabaseMetaDataChangedListener (#32877)
e4b1a47806e is described below
commit e4b1a47806edd3a4c0fe5e43b53f9eef5191df6f
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 15 13:53:59 2024 +0800
Add test cases for DatabaseMetaDataChangedListener (#32877)
* Add test cases for DatabaseMetaDataChangedListener
* Add test cases for DatabaseMetaDataChangedListener
---
.../listener/DatabaseMetaDataChangedListener.java | 66 +++++-----
.../DatabaseMetaDataChangedListenerTest.java | 134 +++++++++++++++++++++
2 files changed, 168 insertions(+), 32 deletions(-)
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListener.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListener.java
index fc57df2b405..ab7c363adb1 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListener.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListener.java
@@ -19,7 +19,6 @@ package
org.apache.shardingsphere.mode.manager.cluster.listener;
import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
import
org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode;
@@ -27,19 +26,20 @@ import
org.apache.shardingsphere.metadata.persist.node.metadata.TableMetaDataNod
import
org.apache.shardingsphere.metadata.persist.node.metadata.ViewMetaDataNode;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationEventBuilder;
+import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.AlterStorageNodeEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.RegisterStorageNodeEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.UnregisterStorageNodeEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.AlterStorageUnitEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.RegisterStorageUnitEvent;
import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.UnregisterStorageUnitEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.CreateOrAlterTableEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.DropTableEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.CreateOrAlterViewEvent;
import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.DropViewEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent;
-import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent;
-import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationEventBuilder;
import
org.apache.shardingsphere.mode.repository.cluster.listener.DataChangedEventListener;
import java.util.Optional;
@@ -52,7 +52,7 @@ public final class DatabaseMetaDataChangedListener implements
DataChangedEventLi
private final EventBusContext eventBusContext;
- private final RuleConfigurationEventBuilder ruleConfigurationEventBuilder
= new RuleConfigurationEventBuilder();
+ private final RuleConfigurationEventBuilder builder = new
RuleConfigurationEventBuilder();
@Override
public void onChange(final DataChangedEvent event) {
@@ -62,69 +62,71 @@ public final class DatabaseMetaDataChangedListener
implements DataChangedEventLi
private Optional<DispatchEvent> createDispatchEvent(final DataChangedEvent
event) {
String key = event.getKey();
Optional<String> databaseName =
DatabaseMetaDataNode.getDatabaseNameBySchemaNode(key);
+ if (!databaseName.isPresent()) {
+ return Optional.empty();
+ }
Optional<String> schemaName = DatabaseMetaDataNode.getSchemaName(key);
- if (databaseName.isPresent() && schemaName.isPresent()) {
+ if (schemaName.isPresent()) {
return createSchemaChangedEvent(databaseName.get(),
schemaName.get(), event);
}
schemaName = DatabaseMetaDataNode.getSchemaNameByTableNode(key);
- if (databaseName.isPresent() && schemaName.isPresent() &&
tableMetaDataChanged(event.getKey())) {
+ if (schemaName.isPresent() && tableMetaDataChanged(event.getKey())) {
return createTableChangedEvent(databaseName.get(),
schemaName.get(), event);
}
- if (databaseName.isPresent() && schemaName.isPresent() &&
viewMetaDataChanged(event.getKey())) {
+ if (schemaName.isPresent() && viewMetaDataChanged(event.getKey())) {
return createViewChangedEvent(databaseName.get(),
schemaName.get(), event);
}
- if (!databaseName.isPresent()) {
- return Optional.empty();
- }
if (DataSourceMetaDataNode.isDataSourcesNode(key)) {
return createDataSourceEvent(databaseName.get(), event);
}
- return ruleConfigurationEventBuilder.build(databaseName.get(), event);
+ return builder.build(databaseName.get(), event);
}
private Optional<DispatchEvent> createSchemaChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- if (Type.ADDED == event.getType() || Type.UPDATED == event.getType()) {
- return Optional.of(new SchemaAddedEvent(databaseName, schemaName));
+ switch (event.getType()) {
+ case ADDED:
+ case UPDATED:
+ return Optional.of(new SchemaAddedEvent(databaseName,
schemaName));
+ case DELETED:
+ return Optional.of(new SchemaDeletedEvent(databaseName,
schemaName));
+ default:
+ return Optional.empty();
}
- if (Type.DELETED == event.getType()) {
- return Optional.of(new SchemaDeletedEvent(databaseName,
schemaName));
- }
- return Optional.empty();
}
private boolean tableMetaDataChanged(final String key) {
return TableMetaDataNode.isTableActiveVersionNode(key) ||
TableMetaDataNode.isTableNode(key);
}
- private boolean viewMetaDataChanged(final String key) {
- return ViewMetaDataNode.isViewActiveVersionNode(key) ||
ViewMetaDataNode.isViewNode(key);
- }
-
private Optional<DispatchEvent> createTableChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- if (Type.DELETED == event.getType() &&
TableMetaDataNode.isTableNode(event.getKey())) {
- Optional<String> tableName =
TableMetaDataNode.getTableName(event.getKey());
- Preconditions.checkState(tableName.isPresent(), "Not found table
name.");
- return Optional.of(new DropTableEvent(databaseName, schemaName,
tableName.get()));
- }
if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& TableMetaDataNode.isTableActiveVersionNode(event.getKey())) {
Optional<String> tableName =
TableMetaDataNode.getTableNameByActiveVersionNode(event.getKey());
Preconditions.checkState(tableName.isPresent(), "Not found table
name.");
return Optional.of(new CreateOrAlterTableEvent(databaseName,
schemaName, tableName.get(), event.getKey(), event.getValue()));
}
+ if (Type.DELETED == event.getType() &&
TableMetaDataNode.isTableNode(event.getKey())) {
+ Optional<String> tableName =
TableMetaDataNode.getTableName(event.getKey());
+ Preconditions.checkState(tableName.isPresent(), "Not found table
name.");
+ return Optional.of(new DropTableEvent(databaseName, schemaName,
tableName.get()));
+ }
return Optional.empty();
}
+ private boolean viewMetaDataChanged(final String key) {
+ return ViewMetaDataNode.isViewActiveVersionNode(key) ||
ViewMetaDataNode.isViewNode(key);
+ }
+
private Optional<DispatchEvent> createViewChangedEvent(final String
databaseName, final String schemaName, final DataChangedEvent event) {
- if (Type.DELETED == event.getType() &&
ViewMetaDataNode.isViewNode(event.getKey())) {
- Optional<String> viewName =
ViewMetaDataNode.getViewName(event.getKey());
- Preconditions.checkState(viewName.isPresent(), "Not found view
name.");
- return Optional.of(new DropViewEvent(databaseName, schemaName,
viewName.get(), event.getKey(), event.getValue()));
- }
if ((Type.ADDED == event.getType() || Type.UPDATED == event.getType())
&& ViewMetaDataNode.isViewActiveVersionNode(event.getKey())) {
Optional<String> viewName =
ViewMetaDataNode.getViewNameByActiveVersionNode(event.getKey());
Preconditions.checkState(viewName.isPresent(), "Not found view
name.");
return Optional.of(new CreateOrAlterViewEvent(databaseName,
schemaName, viewName.get(), event.getKey(), event.getValue()));
}
+ if (Type.DELETED == event.getType() &&
ViewMetaDataNode.isViewNode(event.getKey())) {
+ Optional<String> viewName =
ViewMetaDataNode.getViewName(event.getKey());
+ Preconditions.checkState(viewName.isPresent(), "Not found view
name.");
+ return Optional.of(new DropViewEvent(databaseName, schemaName,
viewName.get(), event.getKey(), event.getValue()));
+ }
return Optional.empty();
}
diff --git
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListenerTest.java
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListenerTest.java
new file mode 100644
index 00000000000..ea8cd50c280
--- /dev/null
+++
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/listener/DatabaseMetaDataChangedListenerTest.java
@@ -0,0 +1,134 @@
+/*
+ * 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.manager.cluster.listener;
+
+import lombok.SneakyThrows;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
+import
org.apache.shardingsphere.mode.event.builder.RuleConfigurationEventBuilder;
+import org.apache.shardingsphere.mode.event.dispatch.DispatchEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.AlterStorageNodeEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.RegisterStorageNodeEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.node.UnregisterStorageNodeEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.AlterStorageUnitEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.RegisterStorageUnitEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.datasource.unit.UnregisterStorageUnitEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaAddedEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.SchemaDeletedEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.CreateOrAlterTableEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.table.DropTableEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.CreateOrAlterViewEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.metadata.schema.view.DropViewEvent;
+import
org.apache.shardingsphere.mode.event.dispatch.rule.alter.AlterUniqueRuleItemEvent;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import java.lang.reflect.Field;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+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 DatabaseMetaDataChangedListenerTest {
+
+ private DatabaseMetaDataChangedListener listener;
+
+ @Mock
+ private EventBusContext eventBusContext;
+
+ @BeforeEach
+ void setUp() {
+ listener = new DatabaseMetaDataChangedListener(eventBusContext);
+ RuleConfigurationEventBuilder builder =
mock(RuleConfigurationEventBuilder.class);
+ when(builder.build(eq("foo_db"),
any(DataChangedEvent.class))).thenReturn(Optional.of(new
AlterUniqueRuleItemEvent("foo_db", "key", "value", "type")));
+ setField(builder);
+ }
+
+ @SneakyThrows(ReflectiveOperationException.class)
+ private void setField(final RuleConfigurationEventBuilder builder) {
+ Field field =
DatabaseMetaDataChangedListener.class.getDeclaredField("builder");
+ field.setAccessible(true);
+ field.set(listener, builder);
+ field.setAccessible(false);
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @ArgumentsSource(TestCaseArgumentsProvider.class)
+ void assertOnChangeWithMetaData(final String name, final String eventKey,
final Type type, final Class<? extends DispatchEvent> toBePostedEventType) {
+ listener.onChange(new DataChangedEvent(eventKey, "value", type));
+ if (null == toBePostedEventType) {
+ verify(eventBusContext, times(0)).post(any());
+ } else {
+ verify(eventBusContext).post(any(toBePostedEventType));
+ }
+ }
+
+ private static class TestCaseArgumentsProvider implements
ArgumentsProvider {
+
+ @Override
+ public final Stream<? extends Arguments> provideArguments(final
ExtensionContext extensionContext) {
+ return Stream.of(
+ Arguments.of("changeWithoutDatabase", "/metadata",
Type.IGNORED, null),
+ Arguments.of("addSchema",
"/metadata/foo_db/schemas/foo_schema", Type.ADDED, SchemaAddedEvent.class),
+ Arguments.of("updateSchema",
"/metadata/foo_db/schemas/foo_schema", Type.UPDATED, SchemaAddedEvent.class),
+ Arguments.of("deleteSchema",
"/metadata/foo_db/schemas/foo_schema", Type.DELETED, SchemaDeletedEvent.class),
+ Arguments.of("ignoreChangeSchema",
"/metadata/foo_db/schemas/foo_schema", Type.IGNORED, null),
+ Arguments.of("addTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.ADDED, CreateOrAlterTableEvent.class),
+ Arguments.of("updateTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.UPDATED, CreateOrAlterTableEvent.class),
+ Arguments.of("deleteTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", Type.DELETED,
DropTableEvent.class),
+ Arguments.of("invalidAddTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", Type.ADDED, null),
+ Arguments.of("invalidDeleteTable",
"/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version/0",
Type.DELETED, null),
+ Arguments.of("addView",
"/metadata/foo_db/schemas/foo_schema/views/foo_tbl/active_version/0",
Type.ADDED, CreateOrAlterViewEvent.class),
+ Arguments.of("updateView",
"/metadata/foo_db/schemas/foo_schema/views/foo_tbl/active_version/0",
Type.UPDATED, CreateOrAlterViewEvent.class),
+ Arguments.of("deleteView",
"/metadata/foo_db/schemas/foo_schema/views/foo_tbl", Type.DELETED,
DropViewEvent.class),
+ Arguments.of("invalidAddView",
"/metadata/foo_db/schemas/foo_schema/views/foo_tbl", Type.ADDED, null),
+ Arguments.of("invalidDeleteView",
"/metadata/foo_db/schemas/foo_schema/views/foo_tbl/active_version/0",
Type.DELETED, null),
+ Arguments.of("registerStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.ADDED,
RegisterStorageUnitEvent.class),
+ Arguments.of("alterStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.UPDATED,
AlterStorageUnitEvent.class),
+ Arguments.of("unregisterStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit", Type.DELETED,
UnregisterStorageUnitEvent.class),
+ Arguments.of("invalidRegisterStorageNode",
"/metadata/foo_db/data_sources/units/foo_unit", Type.ADDED, null),
+ Arguments.of("invalidUnregisterStorageNode",
"/metadata/foo_db/data_sources/units/foo_unit/active_version/0", Type.DELETED,
null),
+ Arguments.of("ignoreChangeStorageUnit",
"/metadata/foo_db/data_sources/units/foo_unit", Type.IGNORED, null),
+ Arguments.of("registerStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.ADDED,
RegisterStorageNodeEvent.class),
+ Arguments.of("alterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.UPDATED,
AlterStorageNodeEvent.class),
+ Arguments.of("unregisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.DELETED,
UnregisterStorageNodeEvent.class),
+ Arguments.of("invalidRegisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.ADDED, null),
+ Arguments.of("invalidUnregisterStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node/active_version/0", Type.DELETED,
null),
+ Arguments.of("ignoreChangeStorageNode",
"/metadata/foo_db/data_sources/nodes/foo_node", Type.IGNORED, null),
+ Arguments.of("invalidChangeDataSource",
"/metadata/foo_db/data_sources/other", Type.ADDED, null),
+ Arguments.of("changeRule",
"/metadata/foo_db/schemas/foo_schema/rule/", Type.ADDED,
AlterUniqueRuleItemEvent.class));
+ }
+ }
+}