package com.lambdaworks.redis.cluster; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.hasItem; import static org.junit.Assert.assertThat; import java.util.Collections; import java.util.HashSet; import java.util.concurrent.TimeUnit; import org.junit.Test; import com.lambdaworks.redis.RedisURI; import com.lambdaworks.redis.cluster.models.partitions.ClusterPartitionParser; import com.lambdaworks.redis.cluster.models.partitions.Partitions; import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode; import com.lambdaworks.redis.internal.LettuceLists; public class ClusterPartitionParserTest { private static String nodes = "c37ab8396be428403d4e55c0d317348be27ed973 127.0.0.1:7381 master - 111 1401258245007 222 connected 7000 12000 12002-16383\n" + "3d005a179da7d8dc1adae6409d47b39c369e992b 127.0.0.1:7380 master - 0 1401258245007 2 disconnected 8000-11999 [8000->-4213a8dabb94f92eb6a860f4d0729e6a25d43e0c] [5461-<-c37ab8396be428403d4e55c0d317348be27ed973]\n" + "4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 127.0.0.1:7379 myself,slave 4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 0 0 1 connected 0-6999 7001-7999 12001\n" + "5f4a2236d00008fba7ac0dd24b95762b446767bd :0 myself,master - 0 0 1 connected [5460->-5f4a2236d00008fba7ac0dd24b95762b446767bd] [5461-<-5f4a2236d00008fba7ac0dd24b95762b446767bd]"; private static String nodesWithIPv6Addresses = "c37ab8396be428403d4e55c0d317348be27ed973 affe:affe:123:34::1:7381 master - 111 1401258245007 222 connected 7000 12000 12002-16383\n" + "3d005a179da7d8dc1adae6409d47b39c369e992b [dead:beef:dead:beef::1]:7380 master - 0 1401258245007 2 disconnected 8000-11999 [8000->-4213a8dabb94f92eb6a860f4d0729e6a25d43e0c] [5461-<-c37ab8396be428403d4e55c0d317348be27ed973]\n" + "4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 127.0.0.1:7379 myself,slave 4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 0 0 1 connected 0-6999 7001-7999 12001\n" + "5f4a2236d00008fba7ac0dd24b95762b446767bd :0 myself,master - 0 0 1 connected [5460->-5f4a2236d00008fba7ac0dd24b95762b446767bd] [5461-<-5f4a2236d00008fba7ac0dd24b95762b446767bd]"; private static String nodesWithBusPort = "c37ab8396be428403d4e55c0d317348be27ed973 127.0.0.1:7381@17381 slave 4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 0 1454482721690 3 connected\n" + "3d005a179da7d8dc1adae6409d47b39c369e992b 127.0.0.1:7380@17380 master - 0 1454482721690 0 connected 12000-16383\n" + "4213a8dabb94f92eb6a860f4d0729e6a25d43e0c 127.0.0.1:7379@17379 myself,master - 0 0 1 connected 0-11999\n" + "5f4a2236d00008fba7ac0dd24b95762b446767bd 127.0.0.1:7382@17382 slave 3d005a179da7d8dc1adae6409d47b39c369e992b 0 1454482721690 2 connected"; @Test public void shouldParseNodesCorrectly() throws Exception { Partitions result = ClusterPartitionParser.parse(nodes); assertThat(result.getPartitions()).hasSize(4); RedisClusterNode p1 = result.getPartitions().get(0); assertThat(p1.getNodeId()).isEqualTo("c37ab8396be428403d4e55c0d317348be27ed973"); assertThat(p1.getUri().getHost()).isEqualTo("127.0.0.1"); assertThat(p1.getUri().getPort()).isEqualTo(7381); assertThat(p1.getSlaveOf()).isNull(); assertThat(p1.getFlags()).isEqualTo(Collections.singleton(RedisClusterNode.NodeFlag.MASTER)); assertThat(p1.getPingSentTimestamp()).isEqualTo(111); assertThat(p1.getPongReceivedTimestamp()).isEqualTo(1401258245007L); assertThat(p1.getConfigEpoch()).isEqualTo(222); assertThat(p1.isConnected()).isTrue(); assertThat(p1.getSlots(), hasItem(7000)); assertThat(p1.getSlots(), hasItem(12000)); assertThat(p1.getSlots(), hasItem(12002)); assertThat(p1.getSlots(), hasItem(12003)); assertThat(p1.getSlots(), hasItem(16383)); RedisClusterNode p3 = result.getPartitions().get(2); assertThat(p3.getSlaveOf()).isEqualTo("4213a8dabb94f92eb6a860f4d0729e6a25d43e0c"); assertThat(p3.toString()).contains(RedisClusterNode.class.getSimpleName()); assertThat(result.toString()).contains(Partitions.class.getSimpleName()); } @Test public void shouldParseNodesWithBusPort() throws Exception { Partitions result = ClusterPartitionParser.parse(nodesWithBusPort); assertThat(result.getPartitions()).hasSize(4); RedisClusterNode p1 = result.getPartitions().get(0); assertThat(p1.getNodeId()).isEqualTo("c37ab8396be428403d4e55c0d317348be27ed973"); assertThat(p1.getUri().getHost()).isEqualTo("127.0.0.1"); assertThat(p1.getUri().getPort()).isEqualTo(7381); } @Test public void shouldParseNodesIPv6Address() throws Exception { Partitions result = ClusterPartitionParser.parse(nodesWithIPv6Addresses); assertThat(result.getPartitions()).hasSize(4); RedisClusterNode p1 = result.getPartitions().get(0); assertThat(p1.getUri().getHost()).isEqualTo("affe:affe:123:34::1"); assertThat(p1.getUri().getPort()).isEqualTo(7381); RedisClusterNode p2 = result.getPartitions().get(1); assertThat(p2.getUri().getHost()).isEqualTo("dead:beef:dead:beef::1"); assertThat(p2.getUri().getPort()).isEqualTo(7380); } @Test public void getNodeByHashShouldReturnCorrectNode() throws Exception { Partitions partitions = ClusterPartitionParser.parse(nodes); assertThat(partitions.getPartitionBySlot(7000).getNodeId()).isEqualTo("c37ab8396be428403d4e55c0d317348be27ed973"); assertThat(partitions.getPartitionBySlot(5460).getNodeId()).isEqualTo("4213a8dabb94f92eb6a860f4d0729e6a25d43e0c"); } @Test public void testModel() throws Exception { RedisClusterNode node = mockRedisClusterNode(); assertThat(node.toString()).contains(RedisClusterNode.class.getSimpleName()); assertThat(node.hasSlot(1)).isTrue(); assertThat(node.hasSlot(9)).isFalse(); } protected RedisClusterNode mockRedisClusterNode() { RedisClusterNode node = new RedisClusterNode(); node.setConfigEpoch(1); node.setConnected(true); node.setFlags(new HashSet<>()); node.setNodeId("abcd"); node.setPingSentTimestamp(2); node.setPongReceivedTimestamp(3); node.setSlaveOf("me"); node.setSlots(LettuceLists.unmodifiableList(1, 2, 3)); node.setUri(new RedisURI("localhost", 1, 1, TimeUnit.DAYS)); return node; } @Test public void createNode() throws Exception { RedisClusterNode original = mockRedisClusterNode(); RedisClusterNode created = RedisClusterNode.of(original.getNodeId()); assertThat(original).isEqualTo(created); } }