package com.google.sitebricks.persist.redis;
import com.google.inject.Guice;
import com.google.sitebricks.persist.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import javax.inject.Inject;
import javax.inject.Provider;
import java.util.Date;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
/**
* This test needs redis to run so it is disabled in the nominal build.
*
* @author dhanji@gmail.com (Dhanji R. Prasanna)
*/
public class RedisStoreIntegrationTest {
public static final String A_NAME = "Jason Van Zyl";
public static class RedisSaver {
@Inject
Provider<Jedis> jedis;
@Work
public void make() {
jedis.get().set("name", "Jason");
}
@Work
public String find() {
return jedis.get().get("name");
}
}
public static class RedisTransactionalSaver {
@Inject
Provider<Jedis> jedis;
@Work @Transactional
public void make() {
jedis.get().set("name", "Jason");
}
@Work @Transactional
public String find() {
return jedis.get().get("name");
}
}
// @Test
public final void storeAndRetrieve() {
RedisModule redisModule = new RedisModule();
RedisSaver saver = Guice.createInjector(redisModule, new PersistAopModule(redisModule))
.getInstance(RedisSaver.class);
saver.make();
assertEquals("Jason", saver.find());
}
// @Test
public final void storeAndRetrieveWithRedisUrl() {
RedisModule redisModule = new RedisModule(new JedisPoolConfig(), "redis://localhost:6379");
RedisSaver saver = Guice.createInjector(redisModule, new PersistAopModule(redisModule))
.getInstance(RedisSaver.class);
saver.make();
assertEquals("Jason", saver.find());
}
// @Test
public final void storeAndRetrieveTransactional() {
RedisModule redisModule = new RedisModule();
RedisTransactionalSaver saver = Guice.createInjector(redisModule, new PersistAopModule(redisModule))
.getInstance(RedisTransactionalSaver.class);
saver.make();
assertEquals("Jason", saver.find());
}
// @Test
public final void storeAndRetrieveWithoutAop() {
Persister persister = Guice.createInjector(new RedisModule())
.getInstance(Persister.class);
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(new Parameter("name", A_NAME));
return null;
}
});
Object param = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(Parameter.class, "name");
}
});
assertEquals(A_NAME, ((Parameter)param).value);
}
// @Test
public final void storeAndRemoveWithoutAop() {
Persister persister = Guice.createInjector(new RedisModule())
.getInstance(Persister.class);
final String aKey = "somekey_" + Long.toHexString(new Date().getTime());
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(new Parameter(aKey, A_NAME));
return null;
}
});
persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.remove(Parameter.class, aKey);
return null;
}
});
Object param = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(Parameter.class, aKey);
}
});
assertNull(param);
}
// @Test // No different in Redis to @Work
public final void storeAndRetrieveInTransaction() {
final Persister persister = Guice.createInjector(new RedisModule())
.getInstance(Persister.class);
Object param = persister.call(new Persister.InWork() {
@Override
public Object perform(EntityStore es) throws Throwable {
persister.call(new Persister.InTransaction() {
@Override
public Object perform(EntityStore es) throws Throwable {
es.save(new Parameter("name", A_NAME));
return null;
}
});
return persister.call(new Persister.InTransaction() {
@Override
public Object perform(EntityStore es) throws Throwable {
return es.find(Parameter.class, "name");
}
});
}
});
assertEquals(A_NAME, ((Parameter)param).value);
}
}