// Copyright (C) 2011 - Will Glozer. All rights reserved.
package com.lambdaworks.redis;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static com.lambdaworks.redis.ScriptOutputType.*;
import static org.junit.Assert.assertEquals;
public class ScriptingCommandTest extends AbstractCommandTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
@SuppressWarnings("unchecked")
public void eval() throws Exception {
assertEquals(false, redis.eval("return 1 + 1 == 4", BOOLEAN));
assertEquals(2L, redis.eval("return 1 + 1", INTEGER));
assertEquals("status", redis.eval("return {ok='status'}", STATUS));
assertEquals("one", redis.eval("return 'one'", VALUE));
assertEquals(list(1L, "one", list(2L)), redis.eval("return {1, 'one', {2}}", MULTI));
exception.expectMessage("Oops!");
redis.eval("return {err='Oops!'}", STATUS);
}
@Test
public void evalWithKeys() throws Exception {
assertEquals(list("one", "two"), redis.eval("return {KEYS[1], KEYS[2]}", MULTI, "one", "two"));
}
@Test
public void evalWithArgs() throws Exception {
String[] keys = new String[0];
assertEquals(list("a", "b"), redis.eval("return {ARGV[1], ARGV[2]}", MULTI, keys, "a", "b"));
}
@Test
@SuppressWarnings("unchecked")
public void evalsha() throws Exception {
redis.scriptFlush();
String script = "return 1 + 1";
String digest = redis.digest(script);
assertEquals(2L, redis.eval(script, INTEGER));
assertEquals(2L, redis.evalsha(digest, INTEGER));
exception.expectMessage("NOSCRIPT No matching script. Please use EVAL.");
redis.evalsha(redis.digest("return 1 + 1 == 4"), INTEGER);
}
@Test
public void evalshaWithKeys() throws Exception {
redis.scriptFlush();
String digest = redis.scriptLoad("return {KEYS[1], KEYS[2]}");
assertEquals(list("one", "two"), redis.evalsha(digest, MULTI, "one", "two"));
}
@Test
public void evalshaWithArgs() throws Exception {
redis.scriptFlush();
String digest = redis.scriptLoad("return {ARGV[1], ARGV[2]}");
String[] keys = new String[0];
assertEquals(list("a", "b"), redis.evalsha(digest, MULTI, keys, "a", "b"));
}
@Test
@SuppressWarnings("unchecked")
public void script() throws Exception {
assertEquals("OK", redis.scriptFlush());
String script1 = "return 1 + 1";
String digest1 = redis.digest(script1);
String script2 = "return 1 + 1 == 4";
String digest2 = redis.digest(script2);
assertEquals(list(false, false), redis.scriptExists(digest1, digest2));
assertEquals(digest1, redis.scriptLoad(script1));
assertEquals(2L, redis.evalsha(digest1, INTEGER));
assertEquals(list(true, false), redis.scriptExists(digest1, digest2));
assertEquals("OK", redis.scriptFlush());
assertEquals(list(false, false), redis.scriptExists(digest1, digest2));
redis.configSet("lua-time-limit", "10");
RedisAsyncConnection<String, String> async = client.connectAsync();
try {
async.eval("while true do end", STATUS, new String[0]);
assertEquals("OK", redis.scriptKill());
} finally {
async.close();
}
}
}