diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index aa9f86cbf..be7094d98 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -1037,6 +1037,10 @@ public class JedisConnection extends AbstractRedisConnection { } public void restore(byte[] key, long ttlInMillis, byte[] serializedValue) { + + if (ttlInMillis > Integer.MAX_VALUE) { + throw new IllegalArgumentException("TtlInMillis must be less than Integer.MAX_VALUE for restore in Jedis."); + } try { if (isPipelined()) { pipeline(new JedisStatusResult(pipeline.restore(key, (int) ttlInMillis, serializedValue))); @@ -1293,6 +1297,11 @@ public class JedisConnection extends AbstractRedisConnection { } public void setEx(byte[] key, long time, byte[] value) { + + if (time > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Time must be less than Integer.MAX_VALUE for setEx in Jedis."); + } + try { if (isPipelined()) { pipeline(new JedisStatusResult(pipeline.setex(key, (int) time, value))); @@ -1347,6 +1356,11 @@ public class JedisConnection extends AbstractRedisConnection { } public byte[] getRange(byte[] key, long start, long end) { + + if (start > Integer.MAX_VALUE || end > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Start and end must be less than Integer.MAX_VALUE for getRange in Jedis."); + } + try { if (isPipelined()) { pipeline(new JedisResult(pipeline.substr(key, (int) start, (int) end), JedisConverters.stringToBytes())); @@ -2022,6 +2036,11 @@ public class JedisConnection extends AbstractRedisConnection { } public List sRandMember(byte[] key, long count) { + + if (count > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Count must be less than Integer.MAX_VALUE for sRandMember in Jedis."); + } + try { if (isPipelined()) { pipeline(new JedisResult(pipeline.srandmember(key, (int) count))); @@ -3521,6 +3540,12 @@ public class JedisConnection extends AbstractRedisConnection { @Override public Set zRangeByScore(byte[] key, String min, String max, long offset, long count) { + if (offset > Integer.MAX_VALUE || count > Integer.MAX_VALUE) { + + throw new IllegalArgumentException( + "Offset and count must be less than Integer.MAX_VALUE for zRangeByScore in Jedis."); + } + try { String keyStr = new String(key, "UTF-8"); if (isPipelined()) { diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java index 2f088f10b..9114b5660 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java @@ -20,9 +20,6 @@ import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; -import java.util.Arrays; -import java.util.concurrent.TimeUnit; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,7 +31,6 @@ import org.springframework.data.redis.connection.AbstractConnectionUnitTestBase; import org.springframework.data.redis.connection.RedisServerCommands.ShutdownOption; import org.springframework.data.redis.connection.jedis.JedisConnectionUnitTestSuite.JedisConnectionPipelineUnitTests; import org.springframework.data.redis.connection.jedis.JedisConnectionUnitTestSuite.JedisConnectionUnitTests; -import org.springframework.data.redis.core.TimeoutUtils; import redis.clients.jedis.Client; import redis.clients.jedis.Jedis; @@ -97,24 +93,6 @@ public class JedisConnectionUnitTestSuite { assertThat(captor.getValue(), equalTo("return redis.call('SHUTDOWN','SAVE')".getBytes())); } - /** - * @see DATAREDIS-286 - */ - @Test - public void pExpireHavingIntOverflowShouldUseRedisServerTimeAsReferenceForPExpireAt() { - - long msec = Long.valueOf((long) Integer.MAX_VALUE + 1); - long expected = msec + TimeoutUtils.toMillis(1, TimeUnit.SECONDS); - - /* redis time as list containing [0] = seconds, [1] = microseconds - * @see http://redis.io/commands/time - */ - when(jedisSpy.time()).thenReturn(Arrays.asList("1", "0")); - - connection.pExpire("foo".getBytes(), msec); - verifyNativeConnectionInvocation().pexpireAt(any(byte[].class), eq(expected)); - } - /** * @see DATAREDIS-267 */ @@ -171,6 +149,62 @@ public class JedisConnectionUnitTestSuite { connection.getSentinelConnection(); } + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void restoreShouldThrowExceptionWhenTtlInMillisExceedsIntegerRange() { + connection.restore("foo".getBytes(), new Long(Integer.MAX_VALUE) + 1L, "bar".getBytes()); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void setExShouldThrowExceptionWhenTimeExceedsIntegerRange() { + connection.setEx("foo".getBytes(), new Long(Integer.MAX_VALUE) + 1L, "bar".getBytes()); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void getRangeShouldThrowExceptionWhenStartExceedsIntegerRange() { + connection.getRange("foo".getBytes(), new Long(Integer.MAX_VALUE) + 1L, Integer.MAX_VALUE); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void getRangeShouldThrowExceptionWhenEndExceedsIntegerRange() { + connection.getRange("foo".getBytes(), Integer.MAX_VALUE, new Long(Integer.MAX_VALUE) + 1L); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void sRandMemberShouldThrowExceptionWhenCountExceedsIntegerRange() { + connection.sRandMember("foo".getBytes(), new Long(Integer.MAX_VALUE) + 1L); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void zRangeByScoreShouldThrowExceptionWhenOffsetExceedsIntegerRange() { + connection.zRangeByScore("foo".getBytes(), "foo", "bar", new Long(Integer.MAX_VALUE) + 1L, Integer.MAX_VALUE); + } + + /** + * @see DATAREDIS-472 + */ + @Test(expected = IllegalArgumentException.class) + public void zRangeByScoreShouldThrowExceptionWhenCountExceedsIntegerRange() { + connection.zRangeByScore("foo".getBytes(), "foo", "bar", Integer.MAX_VALUE, new Long(Integer.MAX_VALUE) + 1L); + } + } public static class JedisConnectionPipelineUnitTests extends JedisConnectionUnitTests {