package redis.clients.jedis.tests.commands; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.tests.HostAndPortUtil; import redis.clients.jedis.tests.JedisTestBase; import redis.clients.util.JedisClusterCRC16; import java.util.*; public class ClusterBinaryJedisCommandsTest extends JedisTestBase { private Jedis node1; private static Jedis node2; private static Jedis node3; private HostAndPort nodeInfo1 = HostAndPortUtil.getClusterServers().get(0); private HostAndPort nodeInfo2 = HostAndPortUtil.getClusterServers().get(1); private HostAndPort nodeInfo3 = HostAndPortUtil.getClusterServers().get(2); private final Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>(); JedisCluster jedisCluster; @Before public void setUp() throws InterruptedException { node1 = new Jedis(nodeInfo1.getHost(), nodeInfo1.getPort()); node1.connect(); node1.flushAll(); node2 = new Jedis(nodeInfo2.getHost(), nodeInfo2.getPort()); node2.connect(); node2.flushAll(); node3 = new Jedis(nodeInfo3.getHost(), nodeInfo3.getPort()); node3.connect(); node3.flushAll(); // ---- configure cluster // add nodes to cluster node1.clusterMeet("127.0.0.1", nodeInfo2.getPort()); node1.clusterMeet("127.0.0.1", nodeInfo3.getPort()); // split available slots across the three nodes int slotsPerNode = JedisCluster.HASHSLOTS / 3; int[] node1Slots = new int[slotsPerNode]; int[] node2Slots = new int[slotsPerNode + 1]; int[] node3Slots = new int[slotsPerNode]; for (int i = 0, slot1 = 0, slot2 = 0, slot3 = 0; i < JedisCluster.HASHSLOTS; i++) { if (i < slotsPerNode) { node1Slots[slot1++] = i; } else if (i > slotsPerNode * 2) { node3Slots[slot3++] = i; } else { node2Slots[slot2++] = i; } } node1.clusterAddSlots(node1Slots); node2.clusterAddSlots(node2Slots); node3.clusterAddSlots(node3Slots); waitForClusterReady(); jedisClusterNode.add(new HostAndPort("127.0.0.1", 7379)); jedisCluster = new JedisCluster(jedisClusterNode); } @AfterClass public static void cleanUp() { int slotTest = JedisClusterCRC16.getSlot("test"); int slot51 = JedisClusterCRC16.getSlot("51"); String node3Id = getNodeId(node3.clusterNodes()); node2.clusterSetSlotNode(slotTest, node3Id); node2.clusterSetSlotNode(slot51, node3Id); node2.clusterDelSlots(slotTest, slot51); } @After public void tearDown() { // clear all slots int[] slotsToDelete = new int[JedisCluster.HASHSLOTS]; for (int i = 0; i < JedisCluster.HASHSLOTS; i++) { slotsToDelete[i] = i; } node1.clusterDelSlots(slotsToDelete); node2.clusterDelSlots(slotsToDelete); node3.clusterDelSlots(slotsToDelete); } @SuppressWarnings("unchecked") @Test public void testBinaryGetAndSet() { byte[] byteKey = "foo".getBytes(); byte[] byteValue = "2".getBytes(); jedisCluster.set(byteKey, byteValue); assertEquals(new String(jedisCluster.get(byteKey)), "2"); } @SuppressWarnings("unchecked") @Test public void testIncr() { byte[] byteKey = "foo".getBytes(); byte[] byteValue = "2".getBytes(); jedisCluster.set(byteKey, byteValue); jedisCluster.incr(byteKey); assertEquals(new String(jedisCluster.get(byteKey)), "3"); } @SuppressWarnings("unchecked") @Test public void testSadd() { byte[] byteKey = "languages".getBytes(); byte[] firstLanguage = "java".getBytes(); byte[] secondLanguage = "python".getBytes(); byte[][] listLanguages = { firstLanguage, secondLanguage }; jedisCluster.sadd(byteKey, listLanguages); Set<byte[]> setLanguages = jedisCluster.smembers(byteKey); List<String> languages = new ArrayList<String>(); for (byte[] language : setLanguages) { languages.add(new String(language)); } assertTrue(languages.contains("java")); assertTrue(languages.contains("python")); } @SuppressWarnings("unchecked") @Test public void testHmset() { byte[] byteKey = "language".getBytes(); byte[] language = "java".getBytes(); HashMap<byte[], byte[]> map = new HashMap(); map.put(byteKey, language); jedisCluster.hmset(byteKey, map); List<byte[]> listResults = jedisCluster.hmget(byteKey, byteKey); for (byte[] result : listResults) { String resultString = new String(result); assertEquals(resultString, "java"); } } @SuppressWarnings("unchecked") @Test public void testRpush() { byte[] value1 = "value1".getBytes(); byte[] value2 = "value2".getBytes(); byte[] key = "key1".getBytes(); jedisCluster.del(key); jedisCluster.rpush(key, value1); jedisCluster.rpush(key, value2); long num = 2L; assertEquals(2, (long) jedisCluster.llen(key)); } @Test public void testGetSlot() { assertEquals(JedisClusterCRC16.getSlot("{bar".getBytes()), JedisClusterCRC16.getSlot("{bar")); assertEquals(JedisClusterCRC16.getSlot("{user1000}.following".getBytes()), JedisClusterCRC16.getSlot("{user1000}.followers".getBytes())); assertNotEquals(JedisClusterCRC16.getSlot("foo{}{bar}".getBytes()), JedisClusterCRC16.getSlot("bar".getBytes())); assertEquals(JedisClusterCRC16.getSlot("foo{bar}{zap}".getBytes()), JedisClusterCRC16.getSlot("bar".getBytes())); } private static String getNodeId(String infoOutput) { for (String infoLine : infoOutput.split("\n")) { if (infoLine.contains("myself")) { return infoLine.split(" ")[0]; } } return ""; } private void waitForClusterReady() throws InterruptedException { boolean clusterOk = false; while (!clusterOk) { if (node1.clusterInfo().split("\n")[0].contains("ok") && node2.clusterInfo().split("\n")[0].contains("ok") && node3.clusterInfo().split("\n")[0].contains("ok")) { clusterOk = true; } Thread.sleep(50); } } }