diff --git a/lettuce/src/main/java/com/lambdaworks/redis/AbstractRedisClient.java b/lettuce/src/main/java/com/lambdaworks/redis/AbstractRedisClient.java index b77b452605..97e31b9c67 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/AbstractRedisClient.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/AbstractRedisClient.java @@ -1,5 +1,7 @@ package com.lambdaworks.redis; +import static com.google.common.base.Preconditions.*; + import java.io.Closeable; import java.lang.reflect.Proxy; import java.net.SocketAddress; @@ -12,11 +14,7 @@ import com.lambdaworks.redis.pubsub.PubSubCommandHandler; import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.EventLoopGroup; +import io.netty.channel.*; import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.ChannelGroupFuture; import io.netty.channel.group.DefaultChannelGroup; @@ -187,18 +185,22 @@ protected Object syncHandler(RedisAsyncConnectionImpl connection, C * connection, the listener will be notified. The corresponding netty channel handler (async connection) is passed on the * event. * - * @param listener + * @param listener must not be {@literal null} */ public void addListener(RedisConnectionStateListener listener) { + checkArgument(listener != null, "RedisConnectionStateListener must not be null"); connectionEvents.addListener(listener); } /** * Removes a listener. * - * @param listener + * @param listener must not be {@literal null + */ public void removeListener(RedisConnectionStateListener listener) { + + checkArgument(listener != null, "RedisConnectionStateListener must not be null"); connectionEvents.removeListener(listener); } } diff --git a/lettuce/src/main/java/com/lambdaworks/redis/RedisAsyncConnectionImpl.java b/lettuce/src/main/java/com/lambdaworks/redis/RedisAsyncConnectionImpl.java index bf9cec6bb2..dac5dd7472 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/RedisAsyncConnectionImpl.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/RedisAsyncConnectionImpl.java @@ -2,7 +2,7 @@ package com.lambdaworks.redis; -import static com.lambdaworks.redis.protocol.CommandType.EXEC; +import static com.lambdaworks.redis.protocol.CommandType.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -14,18 +14,8 @@ import com.lambdaworks.codec.Base16; import com.lambdaworks.redis.codec.RedisCodec; -import com.lambdaworks.redis.output.KeyStreamingChannel; -import com.lambdaworks.redis.output.KeyValueStreamingChannel; -import com.lambdaworks.redis.output.MultiOutput; -import com.lambdaworks.redis.output.ScoredValueStreamingChannel; -import com.lambdaworks.redis.output.ValueStreamingChannel; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandArgs; -import com.lambdaworks.redis.protocol.CommandOutput; -import com.lambdaworks.redis.protocol.CommandType; -import com.lambdaworks.redis.protocol.ConnectionWatchdog; -import com.lambdaworks.redis.protocol.RedisCommand; -import com.lambdaworks.redis.protocol.SetArgs; +import com.lambdaworks.redis.output.*; +import com.lambdaworks.redis.protocol.*; import io.netty.channel.ChannelHandler; /** @@ -169,6 +159,11 @@ public RedisFuture clientList() { return dispatch(commandBuilder.clientList()); } + @Override + public RedisFuture commandCount() { + return dispatch(commandBuilder.commandCount()); + } + @Override public RedisFuture> configGet(String parameter) { return dispatch(commandBuilder.configGet(parameter)); @@ -1459,12 +1454,12 @@ public RedisFuture> clusterGetKeysInSlot(int slot, int count) { return dispatch(commandBuilder.clusterGetKeysInSlot(slot, count)); } - @Override - public RedisFuture> clusterSlots() { - return dispatch(commandBuilder.clusterSlots()); - } + @Override + public RedisFuture> clusterSlots() { + return dispatch(commandBuilder.clusterSlots()); + } - @Override + @Override public RedisFuture clusterSetSlotNode(int slot, String nodeId) { return dispatch(commandBuilder.clusterSetSlotNode(slot, nodeId)); } diff --git a/lettuce/src/main/java/com/lambdaworks/redis/RedisCommandBuilder.java b/lettuce/src/main/java/com/lambdaworks/redis/RedisCommandBuilder.java index 82a95ba11d..d37c7bc181 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/RedisCommandBuilder.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/RedisCommandBuilder.java @@ -10,11 +10,7 @@ import com.lambdaworks.redis.codec.RedisCodec; import com.lambdaworks.redis.output.*; -import com.lambdaworks.redis.protocol.Command; -import com.lambdaworks.redis.protocol.CommandArgs; -import com.lambdaworks.redis.protocol.CommandOutput; -import com.lambdaworks.redis.protocol.RedisCommand; -import com.lambdaworks.redis.protocol.SetArgs; +import com.lambdaworks.redis.protocol.*; /** * @@ -133,6 +129,11 @@ public Command clientList() { return createCommand(CLIENT, new StatusOutput(codec), args); } + public Command commandCount() { + CommandArgs args = new CommandArgs(codec).add(COUNT); + return createCommand(COMMAND, new IntegerOutput(codec), args); + } + public Command configRewrite() { CommandArgs args = new CommandArgs(codec).add(REWRITE); return createCommand(CONFIG, new StatusOutput(codec), args); @@ -1401,7 +1402,8 @@ public Command> clusterGetKeysInSlot(int slot, int count) { CommandArgs args = new CommandArgs(codec).add(GETKEYSINSLOT).add(slot).add(count); return createCommand(CLUSTER, new KeyListOutput(codec), args); } - public Command> clusterSlots() { + + public Command> clusterSlots() { CommandArgs args = new CommandArgs(codec).add(SLOTS); return createCommand(CLUSTER, new ArrayOutput(codec), args); } diff --git a/lettuce/src/main/java/com/lambdaworks/redis/RedisServerAsyncConnection.java b/lettuce/src/main/java/com/lambdaworks/redis/RedisServerAsyncConnection.java index d747283889..0697e79a87 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/RedisServerAsyncConnection.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/RedisServerAsyncConnection.java @@ -65,6 +65,13 @@ public interface RedisServerAsyncConnection { */ RedisFuture clientList(); + /** + * Get total number of Redis commands. + * + * @return RedisFuture<Long> integer-reply of number of total commands in this Redis server. + */ + RedisFuture commandCount(); + /** * Get the value of a configuration parameter. * diff --git a/lettuce/src/main/java/com/lambdaworks/redis/RedisServerConnection.java b/lettuce/src/main/java/com/lambdaworks/redis/RedisServerConnection.java index 19b1a367fb..9e447d4ea3 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/RedisServerConnection.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/RedisServerConnection.java @@ -65,6 +65,13 @@ public interface RedisServerConnection { */ String clientList(); + /** + * Get total number of Redis commands. + * + * @return Long integer-reply of number of total commands in this Redis server. + */ + Long commandCount(); + /** * Get the value of a configuration parameter. * @@ -235,4 +242,5 @@ public interface RedisServerConnection { * unix time in seconds. microseconds. */ List time(); + } diff --git a/lettuce/src/main/java/com/lambdaworks/redis/protocol/CommandType.java b/lettuce/src/main/java/com/lambdaworks/redis/protocol/CommandType.java index 653865403c..7540091ec2 100644 --- a/lettuce/src/main/java/com/lambdaworks/redis/protocol/CommandType.java +++ b/lettuce/src/main/java/com/lambdaworks/redis/protocol/CommandType.java @@ -14,7 +14,7 @@ public enum CommandType { // Server - BGREWRITEAOF, BGSAVE, CLIENT, CONFIG, DBSIZE, DEBUG, FLUSHALL, FLUSHDB, INFO, LASTSAVE, ROLE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, + BGREWRITEAOF, BGSAVE, CLIENT, COMMAND, CONFIG, DBSIZE, DEBUG, FLUSHALL, FLUSHDB, INFO, LASTSAVE, ROLE, MONITOR, SAVE, SHUTDOWN, SLAVEOF, SLOWLOG, SYNC, // Keys diff --git a/lettuce/src/test/java/com/lambdaworks/redis/ScanCursorTest.java b/lettuce/src/test/java/com/lambdaworks/redis/ScanCursorTest.java new file mode 100644 index 0000000000..76072c5ce4 --- /dev/null +++ b/lettuce/src/test/java/com/lambdaworks/redis/ScanCursorTest.java @@ -0,0 +1,15 @@ +package com.lambdaworks.redis; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Test; + +public class ScanCursorTest { + + @Test + public void testFactory() throws Exception { + ScanCursor scanCursor = ScanCursor.of("dummy"); + assertThat(scanCursor.getCursor()).isEqualTo("dummy"); + assertThat(scanCursor.isFinished()).isFalse(); + } +} diff --git a/lettuce/src/test/java/com/lambdaworks/redis/SentinelCommandTest.java b/lettuce/src/test/java/com/lambdaworks/redis/SentinelCommandTest.java index 598d393088..647205f397 100644 --- a/lettuce/src/test/java/com/lambdaworks/redis/SentinelCommandTest.java +++ b/lettuce/src/test/java/com/lambdaworks/redis/SentinelCommandTest.java @@ -5,7 +5,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import java.net.InetSocketAddress; @@ -15,11 +15,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.*; public class SentinelCommandTest extends AbstractCommandTest { @@ -82,6 +78,17 @@ public void masters() throws Exception { } + @Test + public void sentinelConnect() throws Exception { + + RedisClient client = new RedisClient(RedisURI.Builder.redis(host, port).build()); + RedisSentinelAsyncConnection connection = client.connectSentinelAsync(); + assertThat(connection.ping().get()).isEqualTo("PONG"); + + connection.close(); + client.shutdown(); + } + @Test public void getSlaveDownstate() throws Exception { diff --git a/lettuce/src/test/java/com/lambdaworks/redis/ServerCommandTest.java b/lettuce/src/test/java/com/lambdaworks/redis/ServerCommandTest.java index 5214b7b2fb..ac1fa8fba2 100644 --- a/lettuce/src/test/java/com/lambdaworks/redis/ServerCommandTest.java +++ b/lettuce/src/test/java/com/lambdaworks/redis/ServerCommandTest.java @@ -67,6 +67,11 @@ public void clientList() throws Exception { assertThat(redis.clientList().contains("addr=")).isTrue(); } + @Test + public void commandCount() throws Exception { + assertThat(redis.commandCount()).isGreaterThan(100); + } + @Test public void configGet() throws Exception { assertThat(redis.configGet("maxmemory")).isEqualTo(list("maxmemory", "0")); diff --git a/lettuce/src/test/java/com/lambdaworks/redis/cluster/ClusterPartitionParserTest.java b/lettuce/src/test/java/com/lambdaworks/redis/cluster/ClusterPartitionParserTest.java index 4d6bdf7187..c0fad15688 100644 --- a/lettuce/src/test/java/com/lambdaworks/redis/cluster/ClusterPartitionParserTest.java +++ b/lettuce/src/test/java/com/lambdaworks/redis/cluster/ClusterPartitionParserTest.java @@ -1,7 +1,7 @@ package com.lambdaworks.redis.cluster; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; import org.junit.Test; @@ -43,6 +43,10 @@ public void testParse() throws Exception { RedisClusterNode p3 = result.getPartitions().get(2); assertThat(p3.getSlaveOf()).isEqualTo("4213a8dabb94f92eb6a860f4d0729e6a25d43e0c"); + assertThat(p3.toString()).contains(RedisClusterNode.class.getSimpleName()); + assertThat(result.toString()).contains(Partitions.class.getSimpleName()); + + assertThat(result.getPartitionBySlot(Integer.MAX_VALUE)).isNull(); } diff --git a/lettuce/src/test/java/com/lambdaworks/redis/support/CdiTest.java b/lettuce/src/test/java/com/lambdaworks/redis/support/CdiTest.java index e66d8bd917..f039473119 100644 --- a/lettuce/src/test/java/com/lambdaworks/redis/support/CdiTest.java +++ b/lettuce/src/test/java/com/lambdaworks/redis/support/CdiTest.java @@ -1,6 +1,7 @@ package com.lambdaworks.redis.support; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import javax.enterprise.inject.Produces; @@ -11,6 +12,7 @@ import org.junit.Test; import com.lambdaworks.redis.AbstractCommandTest; +import com.lambdaworks.redis.RedisConnectionStateListener; import com.lambdaworks.redis.RedisURI; /** @@ -40,6 +42,12 @@ public void testInjection() { InjectedClient injectedClient = container.getInstance(InjectedClient.class); assertThat(injectedClient.redisClient).isNotNull(); assertThat(injectedClient.redisClusterClient).isNotNull(); + + RedisConnectionStateListener mock = mock(RedisConnectionStateListener.class); + + // do some interaction to force the container a creation of the repositories. + injectedClient.redisClient.addListener(mock); + injectedClient.redisClusterClient.addListener(mock); } @AfterClass