package com.lambdaworks.redis.cluster; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createMap; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createNode; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createPartitions; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; import java.util.Map; import org.junit.Test; import com.lambdaworks.redis.RedisURI; import com.lambdaworks.redis.cluster.models.partitions.Partitions; import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode; /** * @author Mark Paluch */ public class KnownMajorityPartitionsConsensusTest { private RedisClusterNode node1 = createNode(1); private RedisClusterNode node2 = createNode(2); private RedisClusterNode node3 = createNode(3); private RedisClusterNode node4 = createNode(4); private RedisClusterNode node5 = createNode(5); @Test public void sameSharedViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4, node5); Partitions partitions1 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions2 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions3 = createPartitions(node1, node2, node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } @Test public void addedNodeViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4); Partitions partitions1 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions2 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions3 = createPartitions(node1, node2, node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } @Test public void removedNodeViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4, node5); Partitions partitions1 = createPartitions(node1, node2, node3, node4); Partitions partitions2 = createPartitions(node1, node2, node3, node4); Partitions partitions3 = createPartitions(node1, node2, node3, node4); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } @Test public void mixedViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4, node5); Partitions partitions1 = createPartitions(node1, node2, node3, node4); Partitions partitions2 = createPartitions(node1, node2, node3, node5); Partitions partitions3 = createPartitions(node1, node2, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } @Test public void clusterSplitViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4, node5); Partitions partitions1 = createPartitions(node1, node2); Partitions partitions2 = createPartitions(node1, node2); Partitions partitions3 = createPartitions(node1, node2, node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(result).isEqualTo(partitions3).isNotEqualTo(partitions1); } @Test public void strangeClusterSplitViewShouldDecideForKnownMajority() throws Exception { Partitions current = createPartitions(node1, node2, node3, node4, node5); Partitions partitions1 = createPartitions(node1); Partitions partitions2 = createPartitions(node2); Partitions partitions3 = createPartitions(node3); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.KNOWN_MAJORITY.getPartitions(current, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } }