package com.lambdaworks.redis.cluster.models.slots; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import com.google.common.net.HostAndPort; import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode; import com.lambdaworks.redis.internal.LettuceLists; @SuppressWarnings("unchecked") public class ClusterSlotsParserTest { @Test public void testEmpty() throws Exception { List<ClusterSlotRange> result = ClusterSlotsParser.parse(new ArrayList<>()); assertThat(result).isNotNull().isEmpty(); } @Test public void testOneString() throws Exception { List<ClusterSlotRange> result = ClusterSlotsParser.parse(LettuceLists.newList("")); assertThat(result).isNotNull().isEmpty(); } @Test public void testOneStringInList() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("0")); List<ClusterSlotRange> result = ClusterSlotsParser.parse(list); assertThat(result).isNotNull().isEmpty(); } @Test public void testParse() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("0", "1", LettuceLists.newList("1", "2"))); List<ClusterSlotRange> result = ClusterSlotsParser.parse(list); assertThat(result).hasSize(1); assertThat(result.get(0).getMaster()).isNotNull(); assertThat(result.get(0).getMasterNode()).isNotNull(); } @Test public void testParseWithSlave() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("100", "200", LettuceLists.newList("1", "2", "nodeId1"), LettuceLists.newList("1", 2, "nodeId2"))); List<ClusterSlotRange> result = ClusterSlotsParser.parse(list); assertThat(result).hasSize(1); ClusterSlotRange clusterSlotRange = result.get(0); assertThat(clusterSlotRange.getMaster()).isNotNull(); assertThat(clusterSlotRange.getMaster().getHostText()).isEqualTo("1"); assertThat(clusterSlotRange.getMaster().getPort()).isEqualTo(2); RedisClusterNode masterNode = clusterSlotRange.getMasterNode(); assertThat(masterNode).isNotNull(); assertThat(masterNode.getNodeId()).isEqualTo("nodeId1"); assertThat(masterNode.getUri().getHost()).isEqualTo("1"); assertThat(masterNode.getUri().getPort()).isEqualTo(2); assertThat(masterNode.getFlags()).contains(RedisClusterNode.NodeFlag.MASTER); assertThat(masterNode.getSlots()).contains(100, 101, 199, 200); assertThat(masterNode.getSlots()).doesNotContain(99, 201); assertThat(masterNode.getSlots()).hasSize(101); assertThat(clusterSlotRange.getSlaves()).hasSize(1); assertThat(clusterSlotRange.getSlaveNodes()).hasSize(1); HostAndPort slave = clusterSlotRange.getSlaves().get(0); assertThat(slave.getHostText()).isEqualTo("1"); assertThat(slave.getPort()).isEqualTo(2); RedisClusterNode slaveNode = clusterSlotRange.getSlaveNodes().get(0); assertThat(slaveNode.getNodeId()).isEqualTo("nodeId2"); assertThat(slaveNode.getSlaveOf()).isEqualTo("nodeId1"); assertThat(slaveNode.getFlags()).contains(RedisClusterNode.NodeFlag.SLAVE); } @Test public void testSameNode() throws Exception { List<?> list = Arrays.asList( LettuceLists.newList("100", "200", LettuceLists.newList("1", "2", "nodeId1"), LettuceLists.newList("1", 2, "nodeId2")), LettuceLists.newList("200", "300", LettuceLists.newList("1", "2", "nodeId1"), LettuceLists.newList("1", 2, "nodeId2"))); List<ClusterSlotRange> result = ClusterSlotsParser.parse(list); assertThat(result).hasSize(2); assertThat(result.get(0).getMasterNode()).isSameAs(result.get(1).getMasterNode()); RedisClusterNode masterNode = result.get(0).getMasterNode(); assertThat(masterNode).isNotNull(); assertThat(masterNode.getNodeId()).isEqualTo("nodeId1"); assertThat(masterNode.getUri().getHost()).isEqualTo("1"); assertThat(masterNode.getUri().getPort()).isEqualTo(2); assertThat(masterNode.getFlags()).contains(RedisClusterNode.NodeFlag.MASTER); assertThat(masterNode.getSlots()).contains(100, 101, 199, 200, 203); assertThat(masterNode.getSlots()).doesNotContain(99, 301); assertThat(masterNode.getSlots()).hasSize(201); } @Test public void testHostAndPortConstructor() throws Exception { ClusterSlotRange clusterSlotRange = new ClusterSlotRange(100, 200, HostAndPort.fromParts("1", 2), LettuceLists.newList( HostAndPort.fromParts("1", 2))); RedisClusterNode masterNode = clusterSlotRange.getMasterNode(); assertThat(masterNode).isNotNull(); assertThat(masterNode.getNodeId()).isNull(); assertThat(masterNode.getUri().getHost()).isEqualTo("1"); assertThat(masterNode.getUri().getPort()).isEqualTo(2); assertThat(masterNode.getFlags()).contains(RedisClusterNode.NodeFlag.MASTER); assertThat(clusterSlotRange.getSlaves()).hasSize(1); assertThat(clusterSlotRange.getSlaveNodes()).hasSize(1); HostAndPort slave = clusterSlotRange.getSlaves().get(0); assertThat(slave.getHostText()).isEqualTo("1"); assertThat(slave.getPort()).isEqualTo(2); RedisClusterNode slaveNode = clusterSlotRange.getSlaveNodes().get(0); assertThat(slaveNode.getNodeId()).isNull(); assertThat(slaveNode.getSlaveOf()).isNull(); assertThat(slaveNode.getFlags()).contains(RedisClusterNode.NodeFlag.SLAVE); } @Test public void testParseWithSlaveAndNodeIds() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("0", "1", LettuceLists.newList("1", "2"), LettuceLists.newList("1", 2))); List<ClusterSlotRange> result = ClusterSlotsParser.parse(list); assertThat(result).hasSize(1); assertThat(result.get(0).getMaster()).isNotNull(); assertThat(result.get(0).getSlaves()).hasSize(1); } @Test(expected = IllegalArgumentException.class) public void testParseInvalidMaster() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("0", "1", LettuceLists.newList("1"))); ClusterSlotsParser.parse(list); } @Test(expected = IllegalArgumentException.class) public void testParseInvalidMaster2() throws Exception { List<?> list = Arrays.asList(LettuceLists.newList("0", "1", "")); ClusterSlotsParser.parse(list); } @Test public void testModel() throws Exception { ClusterSlotRange range = new ClusterSlotRange(); range.setFrom(1); range.setTo(2); range.setSlaves(new ArrayList<>()); range.setMaster(HostAndPort.fromHost("localhost")); assertThat(range.toString()).contains(ClusterSlotRange.class.getSimpleName()); } }