/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed 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 com.hazelcast.replicatedmap;
import com.hazelcast.config.Config;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.config.ReplicatedMapConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.ReplicatedMap;
import com.hazelcast.replicatedmap.impl.ReplicatedMapProxy;
import com.hazelcast.replicatedmap.impl.ReplicatedMapService;
import com.hazelcast.replicatedmap.impl.record.ReplicatedRecord;
import com.hazelcast.replicatedmap.impl.record.ReplicatedRecordStore;
import com.hazelcast.test.HazelcastTestSupport;
import java.lang.reflect.Field;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public abstract class ReplicatedMapAbstractTest extends HazelcastTestSupport {
protected static Field REPLICATED_MAP_SERVICE;
static {
try {
REPLICATED_MAP_SERVICE = ReplicatedMapProxy.class.getDeclaredField("service");
REPLICATED_MAP_SERVICE.setAccessible(true);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected Config buildConfig(InMemoryFormat inMemoryFormat) {
Config config = new Config();
ReplicatedMapConfig replicatedMapConfig = config.getReplicatedMapConfig("default");
replicatedMapConfig.setInMemoryFormat(inMemoryFormat);
return config;
}
protected void assertMatchSuccessfulOperationQuota(double quota, int completeOps, int... values) {
float[] quotas = new float[values.length];
Object[] args = new Object[values.length + 1];
args[0] = quota;
for (int i = 0; i < values.length; i++) {
quotas[i] = (float) values[i] / completeOps;
args[i + 1] = quotas[i];
}
boolean success = true;
for (int i = 0; i < values.length; i++) {
if (quotas[i] < quota) {
success = false;
break;
}
}
if (!success) {
StringBuilder sb = new StringBuilder("Quote (%s) for updates not reached,");
for (int i = 0; i < values.length; i++) {
sb.append(" map").append(i + 1).append(": %s,");
}
sb.deleteCharAt(sb.length() - 1);
fail(String.format(sb.toString(), args));
}
}
@SuppressWarnings("unchecked")
protected <K, V> ReplicatedRecord<K, V> getReplicatedRecord(ReplicatedMap<K, V> map, K key) throws Exception {
ReplicatedMapProxy<K, V> proxy = (ReplicatedMapProxy<K, V>) map;
ReplicatedMapService service = (ReplicatedMapService) REPLICATED_MAP_SERVICE.get(proxy);
ReplicatedRecordStore store = service.getReplicatedRecordStore(map.getName(), false, key);
return store.getReplicatedRecord(key);
}
@SuppressWarnings("unchecked")
protected <K, V> ReplicatedRecordStore getStore(ReplicatedMap<K, V> map, K key) throws Exception {
ReplicatedMapProxy<K, V> proxy = (ReplicatedMapProxy<K, V>) map;
ReplicatedMapService service = (ReplicatedMapService) REPLICATED_MAP_SERVICE.get(proxy);
return service.getReplicatedRecordStore(map.getName(), false, key);
}
public List<ReplicatedMap> createMapOnEachInstance(HazelcastInstance[] instances, String replicatedMapName) {
ArrayList<ReplicatedMap> maps = new ArrayList<ReplicatedMap>();
for (HazelcastInstance instance : instances) {
ReplicatedMap<Object, Object> replicatedMap = instance.getReplicatedMap(replicatedMapName);
maps.add(replicatedMap);
}
return maps;
}
public ArrayList<Integer> generateRandomIntegerList(int count) {
final ArrayList<Integer> keys = new ArrayList<Integer>();
final Random random = new Random();
for (int i = 0; i < count; i++) {
keys.add(random.nextInt());
}
return keys;
}
protected Set<String> generateRandomKeys(HazelcastInstance instance, int partitionCount) {
Set<String> keys = new HashSet<String>();
for (int partitionId = 0; partitionId < partitionCount; partitionId++) {
keys.add(generateKeyForPartition(instance, partitionId));
}
Set<Integer> partitionIds = new HashSet<Integer>();
for (String key : keys) {
assertTrue(partitionIds.add(getPartitionId(instance, key)));
}
return keys;
}
@SuppressWarnings("unchecked")
protected AbstractMap.SimpleEntry<String, String>[] buildTestValues(Set<String> keys) {
AbstractMap.SimpleEntry<String, String>[] testValues = new AbstractMap.SimpleEntry[keys.size()];
int i = 0;
for (String key : keys) {
testValues[i++] = new AbstractMap.SimpleEntry<String, String>(key, key);
}
return testValues;
}
}