package org.infinispan.distribution.ch;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.infinispan.globalstate.ScopedPersistentState;
import org.infinispan.globalstate.impl.ScopedPersistentStateImpl;
import org.infinispan.remoting.transport.Address;
import org.infinispan.topology.PersistentUUID;
import org.infinispan.topology.PersistentUUIDManager;
import org.infinispan.topology.PersistentUUIDManagerImpl;
import org.testng.annotations.Test;
@Test
public abstract class CHPersistenceTest {
protected abstract ConsistentHashFactory<?> createConsistentHashFactory();
protected abstract ConsistentHash createConsistentHash();
public void testCHPersistence() {
PersistentUUIDManager persistentUUIDManager = new PersistentUUIDManagerImpl();
ConsistentHash ch = createConsistentHash();
generateRandomPersistentUUIDs(ch.getMembers(), persistentUUIDManager);
ScopedPersistentState state = new ScopedPersistentStateImpl("scope");
ch.remapAddresses(persistentUUIDManager.addressToPersistentUUID()).toScopedState(state);
ConsistentHashFactory<?> hashFactory = createConsistentHashFactory();
ConsistentHash restoredCH = hashFactory.fromPersistentState(state).remapAddresses(persistentUUIDManager.persistentUUIDToAddress());
assertEquals(ch, restoredCH);
}
public void testCHPersistenceMissingMembers() {
PersistentUUIDManager persistentUUIDManager = new PersistentUUIDManagerImpl();
ConsistentHash ch = createConsistentHash();
Map<Address, PersistentUUID> addressMap = generateRandomPersistentUUIDs(ch.getMembers(), persistentUUIDManager);
ScopedPersistentState state = new ScopedPersistentStateImpl("scope");
ch.remapAddresses(persistentUUIDManager.addressToPersistentUUID()).toScopedState(state);
persistentUUIDManager.removePersistentAddressMapping(addressMap.keySet().iterator().next());
ConsistentHashFactory<?> hashFactory = createConsistentHashFactory();
ConsistentHash restoredCH = hashFactory.fromPersistentState(state).remapAddresses(persistentUUIDManager.persistentUUIDToAddress());
assertNull(restoredCH);
}
private Map<Address, PersistentUUID> generateRandomPersistentUUIDs(List<Address> members, PersistentUUIDManager persistentUUIDManager) {
Map<Address, PersistentUUID> addressMap = new HashMap<>();
for (Address member : members) {
PersistentUUID uuid = PersistentUUID.randomUUID();
persistentUUIDManager.addPersistentAddressMapping(member, uuid);
addressMap.put(member, uuid);
}
return addressMap;
}
}