// Copyright (C) 2011 - Will Glozer. All rights reserved.
package com.lambdaworks.redis.commands;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotEquals;
import java.util.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import com.lambdaworks.redis.*;
public class KeyCommandTest extends AbstractRedisClientTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void del() throws Exception {
redis.set(key, value);
assertThat((long) redis.del(key)).isEqualTo(1);
redis.set(key + "1", value);
redis.set(key + "2", value);
assertThat(redis.del(key + "1", key + "2")).isEqualTo(2);
}
@Test
public void unlink() throws Exception {
redis.set(key, value);
assertThat((long) redis.unlink(key)).isEqualTo(1);
redis.set(key + "1", value);
redis.set(key + "2", value);
assertThat(redis.unlink(key + "1", key + "2")).isEqualTo(2);
}
@Test
public void dump() throws Exception {
assertThat(redis.dump("invalid")).isNull();
redis.set(key, value);
assertThat(redis.dump(key).length > 0).isTrue();
}
@Test
public void exists() throws Exception {
assertThat(redis.exists(key)).isFalse();
redis.set(key, value);
assertThat(redis.exists(key)).isTrue();
}
@Test
public void existsVariadic() throws Exception {
assertThat(redis.exists(key, "key2", "key3")).isEqualTo(0);
redis.set(key, value);
redis.set("key2", value);
assertThat(redis.exists(key, "key2", "key3")).isEqualTo(2);
}
@Test
public void expire() throws Exception {
assertThat(redis.expire(key, 10)).isFalse();
redis.set(key, value);
assertThat(redis.expire(key, 10)).isTrue();
assertThat((long) redis.ttl(key)).isEqualTo(10);
}
@Test
public void expireat() throws Exception {
Date expiration = new Date(System.currentTimeMillis() + 10000);
assertThat(redis.expireat(key, expiration)).isFalse();
redis.set(key, value);
assertThat(redis.expireat(key, expiration)).isTrue();
assertThat(redis.ttl(key)).isGreaterThanOrEqualTo(8);
}
@Test
public void keys() throws Exception {
assertThat(redis.keys("*")).isEqualTo(list());
Map<String, String> map = new LinkedHashMap<>();
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
redis.mset(map);
List<String> keys = redis.keys("???");
assertThat(keys).hasSize(2);
assertThat(keys.contains("one")).isTrue();
assertThat(keys.contains("two")).isTrue();
}
@Test
public void keysStreaming() throws Exception {
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
assertThat(redis.keys("*")).isEqualTo(list());
Map<String, String> map = new LinkedHashMap<>();
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
redis.mset(map);
Long count = redis.keys(adapter, "???");
assertThat(count.intValue()).isEqualTo(2);
List<String> keys = adapter.getList();
assertThat(keys).hasSize(2);
assertThat(keys.contains("one")).isTrue();
assertThat(keys.contains("two")).isTrue();
}
@Test
public void move() throws Exception {
redis.set(key, value);
redis.move(key, 1);
assertThat(redis.get(key)).isNull();
redis.select(1);
assertThat(redis.get(key)).isEqualTo(value);
}
@Test
public void objectEncoding() throws Exception {
redis.set(key, value);
assertThat(redis.objectEncoding(key)).isEqualTo("embstr");
redis.set(key, String.valueOf(1));
assertThat(redis.objectEncoding(key)).isEqualTo("int");
}
@Test
public void objectIdletime() throws Exception {
redis.set(key, value);
assertThat((long) redis.objectIdletime(key)).isLessThan(2);
}
@Test
public void objectRefcount() throws Exception {
redis.set(key, value);
assertThat(redis.objectRefcount(key)).isGreaterThan(0);
}
@Test
public void persist() throws Exception {
assertThat(redis.persist(key)).isFalse();
redis.set(key, value);
assertThat(redis.persist(key)).isFalse();
redis.expire(key, 10);
assertThat(redis.persist(key)).isTrue();
}
@Test
public void pexpire() throws Exception {
assertThat(redis.pexpire(key, 5000)).isFalse();
redis.set(key, value);
assertThat(redis.pexpire(key, 5000)).isTrue();
assertThat(redis.pttl(key)).isGreaterThan(0).isLessThanOrEqualTo(5000);
}
@Test
public void pexpireat() throws Exception {
Date expiration = new Date(System.currentTimeMillis() + 5000);
assertThat(redis.pexpireat(key, expiration)).isFalse();
redis.set(key, value);
assertThat(redis.pexpireat(key, expiration)).isTrue();
assertThat(redis.pttl(key)).isGreaterThan(0).isLessThanOrEqualTo(5000);
}
@Test
public void pttl() throws Exception {
assertThat((long) redis.pttl(key)).isEqualTo(-2);
redis.set(key, value);
assertThat((long) redis.pttl(key)).isEqualTo(-1);
redis.pexpire(key, 5000);
assertThat(redis.pttl(key)).isGreaterThan(0).isLessThanOrEqualTo(5000);
}
@Test
public void randomkey() throws Exception {
assertThat(redis.randomkey()).isNull();
redis.set(key, value);
assertThat(redis.randomkey()).isEqualTo(key);
}
@Test
public void rename() throws Exception {
redis.set(key, value);
assertThat(redis.rename(key, key + "X")).isEqualTo("OK");
assertThat(redis.get(key)).isNull();
assertThat(redis.get(key + "X")).isEqualTo(value);
redis.set(key, value + "X");
assertThat(redis.rename(key + "X", key)).isEqualTo("OK");
assertThat(redis.get(key)).isEqualTo(value);
}
@Test(expected = RedisException.class)
public void renameNonexistentKey() throws Exception {
redis.rename(key, key + "X");
}
@Test
public void renamenx() throws Exception {
redis.set(key, value);
assertThat(redis.renamenx(key, key + "X")).isTrue();
assertThat(redis.get(key + "X")).isEqualTo(value);
redis.set(key, value);
assertThat(redis.renamenx(key + "X", key)).isFalse();
}
@Test(expected = RedisException.class)
public void renamenxNonexistentKey() throws Exception {
redis.renamenx(key, key + "X");
}
@Test
public void renamenxIdenticalKeys() throws Exception {
redis.set(key, value);
assertThat(redis.renamenx(key, key)).isFalse();
}
@Test
public void restore() throws Exception {
redis.set(key, value);
byte[] bytes = redis.dump(key);
redis.del(key);
assertThat(redis.restore(key, 0, bytes)).isEqualTo("OK");
assertThat(redis.get(key)).isEqualTo(value);
assertThat(redis.pttl(key).longValue()).isEqualTo(-1);
redis.del(key);
assertThat(redis.restore(key, 1000, bytes)).isEqualTo("OK");
assertThat(redis.get(key)).isEqualTo(value);
assertThat(redis.pttl(key)).isGreaterThan(0).isLessThanOrEqualTo(1000);
}
@Test
public void touch() throws Exception {
assertThat((long) redis.touch(key)).isEqualTo(0);
redis.set(key, value);
assertThat((long) redis.touch(key, "key2")).isEqualTo(1);
}
@Test
public void ttl() throws Exception {
assertThat((long) redis.ttl(key)).isEqualTo(-2);
redis.set(key, value);
assertThat((long) redis.ttl(key)).isEqualTo(-1);
redis.expire(key, 10);
assertThat((long) redis.ttl(key)).isEqualTo(10);
}
@Test
public void type() throws Exception {
assertThat(redis.type(key)).isEqualTo("none");
redis.set(key, value);
assertThat(redis.type(key)).isEqualTo("string");
redis.hset(key + "H", value, "1");
assertThat(redis.type(key + "H")).isEqualTo("hash");
redis.lpush(key + "L", "1");
assertThat(redis.type(key + "L")).isEqualTo("list");
redis.sadd(key + "S", "1");
assertThat(redis.type(key + "S")).isEqualTo("set");
redis.zadd(key + "Z", 1, "1");
assertThat(redis.type(key + "Z")).isEqualTo("zset");
}
@Test
public void scan() throws Exception {
redis.set(key, value);
KeyScanCursor<String> cursor = redis.scan();
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(cursor.getKeys()).isEqualTo(list(key));
}
@Test
public void scanWithArgs() throws Exception {
redis.set(key, value);
KeyScanCursor<String> cursor = redis.scan(ScanArgs.Builder.limit(10));
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void scanInitialCursor() throws Exception {
redis.set(key, value);
KeyScanCursor<String> cursor = redis.scan(ScanCursor.INITIAL);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(cursor.getKeys()).isEqualTo(list(key));
}
@Test(expected = IllegalArgumentException.class)
public void scanFinishedCursor() throws Exception {
redis.set(key, value);
redis.scan(ScanCursor.FINISHED);
}
@Test(expected = IllegalArgumentException.class)
public void scanNullCursor() throws Exception {
redis.set(key, value);
redis.scan((ScanCursor) null);
}
@Test
public void scanStreaming() throws Exception {
redis.set(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.scan(adapter);
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(adapter.getList()).isEqualTo(list(key));
}
@Test
public void scanStreamingWithCursor() throws Exception {
redis.set(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.scan(adapter, ScanCursor.INITIAL);
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void scanStreamingWithCursorAndArgs() throws Exception {
redis.set(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.scan(adapter, ScanCursor.INITIAL, ScanArgs.Builder.limit(5));
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
}
@Test
public void scanStreamingArgs() throws Exception {
redis.set(key, value);
ListStreamingAdapter<String> adapter = new ListStreamingAdapter<String>();
StreamScanCursor cursor = redis.scan(adapter, ScanArgs.Builder.limit(100).match("*"));
assertThat(cursor.getCount()).isEqualTo(1);
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(adapter.getList()).isEqualTo(list(key));
}
@Test
public void scanMultiple() throws Exception {
Set<String> expect = new HashSet<>();
Set<String> check = new HashSet<>();
setup100KeyValues(expect);
KeyScanCursor<String> cursor = redis.scan(ScanArgs.Builder.limit(12));
assertThat(cursor.getCursor()).isNotNull();
assertNotEquals("0", cursor.getCursor());
assertThat(cursor.isFinished()).isFalse();
check.addAll(cursor.getKeys());
while (!cursor.isFinished()) {
cursor = redis.scan(cursor);
check.addAll(cursor.getKeys());
}
assertThat(check).isEqualTo(expect);
assertThat(check).hasSize(100);
}
@Test
public void scanMatch() throws Exception {
Set<String> expect = new HashSet<>();
setup100KeyValues(expect);
KeyScanCursor<String> cursor = redis.scan(ScanArgs.Builder.limit(200).match("key1*"));
assertThat(cursor.getCursor()).isEqualTo("0");
assertThat(cursor.isFinished()).isTrue();
assertThat(cursor.getKeys()).hasSize(11);
}
protected void setup100KeyValues(Set<String> expect) {
for (int i = 0; i < 100; i++) {
redis.set(key + i, value + i);
expect.add(key + i);
}
}
}