package org.infinispan.partitionhandling;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "partitionhandling.PartitionHappeningTest")
public class PartitionHappeningTest extends BasePartitionHandlingTest {
public PartitionHappeningTest() {
partitionHandling = false;
}
public void testPartitionHappening() throws Throwable {
final List<ViewChangedHandler> listeners = new ArrayList<>();
for (int i = 0; i < caches().size(); i++) {
ViewChangedHandler listener = new ViewChangedHandler();
cache(i).getCacheManager().addListener(listener);
listeners.add(listener);
}
splitCluster(new int[]{0, 1}, new int[]{2, 3});
eventually(() -> {
for (ViewChangedHandler l : listeners)
if (!l.notified) return false;
return true;
});
eventuallyEquals(2, () -> advancedCache(0).getRpcManager().getTransport().getMembers().size());
eventually(() -> clusterAndChFormed(0, 2));
eventually(() -> clusterAndChFormed(1, 2));
eventually(() -> clusterAndChFormed(2, 2));
eventually(() -> clusterAndChFormed(3, 2));
cache(0).put("k", "v1");
cache(2).put("k", "v2");
assertEquals(cache(0).get("k"), "v1");
assertEquals(cache(1).get("k"), "v1");
assertEquals(cache(2).get("k"), "v2");
assertEquals(cache(3).get("k"), "v2");
partition(0).merge(partition(1));
assertTrue(clusterAndChFormed(0, 4));
assertTrue(clusterAndChFormed(1, 4));
assertTrue(clusterAndChFormed(2, 4));
assertTrue(clusterAndChFormed(3, 4));
}
public boolean clusterAndChFormed(int cacheIndex, int memberCount) {
return advancedCache(cacheIndex).getRpcManager().getTransport().getMembers().size() == memberCount &&
advancedCache(cacheIndex).getDistributionManager().getWriteConsistentHash().getMembers().size() == memberCount;
}
}