
com.vdurmont.fakejedis.FakeJedis Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fake-jedis Show documentation
Show all versions of fake-jedis Show documentation
Fake implementation of Jedis (Redis API client) for testing purposes.
The newest version!
package com.vdurmont.fakejedis;
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.BinaryJedisPubSub;
import redis.clients.jedis.BitOP;
import redis.clients.jedis.BitPosParams;
import redis.clients.jedis.Client;
import redis.clients.jedis.DebugParams;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisMonitor;
import redis.clients.jedis.JedisPubSub;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.PipelineBlock;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.TransactionBlock;
import redis.clients.jedis.Tuple;
import redis.clients.jedis.ZParams;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.util.Pool;
import redis.clients.util.Slowlog;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Jedis wrapper that simulates the behaviour of redis
*
* @author Vincent DURMONT [[email protected]]
*/
public class FakeJedis extends Jedis {
protected final Object LOCK;
private boolean isMulti;
private final Map database;
public FakeJedis() {
super("");
this.LOCK = new Object();
this.database = new HashMap<>();
}
// //////////////////////
// PUBLIC API
// //////////////
@Override public Boolean exists(String key) {
synchronized (this.LOCK) {
checkMulti();
return this.database.containsKey(key);
}
}
@Override public Transaction multi() {
synchronized (LOCK) {
checkMulti();
this.isMulti = true;
return new FakeTransaction(this);
}
}
@Override public Long del(String... keys) {
synchronized (this.LOCK) {
checkMulti();
long sum = 0;
for (String key : keys) {
sum += this.del(key);
}
return sum;
}
}
@Override public Long del(String key) {
synchronized (this.LOCK) {
checkMulti();
JedisObject old = this.database.remove(key);
return (long) (old == null ? 0 : 1);
}
}
@Override public String set(String key, String value) {
synchronized (this.LOCK) {
checkMulti();
JedisString str = new JedisString(value);
this.database.put(key, str);
return "OK";
}
}
@Override public String get(String key) {
synchronized (this.LOCK) {
checkMulti();
JedisString str = this.get(JedisObjectType.STRING, key);
return str == null ? null : str.value;
}
}
@Override public Set keys(String pattern) {
synchronized (this.LOCK) {
checkMulti();
Set keys = this.database.keySet();
pattern = pattern.replace("*", "(.*)");
Iterator ite = keys.iterator();
while (ite.hasNext()) {
String key = ite.next();
if (!key.matches(pattern)) {
ite.remove();
}
}
return keys;
}
}
@Override
public void close() {
// No-op
}
@Override public Long setnx(String key, String value) {
synchronized (this.LOCK) {
checkMulti();
JedisString obj = this.get(JedisObjectType.STRING, key);
if (obj != null) {
return 0l;
}
this.database.put(key, new JedisString(value));
return 1l;
}
}
// //////////////////////
// PUBLIC API — LISTS
// //////////////
@Override public Long lpush(String key, String... strings) {
synchronized (this.LOCK) {
checkMulti();
JedisList jedisList = this.getOrCreate(JedisObjectType.LIST, key);
for (String str : strings) {
jedisList.list.addFirst(str);
}
return jedisList.size();
}
}
@Override public String lpop(String key) {
synchronized (this.LOCK) {
checkMulti();
JedisList jedisList = this.getOrCreate(JedisObjectType.LIST, key);
return jedisList.list.pollFirst();
}
}
@Override public Long llen(String key) {
synchronized (this.LOCK) {
checkMulti();
JedisList jedisList = this.getOrCreate(JedisObjectType.LIST, key);
return jedisList.size();
}
}
@Override public List lrange(String key, long start, long end) {
synchronized (this.LOCK) {
checkMulti();
JedisList jedisList = this.get(JedisObjectType.LIST, key);
end++; // Because the end is included in redis
if (jedisList == null) {
return new ArrayList<>();
} else {
// Negative index means we start from the tail
if (start < 0) {
start = jedisList.size() + start;
}
if (end < 1) {
end = jedisList.size() + end;
}
// If we have reversed index, return empty
if (start > end) {
return new ArrayList<>();
}
// We are resilient to the IndexOutOfBounds errors
start = Math.max(0, start);
end = Math.min(jedisList.size(), end);
return jedisList.list.subList((int) start, (int) end);
}
}
}
// //////////////////////
// PUBLIC API — HASHES
// //////////////
@Override public Long hset(String key, String field, String value) {
synchronized (this.LOCK) {
checkMulti();
JedisHash jedisHash = this.getOrCreate(JedisObjectType.HASH, key);
String old = jedisHash.hash.put(field, value);
return (long) (old == null ? 1 : 0);
}
}
@Override public String hget(String key, String field) {
synchronized (this.LOCK) {
checkMulti();
JedisHash jedisHash = this.get(JedisObjectType.HASH, key);
if (jedisHash == null) {
return null;
}
return jedisHash.hash.get(field);
}
}
@Override public Long hincrBy(String key, String field, long value) {
synchronized (this.LOCK) {
checkMulti();
JedisHash jedisHash = this.getOrCreate(JedisObjectType.HASH, key);
String old = jedisHash.hash.get(field);
long newValue = value;
if (old != null) {
try {
newValue += Long.valueOf(old);
} catch (NumberFormatException e) {
throw new JedisDataException("ERR hash value is not an integer");
}
}
jedisHash.hash.put(field, String.valueOf(newValue));
return newValue;
}
}
@Override public Map hgetAll(String key) {
synchronized (this.LOCK) {
checkMulti();
JedisHash hash = this.get(JedisObjectType.HASH, key);
Map map = new HashMap<>();
if (hash != null) {
map.putAll(hash.hash);
}
return map;
}
}
// //////////////////////
// PRIVATE TOOLS
// //////////////
private T get(JedisObjectType type, String key) {
JedisObject object = this.database.get(key);
if (object == null) {
return null;
} else if (object.type == type) {
@SuppressWarnings("unchecked")
T fetched = (T) object;
return fetched;
} else {
throw new JedisDataException("WRONGTYPE Operation against a key holding the wrong kind of value");
}
}
private T getOrCreate(JedisObjectType type, String key) {
T object = this.get(type, key);
if (object == null) {
object = type.newInstance();
this.database.put(key, object);
}
return object;
}
private void checkMulti() {
if (this.isMulti) {
throw new JedisDataException("Cannot use Jedis when in Multi. Please use JedisTransaction instead.");
}
}
protected void setMulti(boolean multi) {
this.isMulti = multi;
}
// //////////////////////
// MODEL
// //////////////
private static class JedisObject {
public final JedisObjectType type;
public JedisObject(JedisObjectType type) {
this.type = type;
}
}
private static class JedisList extends JedisObject {
public final LinkedList list;
public JedisList() {
super(JedisObjectType.LIST);
this.list = new LinkedList<>();
}
public long size() {
return (long) this.list.size();
}
}
private static class JedisHash extends JedisObject {
public final Map hash;
public JedisHash() {
super(JedisObjectType.HASH);
this.hash = new HashMap<>();
}
}
private static class JedisString extends JedisObject {
public final String value;
public JedisString(String value) {
super(JedisObjectType.STRING);
this.value = value;
}
}
private static enum JedisObjectType {
LIST(JedisList.class),
HASH(JedisHash.class),
STRING(JedisString.class);
private final Class cls;
private JedisObjectType(Class cls) {
this.cls = cls;
}
private T newInstance() {
try {
@SuppressWarnings("unchecked")
T instance = (T) this.cls.newInstance();
return instance;
} catch (InstantiationException | IllegalAccessException e) {
throw new FakeJedisException("Unable to create an instance of " + this.cls, e);
}
}
}
// //////////////////////
// NOT IMPLEMENTED
// //////////////
@Override public String set(String key, String value, String nxxx, String expx, long time) {
throw new FakeJedisNotImplementedException();
}
@Override public String type(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public String randomKey() {
throw new FakeJedisNotImplementedException();
}
@Override public String rename(String oldkey, String newkey) {
throw new FakeJedisNotImplementedException();
}
@Override public Long renamenx(String oldkey, String newkey) {
throw new FakeJedisNotImplementedException();
}
@Override public Long expire(String key, int seconds) {
throw new FakeJedisNotImplementedException();
}
@Override public Long expireAt(String key, long unixTime) {
throw new FakeJedisNotImplementedException();
}
@Override public Long ttl(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long move(String key, int dbIndex) {
throw new FakeJedisNotImplementedException();
}
@Override public String getSet(String key, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public List mget(String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public String setex(String key, int seconds, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String mset(String... keysvalues) {
throw new FakeJedisNotImplementedException();
}
@Override public Long msetnx(String... keysvalues) {
throw new FakeJedisNotImplementedException();
}
@Override public Long decrBy(String key, long integer) {
throw new FakeJedisNotImplementedException();
}
@Override public Long decr(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long incrBy(String key, long integer) {
throw new FakeJedisNotImplementedException();
}
@Override public Double incrByFloat(String key, double value) {
throw new FakeJedisNotImplementedException();
}
@Override public Long incr(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long append(String key, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String substr(String key, int start, int end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long hsetnx(String key, String field, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String hmset(String key, Map hash) {
throw new FakeJedisNotImplementedException();
}
@Override public List hmget(String key, String... fields) {
throw new FakeJedisNotImplementedException();
}
@Override public Double hincrByFloat(String key, String field, double value) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean hexists(String key, String field) {
throw new FakeJedisNotImplementedException();
}
@Override public Long hdel(String key, String... fields) {
throw new FakeJedisNotImplementedException();
}
@Override public Long hlen(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Set hkeys(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public List hvals(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long rpush(String key, String... strings) {
throw new FakeJedisNotImplementedException();
}
@Override public String ltrim(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public String lindex(String key, long index) {
throw new FakeJedisNotImplementedException();
}
@Override public String lset(String key, long index, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public Long lrem(String key, long count, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String rpop(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public String rpoplpush(String srckey, String dstkey) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sadd(String key, String... members) {
throw new FakeJedisNotImplementedException();
}
@Override public Set smembers(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long srem(String key, String... members) {
throw new FakeJedisNotImplementedException();
}
@Override public String spop(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long smove(String srckey, String dstkey, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Long scard(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean sismember(String key, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Set sinter(String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sinterstore(String dstkey, String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Set sunion(String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sunionstore(String dstkey, String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Set sdiff(String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sdiffstore(String dstkey, String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public String srandmember(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public List srandmember(String key, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zadd(String key, double score, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zadd(String key, Map scoreMembers) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrange(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zrem(String key, String... members) {
throw new FakeJedisNotImplementedException();
}
@Override public Double zincrby(String key, double score, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zrank(String key, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zrevrank(String key, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrange(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeWithScores(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeWithScores(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zcard(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Double zscore(String key, String member) {
throw new FakeJedisNotImplementedException();
}
@Override public String watch(String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public List sort(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public List sort(String key, SortingParams sortingParameters) {
throw new FakeJedisNotImplementedException();
}
@Override public List blpop(int timeout, String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public List blpop(String... args) {
throw new FakeJedisNotImplementedException();
}
@Override public List brpop(String... args) {
throw new FakeJedisNotImplementedException();
}
@Override public List blpop(String arg) {
throw new FakeJedisNotImplementedException();
}
@Override public List brpop(String arg) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sort(String key, SortingParams sortingParameters, String dstkey) {
throw new FakeJedisNotImplementedException();
}
@Override public Long sort(String key, String dstkey) {
throw new FakeJedisNotImplementedException();
}
@Override public List brpop(int timeout, String... keys) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zcount(String key, double min, double max) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zcount(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScore(String key, double min, double max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScore(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScore(String key, double min, double max, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScore(String key, String min, String max, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScoreWithScores(String key, double min, double max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScoreWithScores(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScoreWithScores(String key, double min, double max, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByScoreWithScores(String key, String min, String max, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScore(String key, double max, double min) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScore(String key, String max, String min) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScore(String key, double max, double min, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScoreWithScores(String key, double max, double min) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScoreWithScores(String key, double max, double min, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScoreWithScores(String key, String max, String min, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScore(String key, String max, String min, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrevrangeByScoreWithScores(String key, String max, String min) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zremrangeByRank(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zremrangeByScore(String key, double start, double end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zremrangeByScore(String key, String start, String end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zunionstore(String dstkey, String... sets) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zunionstore(String dstkey, ZParams params, String... sets) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zinterstore(String dstkey, String... sets) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zinterstore(String dstkey, ZParams params, String... sets) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zlexcount(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByLex(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Set zrangeByLex(String key, String min, String max, int offset, int count) {
throw new FakeJedisNotImplementedException();
}
@Override public Long zremrangeByLex(String key, String min, String max) {
throw new FakeJedisNotImplementedException();
}
@Override public Long strlen(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long lpushx(String key, String... string) {
throw new FakeJedisNotImplementedException();
}
@Override public Long persist(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long rpushx(String key, String... string) {
throw new FakeJedisNotImplementedException();
}
@Override public String echo(String string) {
throw new FakeJedisNotImplementedException();
}
@Override public Long linsert(String key, BinaryClient.LIST_POSITION where, String pivot, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String brpoplpush(String source, String destination, int timeout) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean setbit(String key, long offset, boolean value) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean setbit(String key, long offset, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean getbit(String key, long offset) {
throw new FakeJedisNotImplementedException();
}
@Override public Long setrange(String key, long offset, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public String getrange(String key, long startOffset, long endOffset) {
throw new FakeJedisNotImplementedException();
}
@Override public Long bitpos(String key, boolean value) {
throw new FakeJedisNotImplementedException();
}
@Override public Long bitpos(String key, boolean value, BitPosParams params) {
throw new FakeJedisNotImplementedException();
}
@Override public List configGet(String pattern) {
throw new FakeJedisNotImplementedException();
}
@Override public String configSet(String parameter, String value) {
throw new FakeJedisNotImplementedException();
}
@Override public Object eval(String script, int keyCount, String... params) {
throw new FakeJedisNotImplementedException();
}
@Override public void subscribe(JedisPubSub jedisPubSub, String... channels) {
throw new FakeJedisNotImplementedException();
}
@Override public Long publish(String channel, String message) {
throw new FakeJedisNotImplementedException();
}
@Override public void psubscribe(JedisPubSub jedisPubSub, String... patterns) {
throw new FakeJedisNotImplementedException();
}
@Override public Object eval(String script, List keys, List args) {
throw new FakeJedisNotImplementedException();
}
@Override public Object eval(String script) {
throw new FakeJedisNotImplementedException();
}
@Override public Object evalsha(String script) {
throw new FakeJedisNotImplementedException();
}
@Override public Object evalsha(String sha1, List keys, List args) {
throw new FakeJedisNotImplementedException();
}
@Override public Object evalsha(String sha1, int keyCount, String... params) {
throw new FakeJedisNotImplementedException();
}
@Override public Boolean scriptExists(String sha1) {
throw new FakeJedisNotImplementedException();
}
@Override public List scriptExists(String... sha1) {
throw new FakeJedisNotImplementedException();
}
@Override public String scriptLoad(String script) {
throw new FakeJedisNotImplementedException();
}
@Override public List slowlogGet() {
throw new FakeJedisNotImplementedException();
}
@Override public List slowlogGet(long entries) {
throw new FakeJedisNotImplementedException();
}
@Override public Long objectRefcount(String string) {
throw new FakeJedisNotImplementedException();
}
@Override public String objectEncoding(String string) {
throw new FakeJedisNotImplementedException();
}
@Override public Long objectIdletime(String string) {
throw new FakeJedisNotImplementedException();
}
@Override public Long bitcount(String key) {
throw new FakeJedisNotImplementedException();
}
@Override public Long bitcount(String key, long start, long end) {
throw new FakeJedisNotImplementedException();
}
@Override public Long bitop(BitOP op, String destKey, String... srcKeys) {
throw new FakeJedisNotImplementedException();
}
@Override public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy