package redis.clients.jedis.tests.utils; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisException; public class JedisClusterTestUtil { public static void waitForClusterReady(Jedis... nodes) throws InterruptedException { boolean clusterOk = false; while (!clusterOk) { boolean isOk = true; for (Jedis node : nodes) { if (!node.clusterInfo().split("\n")[0].contains("ok")) { isOk = false; break; } } if (isOk) { clusterOk = true; } Thread.sleep(50); } } public static String getNodeId(String infoOutput) { for (String infoLine : infoOutput.split("\n")) { if (infoLine.contains("myself")) { return infoLine.split(" ")[0]; } } return ""; } public static String getNodeId(String infoOutput, HostAndPort node) { for (String infoLine : infoOutput.split("\n")) { if (infoLine.contains(node.toString())) { return infoLine.split(" ")[0]; } } return ""; } public static void assertNodeIsKnown(Jedis node, String targetNodeId, int timeoutMs) { assertNodeRecognizedStatus(node, targetNodeId, true, timeoutMs); } public static void assertNodeIsUnknown(Jedis node, String targetNodeId, int timeoutMs) { assertNodeRecognizedStatus(node, targetNodeId, false, timeoutMs); } private static void assertNodeRecognizedStatus(Jedis node, String targetNodeId, boolean shouldRecognized, int timeoutMs) { int sleepInterval = 100; for (int sleepTime = 0; sleepTime <= timeoutMs; sleepTime += sleepInterval) { boolean known = isKnownNode(node, targetNodeId); if (shouldRecognized == known) return; try { Thread.sleep(sleepInterval); } catch (InterruptedException e) { } } throw new JedisException("Node recognize check error"); } private static boolean isKnownNode(Jedis node, String nodeId) { String infoOutput = node.clusterNodes(); for (String infoLine : infoOutput.split("\n")) { if (infoLine.contains(nodeId)) { return true; } } return false; } }