package com.lambdaworks.redis.commands;
import static com.lambdaworks.redis.protocol.CommandType.ZRANGEBYLEX;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assume.assumeTrue;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.junit.Test;
import com.lambdaworks.redis.AbstractRedisClientTest;
import com.lambdaworks.redis.ReactiveCommandDispatcher;
import com.lambdaworks.redis.RedisCommandExecutionException;
import com.lambdaworks.redis.api.StatefulRedisConnection;
import com.lambdaworks.redis.codec.Utf8StringCodec;
import com.lambdaworks.redis.output.StatusOutput;
import com.lambdaworks.redis.output.ValueListOutput;
import com.lambdaworks.redis.protocol.*;
import rx.Observable;
/**
* @author Mark Paluch
*/
public class CustomCommandTest extends AbstractRedisClientTest {
protected final Utf8StringCodec utf8StringCodec = new Utf8StringCodec();
@Test
public void dispatchSet() throws Exception {
String response = redis.dispatch(MyCommands.SET, new StatusOutput<>(utf8StringCodec),
new CommandArgs<>(utf8StringCodec).addKey(key).addValue(value));
assertThat(response).isEqualTo("OK");
}
@Test
public void dispatchWithoutArgs() throws Exception {
String response = redis.dispatch(MyCommands.INFO, new StatusOutput<>(utf8StringCodec));
assertThat(response).contains("connected_clients");
}
@Test(expected = RedisCommandExecutionException.class)
public void dispatchShouldFailForWrongDataType() throws Exception {
redis.hset(key, key, value);
redis.dispatch(CommandType.GET, new StatusOutput<>(utf8StringCodec), new CommandArgs<>(utf8StringCodec).addKey(key));
}
@Test
public void dispatchTransactions() throws Exception {
redis.multi();
String response = redis.dispatch(CommandType.SET, new StatusOutput<>(utf8StringCodec),
new CommandArgs<>(utf8StringCodec).addKey(key).addValue(value));
List<Object> exec = redis.exec();
assertThat(response).isNull();
assertThat(exec).hasSize(1).contains("OK");
}
@Test
public void standaloneAsyncPing() throws Exception {
RedisCommand<String, String, String> command = new Command<>(MyCommands.PING, new StatusOutput<>(new Utf8StringCodec()),
null);
AsyncCommand<String, String, String> async = new AsyncCommand<>(command);
getStandaloneConnection().dispatch(async);
assertThat(async.get()).isEqualTo("PONG");
}
@Test
public void standaloneFireAndForget() throws Exception {
RedisCommand<String, String, String> command = new Command<>(MyCommands.PING, new StatusOutput<>(new Utf8StringCodec()),
null);
getStandaloneConnection().dispatch(command);
assertThat(command.isCancelled()).isFalse();
}
@Test
public void standaloneReactivePing() throws Exception {
RedisCommand<String, String, String> command = new Command<>(MyCommands.PING, new StatusOutput<>(new Utf8StringCodec()),
null);
ReactiveCommandDispatcher<String, String, String> dispatcher = new ReactiveCommandDispatcher<>(command,
getStandaloneConnection(), false);
String result = Observable.create(dispatcher).toBlocking().first();
assertThat(result).isEqualTo("PONG");
}
private StatefulRedisConnection<String, String> getStandaloneConnection() {
assumeTrue(redis.getStatefulConnection() instanceof StatefulRedisConnection);
return redis.getStatefulConnection();
}
public enum MyCommands implements ProtocolKeyword {
PING, SET, INFO;
private final byte name[];
MyCommands() {
// cache the bytes for the command name. Reduces memory and cpu pressure when using commands.
name = name().getBytes();
}
@Override
public byte[] getBytes() {
return name;
}
}
}