when a script returns Null value, jedis throws NullPointerException

This commit is contained in:
Jonathan Leibiusky
2013-02-05 15:44:35 -03:00
parent 23e50a363e
commit 9d538a06fd
2 changed files with 120 additions and 104 deletions

View File

@@ -2775,8 +2775,10 @@ public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommand
if (result instanceof List<?>) { if (result instanceof List<?>) {
List<?> list = (List<?>) result; List<?> list = (List<?>) result;
List<String> listResult = new ArrayList<String>(list.size()); List<String> listResult = new ArrayList<String>(list.size());
for (Object bin : list) for (Object bin : list) {
listResult.add(SafeEncoder.encode((byte[]) bin)); listResult.add((bin == null ? null : SafeEncoder
.encode((byte[]) bin)));
}
return listResult; return listResult;
} }

View File

@@ -6,133 +6,147 @@ import java.util.List;
import org.junit.Test; import org.junit.Test;
import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.util.SafeEncoder; import redis.clients.util.SafeEncoder;
public class ScriptingCommandsTest extends JedisCommandTestBase { public class ScriptingCommandsTest extends JedisCommandTestBase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Test @Test
public void evalMultiBulk() { public void evalMultiBulk() {
String script = "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"; String script = "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}";
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
keys.add("key2"); keys.add("key2");
List<String> args = new ArrayList<String>(); List<String> args = new ArrayList<String>();
args.add("first"); args.add("first");
args.add("second"); args.add("second");
List<String> response = (List<String>)jedis.eval(script, keys, args ); List<String> response = (List<String>) jedis.eval(script, keys, args);
assertEquals(4, response.size()); assertEquals(4, response.size());
assertEquals("key1", response.get(0)); assertEquals("key1", response.get(0));
assertEquals("key2", response.get(1)); assertEquals("key2", response.get(1));
assertEquals("first", response.get(2)); assertEquals("first", response.get(2));
assertEquals("second", response.get(3)); assertEquals("second", response.get(3));
} }
@Test @Test
public void evalBulk() { public void evalBulk() {
String script = "return KEYS[1]"; String script = "return KEYS[1]";
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
List<String> args = new ArrayList<String>(); List<String> args = new ArrayList<String>();
args.add("first"); args.add("first");
String response = (String)jedis.eval(script, keys, args); String response = (String) jedis.eval(script, keys, args);
assertEquals("key1", response); assertEquals("key1", response);
} }
@Test @Test
public void evalInt() { public void evalInt() {
String script = "return 2"; String script = "return 2";
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
Long response = (Long)jedis.eval(script, keys, new ArrayList<String>()); Long response = (Long) jedis
.eval(script, keys, new ArrayList<String>());
assertEquals(new Long(2), response); assertEquals(new Long(2), response);
} }
@Test @Test
public void evalNoArgs() { public void evalNoArgs() {
String script = "return KEYS[1]"; String script = "return KEYS[1]";
List<String> keys = new ArrayList<String>(); List<String> keys = new ArrayList<String>();
keys.add("key1"); keys.add("key1");
String response = (String)jedis.eval(script, keys, new ArrayList<String>()); String response = (String) jedis.eval(script, keys,
new ArrayList<String>());
assertEquals("key1", response); assertEquals("key1", response);
} }
@SuppressWarnings("unchecked") @Test
@Test
public void evalsha() { public void evalsha() {
jedis.set("foo", "bar"); jedis.set("foo", "bar");
jedis.eval("return redis.call('get','foo')"); jedis.eval("return redis.call('get','foo')");
String result = (String)jedis.evalsha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"); String result = (String) jedis
.evalsha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
assertEquals("bar", result); assertEquals("bar", result);
} }
@SuppressWarnings("unchecked") @Test(expected = JedisDataException.class)
@Test(expected=JedisDataException.class)
public void evalshaShaNotFound() { public void evalshaShaNotFound() {
jedis.evalsha("ffffffffffffffffffffffffffffffffffffffff"); jedis.evalsha("ffffffffffffffffffffffffffffffffffffffff");
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptFlush() { public void scriptFlush() {
jedis.set("foo", "bar"); jedis.set("foo", "bar");
jedis.eval("return redis.call('get','foo')"); jedis.eval("return redis.call('get','foo')");
jedis.scriptFlush(); jedis.scriptFlush();
assertFalse(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791")); assertFalse(jedis
.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptExists() { public void scriptExists() {
jedis.scriptLoad("return redis.call('get','foo')"); jedis.scriptLoad("return redis.call('get','foo')");
List<Boolean> exists = jedis.scriptExists("ffffffffffffffffffffffffffffffffffffffff","6b1bf486c81ceb7edf3c093f4c48582e38c0e791"); List<Boolean> exists = jedis.scriptExists(
assertFalse(exists.get(0)); "ffffffffffffffffffffffffffffffffffffffff",
assertTrue(exists.get(1)); "6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
assertFalse(exists.get(0));
assertTrue(exists.get(1));
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptExistsBinary() { public void scriptExistsBinary() {
jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')")); jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')"));
List<Long> exists = jedis.scriptExists(SafeEncoder.encode("ffffffffffffffffffffffffffffffffffffffff"),SafeEncoder.encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791")); List<Long> exists = jedis.scriptExists(
assertEquals(new Long(0), exists.get(0)); SafeEncoder.encode("ffffffffffffffffffffffffffffffffffffffff"),
assertEquals(new Long(1), exists.get(1)); SafeEncoder.encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
assertEquals(new Long(0), exists.get(0));
assertEquals(new Long(1), exists.get(1));
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptLoad() { public void scriptLoad() {
jedis.scriptLoad("return redis.call('get','foo')"); jedis.scriptLoad("return redis.call('get','foo')");
assertTrue(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791")); assertTrue(jedis
.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptLoadBinary() { public void scriptLoadBinary() {
jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')")); jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')"));
List<Long> exists = jedis.scriptExists(SafeEncoder.encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791")); List<Long> exists = jedis.scriptExists(SafeEncoder
assertEquals(new Long(1), exists.get(0)); .encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
assertEquals(new Long(1), exists.get(0));
} }
@SuppressWarnings("unchecked") @Test
@Test
public void scriptKill() { public void scriptKill() {
try { try {
jedis.scriptKill(); jedis.scriptKill();
} } catch (JedisDataException e) {
catch(JedisDataException e) { assertTrue(e.getMessage().contains(
assertTrue(e.getMessage().contains("No scripts in execution right now.")); "No scripts in execution right now."));
}
} }
}
@Test
public void scriptEvalReturnNullValues() {
String script = "return {redis.call('hget',KEYS[1],ARGV[1]),redis.call('hget',KEYS[2],ARGV[2])}";
jedis.eval(script, 2, "key1", "key2", "1", "1");
}
@Test
public void scriptEvalShaReturnNullValues() {
String script = "return {redis.call('hget',KEYS[1],ARGV[1]),redis.call('hget',KEYS[2],ARGV[2])}";
String sha = jedis.scriptLoad(script);
jedis.evalsha(sha, 2, "key1", "key2", "1", "1");
}
} }