package redis.client; import com.google.common.base.Charsets; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import redis.reply.BulkReply; import redis.reply.IntegerReply; import redis.reply.MultiBulkReply; import redis.reply.StatusReply; import java.io.IOException; import java.util.Arrays; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.fail; import static redis.client.RedisClientBase.ALPHA; import static redis.client.RedisClientBase.BY; import static redis.client.RedisClientBase.DESC; import static redis.client.RedisClientBase.GET; import static redis.client.RedisClientBase.LIMIT; import static redis.client.RedisClientBase.STORE; import static redis.client.RedisClientBase.WEIGHTS; import static redis.client.RedisClientBase.WITHSCORES; public class AllCommandsTest { private static RedisClient rc; private static RedisClient.Pipeline p; private static RedisClient rc2; @BeforeClass public static void setup() throws IOException { rc = new RedisClient("localhost", 6379); p = rc.pipeline(); rc2 = new RedisClient("localhost", 6379); } @AfterClass public static void shutdown() throws IOException { rc.close(); rc2.close(); } @Test public void testDefaultAuthDB() throws IOException { rc.config_set("requirepass", "test"); RedisClient test = new RedisClient("localhost", 6379, 1, "test"); try { test.set("foo", "bar"); } catch (RedisException e) { fail("default passwd failed"); } test.config_set("requirepass", ""); rc.select(1); if (!new String(rc.get("foo").data()).equals("bar")) fail("default db failed"); rc.del("foo"); } @Test public void testauth() throws IOException { rc.config_set("requirepass", "test"); RedisClient authtest = new RedisClient("localhost", 6379); try { authtest.info(null); fail("should have thrown"); } catch (RedisException re) { assertEquals("ERR operation not permitted", re.getMessage()); } rc.auth("test"); rc.config_set("requirepass", ""); authtest.info(null); } @Test public void append() { rc.del(a("mykey")); eq(5, rc.append("mykey", "Hello")); eq(11, rc.append("mykey", " World")); eq("Hello World", rc.get("mykey")); } @Test public void bitcount() { rc.set("bitkey", "A"); eq(2, rc.bitcount("bitkey", null, null)); } @Test public void bitop() { rc.set("bitkey1", "A"); rc.set("bitkey2", "B"); eq(1, rc.bitop("xor", "bitkey", new Object[] { "bitkey1", "bitkey2" })); eq("\03".getBytes(), rc.get("bitkey").data()); } @Test public void blpop() { rc.del(a("list1", "list2")); eq(3, rc.rpush("list1", a("a", "b", "c"))); eq(a("list1", "a"), rc.blpop(a("list1", "list2", "0"))); } @Test public void brpop() { rc.del(a("list1", "list2")); eq(3, rc.rpush("list1", a("a", "b", "c"))); eq(a("list1", "c"), rc.brpop(a("list1", "list2", "0"))); } @Test public void decr() { eq("OK", rc.set("mykey", "10")); eq(9, rc.decr("mykey")); eq("OK", rc.set("mykey", "234293482390480948029348230948")); try { rc.decr("mykey"); fail("Should have failed"); } catch (RedisException e) { // failed } } @Test public void decrby() { eq("OK", rc.set("mykey", "10")); eq(5, rc.decrby("mykey", 5)); } @Test public void del() { rc.del(a("key1", "key2", "key3")); eq("OK", rc.set("key1", "Hello")); eq("OK", rc.set("key2", "World")); eq(2, rc.del(a("key1", "key2", "key3"))); } @Test public void eval() { // Commenting out for now until I upgrade my Redis // eq(a("key1", "key2", "first", "second"), // (MultiBulkReply) rc.eval("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", 2, // a("key1", "key2", "first", "second"))); } @Test public void exists() { rc.del_("key1", "key2"); eq("OK", rc.set("key1", "value")); eq(1, rc.exists("key1")); eq(0, rc.exists("key2")); } @Test public void get() { rc.del_("key"); eq("OK", rc.set("key", "value")); eq("value", rc.get("key")); } @Test public void sort() { rc.del_("list"); eq(5, rc.lpush_("list", "a", "b", "c", "ab", "bc")); eq(a("a", "ab", "b", "bc", "c"), (MultiBulkReply) rc.sort_("list", ALPHA)); eq(a("a", "ab", "b"), (MultiBulkReply) rc.sort_("list", ALPHA, LIMIT, 0, 3)); eq(a("c", "bc", "b", "ab", "a"), (MultiBulkReply) rc.sort_("list", ALPHA, DESC)); eq("OK", rc.mset_("w_a", 1, "w_b", 2, "w_c", 3, "w_ab", 4, "w_bc", 5)); eq(a("a", "b", "c", "ab", "bc"), (MultiBulkReply) rc.sort_("list", BY, "w_*")); eq("OK", rc.mset_("o_a", 1, "o_b", 2, "o_c", 3, "o_ab", 4, "o_bc", 5)); eq(a("1", "2", "3", "4", "5"), (MultiBulkReply) rc.sort_("list", BY, "w_*", GET, "o_*")); eq(5, (IntegerReply) rc.sort_("list", ALPHA, STORE, "result")); eq(a("a", "ab", "b", "bc", "c"), rc.lrange("result", 0, 10)); } @Test public void zadd() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "1", "uno"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(0, rc.zadd(a("myzset", "3", "two"))); eq(a("one", "1", "uno", "1", "two", "3"), rc.zrange("myzset", "0", "-1", WITHSCORES)); } @Test public void zcard() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(2, rc.zcard("myzset")); } @Test public void zcount() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(3, rc.zcount("myzset", "-inf", "inf")); eq(2, rc.zcount("myzset", "(1", "3")); } @Test public void zincrby() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq("3", rc.zincrby("myzset", "2", "one")); eq(a("two", "2", "one", "3"), rc.zrange("myzset", "0", "-1", WITHSCORES)); } @Test public void zinterstore() { rc.del(a("zset1", "zset2")); eq(1, rc.zadd(a("zset1", "1", "one"))); eq(1, rc.zadd(a("zset1", "2", "two"))); eq(1, rc.zadd(a("zset2", "1", "one"))); eq(1, rc.zadd(a("zset2", "2", "two"))); eq(1, rc.zadd(a("zset2", "3", "three"))); eq(2, rc.zinterstore("out", 2, a("zset1", "zset2", WEIGHTS, "2", "3"))); eq(a("one", "5", "two", "10"), rc.zrange("out", "0", "-1", WITHSCORES)); } @Test public void zrange() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(a("one", "two", "three"), rc.zrange_("myzset", "0", "-1")); eq(a("three"), rc.zrange_("myzset", "2", "3")); eq(a("two", "three"), rc.zrange_("myzset", "-2", "-1")); } @Test public void zrangebyscore() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(a("one", "two", "three"), rc.zrangebyscore_("myzset", "-inf", "inf")); eq(a("one", "two"), rc.zrangebyscore_("myzset", "1", "2")); eq(a("two"), rc.zrangebyscore_("myzset", "(1", "2")); eq(a(), rc.zrangebyscore_("myzset", "(1", "(2")); } @Test public void zrank() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(2, (IntegerReply) rc.zrank("myzset", "three")); eq(null, (BulkReply) rc.zrank("myzset", "four")); } @Test public void zrem() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(1, rc.zrem_("myzset", "two")); eq(a("one", "1", "three", "3"), rc.zrange("myzset", "0", "-1", WITHSCORES)); } @Test public void zremrangebyrank() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(2, rc.zremrangebyrank("myzset", "0", "1")); eq(a("three", "3"), rc.zrange("myzset", "0", "-1", WITHSCORES)); } @Test public void zremrangebyscore() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(1, rc.zremrangebyscore("myzset", "-inf", "(2")); eq(a("two", "2", "three", "3"), rc.zrange("myzset", "0", "-1", WITHSCORES)); } @Test public void zrevrange() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(a("three", "two", "one"), rc.zrevrange_("myzset", 0, -1)); eq(a("one"), rc.zrevrange_("myzset", 2, 3)); eq(a("two", "one"), rc.zrevrange_("myzset", -2, -1)); } @Test public void zrevrangebyscore() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(a("three", "two", "one"), rc.zrevrangebyscore_("myzset", "+inf", "-inf")); eq(a("two", "one"), rc.zrevrangebyscore_("myzset", 2, 1)); eq(a("two"), rc.zrevrangebyscore_("myzset", 2, "(1")); eq(a(), rc.zrevrangebyscore_("myzset", "(2", "(1")); } @Test public void zrevrank() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq(1, rc.zadd(a("myzset", "2", "two"))); eq(1, rc.zadd(a("myzset", "3", "three"))); eq(2, (IntegerReply) rc.zrevrank("myzset", "one")); eq(null, (BulkReply) rc.zrevrank("myzset", "four")); } @Test public void zscore() { rc.del(a("myzset")); eq(1, rc.zadd(a("myzset", "1", "one"))); eq("1", rc.zscore("myzset", "one")); } @Test public void zunionstore() throws ExecutionException, InterruptedException { RedisClient.Pipeline rc = p; rc.del(a("zset1", "zset2")); eq(1, rc.zadd(a("zset1", "1", "one"))); eq(1, rc.zadd(a("zset1", "2", "two"))); eq(1, rc.zadd(a("zset2", "1", "one"))); eq(1, rc.zadd(a("zset2", "2", "two"))); eq(1, rc.zadd(a("zset2", "3", "three"))); eq(3, rc.zunionstore_("out", 2, "zset1", "zset2", WEIGHTS, 2, 3)); eq(a("one", "5", "three", "9", "two", "10"), rc.zrange_("out", 0, -1, WITHSCORES)); } private void eq(Object[] a, CompletableFuture<MultiBulkReply> out) throws ExecutionException, InterruptedException { eq(a, out.get()); } private void eq(int i, CompletableFuture<IntegerReply> zadd) throws ExecutionException, InterruptedException { eq(i, zadd.get()); } private void eq(String exepcted, StatusReply actual) { assertEquals(exepcted, actual.data()); } private void eq(Object[] expected, MultiBulkReply actual) { assertEquals(Arrays.asList(expected), actual.asStringList(Charsets.UTF_8)); } private void eq(String expected, BulkReply actual) { assertEquals(expected, actual.asUTF8String()); } private void eq(long expected, IntegerReply actual) { assertEquals(expected, (long) actual.data()); } private void eq(byte[] bytes1, byte[] bytes2) { assertEquals(bytes1.length, bytes2.length); for (int i = 0; i < bytes1.length; i++) { assertEquals(bytes1[i], bytes2[i]); } } private Object[] a(Object... args) { return args; } }