package org.apache.helix; /* * 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.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.Future; import org.I0Itec.zkclient.DataUpdater; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.IZkDataListener; import org.apache.helix.PropertyKey.Builder; import org.apache.helix.api.TransitionHandler; import org.apache.helix.messaging.AsyncCallback; import org.apache.helix.messaging.handling.HelixTaskExecutor; import org.apache.helix.messaging.handling.HelixTaskResult; import org.apache.helix.messaging.handling.MessageHandlerFactory; import org.apache.helix.messaging.handling.MessageTask; import org.apache.helix.model.HelixConfigScope.ConfigScopeProperty; import org.apache.helix.model.Message; import org.apache.helix.participant.StateMachineEngine; import org.apache.helix.participant.statemachine.StateModelInfo; import org.apache.helix.participant.statemachine.Transition; import org.apache.helix.store.zk.ZkHelixPropertyStore; import org.apache.zookeeper.data.Stat; public class Mocks { public static class MockBaseDataAccessor implements BaseDataAccessor<ZNRecord> { Map<String, ZNRecord> map = new HashMap<String, ZNRecord>(); @Override public boolean create(String path, ZNRecord record, int options) { // TODO Auto-generated method stub return false; } @Override public boolean set(String path, ZNRecord record, int options) { System.err.println("Store.write()" + System.currentTimeMillis()); map.put(path, record); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } return true; } @Override public boolean update(String path, DataUpdater<ZNRecord> updater, int options) { // TODO Auto-generated method stub return false; } @Override public boolean remove(String path, int options) { // TODO Auto-generated method stub return false; } @Override public boolean[] createChildren(List<String> paths, List<ZNRecord> records, int options) { // TODO Auto-generated method stub return null; } @Override public boolean[] setChildren(List<String> paths, List<ZNRecord> records, int options) { // TODO Auto-generated method stub return null; } @Override public boolean[] updateChildren(List<String> paths, List<DataUpdater<ZNRecord>> updaters, int options) { // TODO Auto-generated method stub return null; } @Override public boolean[] remove(List<String> paths, int options) { // TODO Auto-generated method stub return null; } @Override public ZNRecord get(String path, Stat stat, int options) { return map.get(path); } @Override public List<ZNRecord> get(List<String> paths, List<Stat> stats, int options) { // TODO Auto-generated method stub return null; } @Override public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int options) { // TODO Auto-generated method stub return null; } @Override public List<String> getChildNames(String parentPath, int options) { // TODO Auto-generated method stub return null; } @Override public boolean exists(String path, int options) { // TODO Auto-generated method stub return false; } @Override public boolean[] exists(List<String> paths, int options) { // TODO Auto-generated method stub return null; } @Override public Stat[] getStats(List<String> paths, int options) { // TODO Auto-generated method stub return null; } @Override public Stat getStat(String path, int options) { // TODO Auto-generated method stub return null; } @Override public void subscribeDataChanges(String path, IZkDataListener listener) { // TODO Auto-generated method stub } @Override public void unsubscribeDataChanges(String path, IZkDataListener listener) { // TODO Auto-generated method stub } @Override public List<String> subscribeChildChanges(String path, IZkChildListener listener) { // TODO Auto-generated method stub return null; } @Override public void unsubscribeChildChanges(String path, IZkChildListener listener) { // TODO Auto-generated method stub } @Override public void reset() { // TODO Auto-generated method stub } @Override public boolean set(String path, ZNRecord record, int options, int expectVersion) { // TODO Auto-generated method stub return false; } } public static class MockStateModel extends TransitionHandler { boolean stateModelInvoked = false; public void onBecomeMasterFromSlave(Message msg, NotificationContext context) { stateModelInvoked = true; } public void onBecomeSlaveFromOffline(Message msg, NotificationContext context) { stateModelInvoked = true; } } @StateModelInfo(states = "{'OFFLINE','SLAVE','MASTER'}", initialState = "OFFINE") public static class MockStateModelAnnotated extends TransitionHandler { boolean stateModelInvoked = false; @Transition(from = "SLAVE", to = "MASTER") public void slaveToMaster(Message msg, NotificationContext context) { stateModelInvoked = true; } @Transition(from = "OFFLINE", to = "SLAVE") public void offlineToSlave(Message msg, NotificationContext context) { stateModelInvoked = true; } } public static class MockHelixTaskExecutor extends HelixTaskExecutor { boolean completionInvoked = false; @Override public void finishTask(MessageTask task) { System.out.println("Mocks.MockCMTaskExecutor.finishTask()"); completionInvoked = true; } public boolean isDone(String taskId) { Future<HelixTaskResult> future = _taskMap.get(taskId).getFuture(); if (future != null) { return future.isDone(); } return false; } } public static class MockManager implements HelixManager { MockAccessor accessor; private final String _clusterName; private final String _sessionId; String _instanceName; ClusterMessagingService _msgSvc; private String _version; HelixManagerProperties _properties = new HelixManagerProperties(); public MockManager() { this("testCluster-" + Math.random() * 10000 % 999); } public MockManager(String clusterName) { _clusterName = clusterName; accessor = new MockAccessor(clusterName); _sessionId = UUID.randomUUID().toString(); _instanceName = "testInstanceName"; _msgSvc = new MockClusterMessagingService(); } @Override public void disconnect() { } @Override public void addIdealStateChangeListener(IdealStateChangeListener listener) throws Exception { // TODO Auto-generated method stub } @Override public void addLiveInstanceChangeListener(LiveInstanceChangeListener listener) { // TODO Auto-generated method stub } @Override public void addMessageListener(MessageListener listener, String instanceName) { // TODO Auto-generated method stub } @Override public void addCurrentStateChangeListener(CurrentStateChangeListener listener, String instanceName, String sessionId) { // TODO Auto-generated method stub } @Override public void addExternalViewChangeListener(ExternalViewChangeListener listener) { // TODO Auto-generated method stub } @Override public String getClusterName() { return _clusterName; } @Override public String getInstanceName() { return _instanceName; } @Override public void connect() { // TODO Auto-generated method stub } @Override public String getSessionId() { return _sessionId; } @Override public boolean isConnected() { // TODO Auto-generated method stub return false; } @Override public long getLastNotificationTime() { // TODO Auto-generated method stub return 0; } @Override public void addControllerListener(ControllerChangeListener listener) { // TODO Auto-generated method stub } @Override public boolean removeListener(PropertyKey key, Object listener) { // TODO Auto-generated method stub return false; } @Override public HelixAdmin getClusterManagmentTool() { // TODO Auto-generated method stub return null; } @Override public ClusterMessagingService getMessagingService() { // TODO Auto-generated method stub return _msgSvc; } @Override public InstanceType getInstanceType() { return InstanceType.PARTICIPANT; } @Override public String getVersion() { return _version; } public void setVersion(String version) { _properties.getProperties().put("clustermanager.version", version); _version = version; } @Override public StateMachineEngine getStateMachineEngine() { // TODO Auto-generated method stub return null; } @Override public boolean isLeader() { // TODO Auto-generated method stub return false; } @Override public ConfigAccessor getConfigAccessor() { // TODO Auto-generated method stub return null; } @Override public void startTimerTasks() { // TODO Auto-generated method stub } @Override public void stopTimerTasks() { // TODO Auto-generated method stub } @Override public HelixDataAccessor getHelixDataAccessor() { return accessor; } @Override public void addPreConnectCallback(PreConnectCallback callback) { // TODO Auto-generated method stub } @Override public ZkHelixPropertyStore<ZNRecord> getHelixPropertyStore() { // TODO Auto-generated method stub return null; } @Override public void addInstanceConfigChangeListener(InstanceConfigChangeListener listener) throws Exception { // TODO Auto-generated method stub } @Override public void addConfigChangeListener(ScopedConfigChangeListener listener, ConfigScopeProperty scope) throws Exception { // TODO Auto-generated method stub } @Override public void setLiveInstanceInfoProvider(LiveInstanceInfoProvider liveInstanceInfoProvider) { // TODO Auto-generated method stub } @Override public HelixManagerProperties getProperties() { // TODO Auto-generated method stub return _properties; } @Override public void addControllerMessageListener(MessageListener listener) { // TODO Auto-generated method stub } } public static class MockAccessor implements HelixDataAccessor { private final String _clusterName; Map<String, ZNRecord> data = new HashMap<String, ZNRecord>(); private final Builder _propertyKeyBuilder; public MockAccessor() { this("testCluster-" + Math.random() * 10000 % 999); } public MockAccessor(String clusterName) { _clusterName = clusterName; _propertyKeyBuilder = new PropertyKey.Builder(_clusterName); } Map<String, ZNRecord> map = new HashMap<String, ZNRecord>(); @Override public boolean setProperty(PropertyKey key, HelixProperty value) { String path = key.getPath(); data.put(path, value.getRecord()); return true; } @Override public <T extends HelixProperty> boolean updateProperty(PropertyKey key, T value) { String path = key.getPath(); PropertyType type = key.getType(); if (type.updateOnlyOnExists) { if (data.containsKey(path)) { if (type.mergeOnUpdate) { ZNRecord znRecord = new ZNRecord(data.get(path)); znRecord.merge(value.getRecord()); data.put(path, znRecord); } else { data.put(path, value.getRecord()); } } } else { if (type.mergeOnUpdate) { if (data.containsKey(path)) { ZNRecord znRecord = new ZNRecord(data.get(path)); znRecord.merge(value.getRecord()); data.put(path, znRecord); } else { data.put(path, value.getRecord()); } } else { data.put(path, value.getRecord()); } } return true; } @SuppressWarnings("unchecked") @Override public <T extends HelixProperty> T getProperty(PropertyKey key) { String path = key.getPath(); return (T) HelixProperty.convertToTypedInstance(key.getTypeClass(), data.get(path)); } @Override public boolean removeProperty(PropertyKey key) { String path = key.getPath(); // PropertyPathConfig.getPath(type, // _clusterName, keys); data.remove(path); return true; } @Override public List<String> getChildNames(PropertyKey propertyKey) { List<String> child = new ArrayList<String>(); String path = propertyKey.getPath(); for (String key : data.keySet()) { if (key.startsWith(path)) { String[] keySplit = key.split("\\/"); String[] pathSplit = path.split("\\/"); if (keySplit.length > pathSplit.length) { child.add(keySplit[pathSplit.length]); } } } return child; } @SuppressWarnings("unchecked") @Override public <T extends HelixProperty> List<T> getChildValues(PropertyKey propertyKey) { List<ZNRecord> childs = new ArrayList<ZNRecord>(); String path = propertyKey.getPath(); // PropertyPathConfig.getPath(type, // _clusterName, keys); for (String key : data.keySet()) { if (key.startsWith(path)) { String[] keySplit = key.split("\\/"); String[] pathSplit = path.split("\\/"); if (keySplit.length - pathSplit.length == 1) { ZNRecord record = data.get(key); if (record != null) { childs.add(record); } } else { System.out.println("keySplit:" + Arrays.toString(keySplit)); System.out.println("pathSplit:" + Arrays.toString(pathSplit)); } } } return (List<T>) HelixProperty.convertToTypedList(propertyKey.getTypeClass(), childs); } @Override public <T extends HelixProperty> Map<String, T> getChildValuesMap(PropertyKey key) { List<T> list = getChildValues(key); return HelixProperty.convertListToMap(list); } @Override public <T extends HelixProperty> boolean createProperty(PropertyKey key, T value) { // TODO Auto-generated method stub return false; } @Override public <T extends HelixProperty> boolean[] createChildren(List<PropertyKey> keys, List<T> children) { // TODO Auto-generated method stub return null; } @Override public <T extends HelixProperty> boolean[] setChildren(List<PropertyKey> keys, List<T> children) { // TODO Auto-generated method stub return null; } @Override public Builder keyBuilder() { return _propertyKeyBuilder; } @Override public BaseDataAccessor<ZNRecord> getBaseDataAccessor() { // TODO Auto-generated method stub return null; } @Override public <T extends HelixProperty> boolean[] updateChildren(List<String> paths, List<DataUpdater<ZNRecord>> updaters, int options) { // TODO Auto-generated method stub return null; } @Override public <T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys) { List<T> list = new ArrayList<T>(); for (PropertyKey key : keys) { @SuppressWarnings("unchecked") T t = (T) getProperty(key); list.add(t); } return list; } } public static class MockClusterMessagingService implements ClusterMessagingService { @Override public int send(Criteria recipientCriteria, Message message) { // TODO Auto-generated method stub return 0; } @Override public int send(Criteria receipientCriteria, Message message, AsyncCallback callbackOnReply, int timeOut) { // TODO Auto-generated method stub return 0; } @Override public int sendAndWait(Criteria receipientCriteria, Message message, AsyncCallback callbackOnReply, int timeOut) { // TODO Auto-generated method stub return 0; } @Override public void registerMessageHandlerFactory(String type, MessageHandlerFactory factory) { // TODO Auto-generated method stub } @Override public int send(Criteria receipientCriteria, Message message, AsyncCallback callbackOnReply, int timeOut, int retryCount) { // TODO Auto-generated method stub return 0; } @Override public int sendAndWait(Criteria receipientCriteria, Message message, AsyncCallback callbackOnReply, int timeOut, int retryCount) { // TODO Auto-generated method stub return 0; } @Override public Map<InstanceType, List<Message>> generateMessage(Criteria recipientCriteria, Message messageTemplate) { // TODO Auto-generated method stub return null; } } }