This is an automated email from the ASF dual-hosted git repository. jxue pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/helix.git
commit 7669a05ae7460bc2445e083a3e45c871e627a207 Author: Molly Gao <[email protected]> AuthorDate: Wed Apr 6 10:53:22 2022 -0700 Fix TestCloudEventCallbackProperty by bypassing connecting to zk (#2017) Due to logical change in ZKHelixManager constructor in a #1986, TestCloudEventCallbackProperty broke because in this test it doesn't connect to zookeeper server. To fix this test, we separated MockCloudEventAwareHelixManager (previously called MockEventAwareZKHelixManager, nested inside TestCloudEventCallbackProperty)into a class, and include all and only the logics related to cloud events in MockCloudEventAwareHelixManager. More detailed, we mock a cloud config object retrieved from zk to bypass connection to zk. --- .../event/MockCloudEventAwareHelixManager.java | 378 +++++++++++++++++++++ .../event/TestCloudEventCallbackProperty.java | 43 +-- 2 files changed, 379 insertions(+), 42 deletions(-) diff --git a/helix-core/src/test/java/org/apache/helix/cloud/event/MockCloudEventAwareHelixManager.java b/helix-core/src/test/java/org/apache/helix/cloud/event/MockCloudEventAwareHelixManager.java new file mode 100644 index 000000000..772a9b9ef --- /dev/null +++ b/helix-core/src/test/java/org/apache/helix/cloud/event/MockCloudEventAwareHelixManager.java @@ -0,0 +1,378 @@ +package org.apache.helix.cloud.event; + +/* + * 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. + */ + +import java.util.Optional; +import java.util.Set; + +import org.apache.helix.ClusterMessagingService; +import org.apache.helix.ConfigAccessor; +import org.apache.helix.HelixAdmin; +import org.apache.helix.HelixCloudProperty; +import org.apache.helix.HelixDataAccessor; +import org.apache.helix.HelixManager; +import org.apache.helix.HelixManagerProperties; +import org.apache.helix.HelixManagerProperty; +import org.apache.helix.InstanceType; +import org.apache.helix.LiveInstanceInfoProvider; +import org.apache.helix.PreConnectCallback; +import org.apache.helix.PropertyKey; +import org.apache.helix.api.listeners.ClusterConfigChangeListener; +import org.apache.helix.api.listeners.ConfigChangeListener; +import org.apache.helix.api.listeners.ControllerChangeListener; +import org.apache.helix.api.listeners.CurrentStateChangeListener; +import org.apache.helix.api.listeners.CustomizedStateChangeListener; +import org.apache.helix.api.listeners.CustomizedStateConfigChangeListener; +import org.apache.helix.api.listeners.CustomizedStateRootChangeListener; +import org.apache.helix.api.listeners.CustomizedViewChangeListener; +import org.apache.helix.api.listeners.CustomizedViewRootChangeListener; +import org.apache.helix.api.listeners.ExternalViewChangeListener; +import org.apache.helix.api.listeners.IdealStateChangeListener; +import org.apache.helix.api.listeners.InstanceConfigChangeListener; +import org.apache.helix.api.listeners.LiveInstanceChangeListener; +import org.apache.helix.api.listeners.MessageListener; +import org.apache.helix.api.listeners.ResourceConfigChangeListener; +import org.apache.helix.api.listeners.ScopedConfigChangeListener; +import org.apache.helix.cloud.constants.CloudProvider; +import org.apache.helix.cloud.event.helix.HelixCloudEventListener; +import org.apache.helix.controller.pipeline.Pipeline; +import org.apache.helix.healthcheck.ParticipantHealthReportCollector; +import org.apache.helix.model.CloudConfig; +import org.apache.helix.model.HelixConfigScope; +import org.apache.helix.participant.StateMachineEngine; +import org.apache.helix.store.zk.ZkHelixPropertyStore; +import org.apache.helix.zookeeper.datamodel.ZNRecord; + +public class MockCloudEventAwareHelixManager implements HelixManager { + private final HelixManagerProperty _helixManagerProperty; + private CloudEventListener _cloudEventListener; + + /** + * Use a mock zk helix manager to avoid the need to connect to zk + * Change the cloud event related logic here every time the real logic is modified in ZKHelixManager + */ + public MockCloudEventAwareHelixManager(HelixManagerProperty helixManagerProperty) { + _helixManagerProperty = helixManagerProperty; + _helixManagerProperty.getHelixCloudProperty().populateFieldsWithCloudConfig( + new CloudConfig.Builder().setCloudEnabled(true).setCloudProvider(CloudProvider.AZURE) + .build()); + } + + public void connect() throws IllegalAccessException, InstantiationException { + if (_helixManagerProperty != null) { + HelixCloudProperty helixCloudProperty = _helixManagerProperty.getHelixCloudProperty(); + if (helixCloudProperty != null && helixCloudProperty.isCloudEventCallbackEnabled()) { + _cloudEventListener = + new HelixCloudEventListener(helixCloudProperty.getCloudEventCallbackProperty(), this); + CloudEventHandlerFactory.getInstance().registerCloudEventListener(_cloudEventListener); + } + } + } + + public void disconnect() { + if (_cloudEventListener != null) { + CloudEventHandlerFactory.getInstance().unregisterCloudEventListener(_cloudEventListener); + _cloudEventListener = null; + } + } + + @Override + public boolean isConnected() { + return false; + } + + @Override + public void addIdealStateChangeListener(IdealStateChangeListener listener) throws Exception { + + } + + @Override + public void addIdealStateChangeListener(org.apache.helix.IdealStateChangeListener listener) + throws Exception { + + } + + @Override + public void addLiveInstanceChangeListener(LiveInstanceChangeListener listener) throws Exception { + + } + + @Override + public void addLiveInstanceChangeListener(org.apache.helix.LiveInstanceChangeListener listener) + throws Exception { + + } + + @Override + public void addConfigChangeListener(ConfigChangeListener listener) throws Exception { + + } + + @Override + public void addInstanceConfigChangeListener(InstanceConfigChangeListener listener) + throws Exception { + + } + + @Override + public void addInstanceConfigChangeListener( + org.apache.helix.InstanceConfigChangeListener listener) throws Exception { + + } + + @Override + public void addResourceConfigChangeListener(ResourceConfigChangeListener listener) + throws Exception { + + } + + @Override + public void addCustomizedStateConfigChangeListener(CustomizedStateConfigChangeListener listener) + throws Exception { + + } + + @Override + public void addClusterfigChangeListener(ClusterConfigChangeListener listener) throws Exception { + + } + + @Override + public void addConfigChangeListener(ScopedConfigChangeListener listener, + HelixConfigScope.ConfigScopeProperty scope) throws Exception { + + } + + @Override + public void addConfigChangeListener(org.apache.helix.ScopedConfigChangeListener listener, + HelixConfigScope.ConfigScopeProperty scope) throws Exception { + + } + + @Override + public void addMessageListener(MessageListener listener, String instanceName) throws Exception { + + } + + @Override + public void addMessageListener(org.apache.helix.MessageListener listener, String instanceName) + throws Exception { + + } + + @Override + public void addCurrentStateChangeListener(CurrentStateChangeListener listener, + String instanceName, String sessionId) throws Exception { + + } + + @Override + public void addCurrentStateChangeListener(org.apache.helix.CurrentStateChangeListener listener, + String instanceName, String sessionId) throws Exception { + + } + + @Override + public void addTaskCurrentStateChangeListener(CurrentStateChangeListener listener, + String instanceName, String sessionId) throws Exception { + + } + + @Override + public void addCustomizedStateRootChangeListener(CustomizedStateRootChangeListener listener, + String instanceName) throws Exception { + + } + + @Override + public void addCustomizedStateChangeListener(CustomizedStateChangeListener listener, + String instanceName, String stateName) throws Exception { + + } + + @Override + public void addExternalViewChangeListener(ExternalViewChangeListener listener) throws Exception { + + } + + @Override + public void addCustomizedViewChangeListener(CustomizedViewChangeListener listener, + String customizedStateType) throws Exception { + + } + + @Override + public void addCustomizedViewRootChangeListener(CustomizedViewRootChangeListener listener) + throws Exception { + + } + + @Override + public void addTargetExternalViewChangeListener(ExternalViewChangeListener listener) + throws Exception { + + } + + @Override + public void addExternalViewChangeListener(org.apache.helix.ExternalViewChangeListener listener) + throws Exception { + + } + + @Override + public void addControllerListener(ControllerChangeListener listener) { + + } + + @Override + public void addControllerListener(org.apache.helix.ControllerChangeListener listener) { + + } + + @Override + public void addControllerMessageListener(MessageListener listener) { + + } + + @Override + public void addControllerMessageListener(org.apache.helix.MessageListener listener) { + + } + + @Override + public void setEnabledControlPipelineTypes(Set<Pipeline.Type> types) { + + } + + @Override + public boolean removeListener(PropertyKey key, Object listener) { + return false; + } + + @Override + public HelixDataAccessor getHelixDataAccessor() { + return null; + } + + @Override + public ConfigAccessor getConfigAccessor() { + return null; + } + + @Override + public String getClusterName() { + return null; + } + + @Override + public String getMetadataStoreConnectionString() { + return null; + } + + @Override + public String getInstanceName() { + return null; + } + + @Override + public String getSessionId() { + return null; + } + + @Override + public long getLastNotificationTime() { + return 0; + } + + @Override + public HelixAdmin getClusterManagmentTool() { + return null; + } + + @Override + public ZkHelixPropertyStore<ZNRecord> getHelixPropertyStore() { + return null; + } + + @Override + public ClusterMessagingService getMessagingService() { + return null; + } + + @Override + public InstanceType getInstanceType() { + return null; + } + + @Override + public String getVersion() { + return null; + } + + @Override + public HelixManagerProperties getProperties() { + return null; + } + + @Override + public StateMachineEngine getStateMachineEngine() { + return null; + } + + @Override + public Long getSessionStartTime() { + return null; + } + + @Override + public Optional<String> getSessionIdIfLead() { + return Optional.empty(); + } + + @Override + public boolean isLeader() { + return false; + } + + @Override + public void startTimerTasks() { + + } + + @Override + public void stopTimerTasks() { + + } + + @Override + public void addPreConnectCallback(PreConnectCallback callback) { + + } + + @Override + public void setLiveInstanceInfoProvider(LiveInstanceInfoProvider liveInstanceInfoProvider) { + + } + + @Override + public ParticipantHealthReportCollector getHealthReportCollector() { + return null; + } +} \ No newline at end of file diff --git a/helix-core/src/test/java/org/apache/helix/cloud/event/TestCloudEventCallbackProperty.java b/helix-core/src/test/java/org/apache/helix/cloud/event/TestCloudEventCallbackProperty.java index 70d9e1bf1..7207cbccc 100644 --- a/helix-core/src/test/java/org/apache/helix/cloud/event/TestCloudEventCallbackProperty.java +++ b/helix-core/src/test/java/org/apache/helix/cloud/event/TestCloudEventCallbackProperty.java @@ -24,13 +24,10 @@ import java.util.Collections; import org.apache.helix.HelixCloudProperty; import org.apache.helix.HelixManager; import org.apache.helix.HelixManagerProperty; -import org.apache.helix.InstanceType; import org.apache.helix.cloud.event.helix.CloudEventCallbackProperty; import org.apache.helix.cloud.event.helix.CloudEventCallbackProperty.HelixOperation; import org.apache.helix.cloud.event.helix.CloudEventCallbackProperty.UserDefinedCallbackType; import org.apache.helix.cloud.event.helix.HelixCloudEventListener; -import org.apache.helix.manager.zk.HelixManagerStateListener; -import org.apache.helix.manager.zk.ZKHelixManager; import org.apache.helix.model.CloudConfig; import org.apache.helix.zookeeper.datamodel.ZNRecord; import org.testng.Assert; @@ -55,9 +52,7 @@ public class TestCloudEventCallbackProperty { HelixManagerProperty managerProperty = managerPropertyBuilder.build(); // Create Helix Manager - _helixManager = - new MockEventAwareZKHelixManager(CLUSTER_NAME, "instanceName", InstanceType.PARTICIPANT, - null, null, managerProperty); + _helixManager = new MockCloudEventAwareHelixManager(managerProperty); } @AfterTest @@ -200,40 +195,4 @@ public class TestCloudEventCallbackProperty { private boolean callbackTriggered(MockCloudEventCallbackImpl.OperationType type) { return MockCloudEventCallbackImpl.triggeredOperation.contains(type); } - - public static class MockEventAwareZKHelixManager extends ZKHelixManager { - private final HelixManagerProperty _helixManagerProperty; - private CloudEventListener _cloudEventListener; - - /** - * Use a mock zk helix manager to avoid the need to connect to zk - */ - public MockEventAwareZKHelixManager(String clusterName, String instanceName, - InstanceType instanceType, String zkAddress, HelixManagerStateListener stateListener, - HelixManagerProperty helixManagerProperty) { - super(clusterName, instanceName, instanceType, zkAddress, stateListener, - helixManagerProperty); - _helixManagerProperty = helixManagerProperty; - } - - @Override - public void connect() throws IllegalAccessException, InstantiationException { - if (_helixManagerProperty != null) { - HelixCloudProperty helixCloudProperty = _helixManagerProperty.getHelixCloudProperty(); - if (helixCloudProperty != null && helixCloudProperty.isCloudEventCallbackEnabled()) { - _cloudEventListener = - new HelixCloudEventListener(helixCloudProperty.getCloudEventCallbackProperty(), this); - CloudEventHandlerFactory.getInstance().registerCloudEventListener(_cloudEventListener); - } - } - } - - @Override - public void disconnect() { - if (_cloudEventListener != null) { - CloudEventHandlerFactory.getInstance().unregisterCloudEventListener(_cloudEventListener); - _cloudEventListener = null; - } - } - } }
