package com.lambdaworks.redis.cluster.models.partitions; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import org.junit.Test; import com.lambdaworks.redis.RedisURI; /** * @author Mark Paluch */ public class PartitionsTest { private RedisClusterNode node1 = new RedisClusterNode(RedisURI.create("localhost", 6379), "a", true, "", 0, 0, 0, Arrays.asList(1, 2, 3), new HashSet<>()); private RedisClusterNode node2 = new RedisClusterNode(RedisURI.create("localhost", 6380), "b", true, "", 0, 0, 0, Arrays.asList(4, 5, 6), new HashSet<>()); @Test public void contains() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.contains(node1)).isTrue(); assertThat(partitions.contains(node2)).isFalse(); } @Test public void containsUsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().add(node1); assertThat(partitions.contains(node1)).isFalse(); partitions.updateCache(); assertThat(partitions.contains(node1)).isTrue(); } @Test public void containsAll() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); partitions.add(node2); assertThat(partitions.containsAll(Arrays.asList(node1, node2))).isTrue(); } @Test public void containsAllUsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().add(node1); assertThat(partitions.containsAll(Arrays.asList(node1))).isFalse(); partitions.updateCache(); assertThat(partitions.containsAll(Arrays.asList(node1))).isTrue(); } @Test public void add() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); partitions.add(node2); assertThat(partitions.getPartitionBySlot(1)).isEqualTo(node1); assertThat(partitions.getPartitionBySlot(5)).isEqualTo(node2); } @Test public void addPartitionClearsCache() throws Exception { Partitions partitions = new Partitions(); partitions.addPartition(node1); assertThat(partitions.getPartitionBySlot(1)).isNull(); } @Test public void addAll() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); assertThat(partitions.getPartitionBySlot(1)).isEqualTo(node1); assertThat(partitions.getPartitionBySlot(5)).isEqualTo(node2); } @Test public void getPartitionBySlot() throws Exception { Partitions partitions = new Partitions(); assertThat(partitions.getPartitionBySlot(1)).isNull(); partitions.add(node1); assertThat(partitions.getPartitionBySlot(1)).isEqualTo(node1); } @Test public void remove() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); partitions.remove(node1); assertThat(partitions.getPartitionBySlot(1)).isNull(); assertThat(partitions.getPartitionBySlot(5)).isEqualTo(node2); } @Test public void removeAll() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); partitions.removeAll(Arrays.asList(node1)); assertThat(partitions.getPartitionBySlot(1)).isNull(); assertThat(partitions.getPartitionBySlot(5)).isEqualTo(node2); } @Test public void clear() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); partitions.clear(); assertThat(partitions.getPartitionBySlot(1)).isNull(); assertThat(partitions.getPartitionBySlot(5)).isNull(); } @Test public void retainAll() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); partitions.retainAll(Arrays.asList(node2)); assertThat(partitions.getPartitionBySlot(1)).isNull(); assertThat(partitions.getPartitionBySlot(5)).isEqualTo(node2); } @Test public void toArray() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); assertThat(partitions.toArray()).contains(node1, node2); } @Test public void toArrayUsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().addAll(Arrays.asList(node1, node2)); assertThat(partitions.toArray()).doesNotContain(node1, node2); partitions.updateCache(); assertThat(partitions.toArray()).contains(node1, node2); } @Test public void toArray2() throws Exception { Partitions partitions = new Partitions(); partitions.addAll(Arrays.asList(node1, node2)); assertThat(partitions.toArray(new RedisClusterNode[2])).contains(node1, node2); } @Test public void toArray2UsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().addAll(Arrays.asList(node1, node2)); assertThat(partitions.toArray(new RedisClusterNode[2])).doesNotContain(node1, node2); partitions.updateCache(); assertThat(partitions.toArray(new RedisClusterNode[2])).contains(node1, node2); } @Test public void getPartitionByNodeId() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); partitions.add(node2); assertThat(partitions.getPartitionByNodeId("a")).isEqualTo(node1); assertThat(partitions.getPartitionByNodeId("c")).isNull(); } @Test public void reload() throws Exception { RedisClusterNode other = new RedisClusterNode(RedisURI.create("localhost", 6666), "c", true, "", 0, 0, 0, Arrays.asList(1, 2, 3, 4, 5, 6), new HashSet<>()); Partitions partitions = new Partitions(); partitions.add(other); partitions.reload(Arrays.asList(node1, node1)); assertThat(partitions.getPartitionByNodeId("a")).isEqualTo(node1); assertThat(partitions.getPartitionBySlot(1)).isEqualTo(node1); } @Test public void reloadEmpty() throws Exception { Partitions partitions = new Partitions(); partitions.reload(Arrays.asList()); assertThat(partitions.getPartitionBySlot(1)).isNull(); } @Test public void isEmpty() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.isEmpty()).isFalse(); } @Test public void size() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.size()).isEqualTo(1); } @Test public void sizeUsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().add(node1); assertThat(partitions.size()).isEqualTo(0); partitions.updateCache(); assertThat(partitions.size()).isEqualTo(1); } @Test public void getPartition() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.getPartition(0)).isEqualTo(node1); } @Test public void iterator() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.iterator().next()).isEqualTo(node1); } @Test public void iteratorUsesReadView() throws Exception { Partitions partitions = new Partitions(); partitions.getPartitions().add(node1); assertThat(partitions.iterator().hasNext()).isFalse(); partitions.updateCache(); assertThat(partitions.iterator().hasNext()).isTrue(); } @Test public void iteratorIsSafeDuringUpdate() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); partitions.add(node2); Iterator<RedisClusterNode> iterator = partitions.iterator(); partitions.remove(node2); assertThat(iterator.hasNext()).isTrue(); assertThat(iterator.next()).isEqualTo(node1); assertThat(iterator.next()).isEqualTo(node2); iterator = partitions.iterator(); partitions.remove(node2); assertThat(iterator.hasNext()).isTrue(); assertThat(iterator.next()).isEqualTo(node1); assertThat(iterator.hasNext()).isFalse(); } @Test public void testToString() throws Exception { Partitions partitions = new Partitions(); partitions.add(node1); assertThat(partitions.toString()).startsWith("Partitions ["); } }