package com.lambdaworks.redis.cluster;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.lambdaworks.redis.RedisChannelWriter;
import org.junit.Before;
import org.junit.Test;
import com.lambdaworks.redis.codec.Utf8StringCodec;
import com.lambdaworks.redis.output.StatusOutput;
import com.lambdaworks.redis.protocol.AsyncCommand;
import com.lambdaworks.redis.protocol.Command;
import com.lambdaworks.redis.protocol.CommandType;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ClusterCommandInternalsTest {
@Mock
private RedisChannelWriter<String, String> writerMock;
private ClusterCommand<String, String, String> sut;
private Command<String, String, String> command = new Command<String, String, String>(CommandType.TYPE,
new StatusOutput<String, String>(new Utf8StringCodec()), null);
@Before
public void before() throws Exception {
sut = new ClusterCommand<String, String, String>(command, writerMock, 1);
}
@Test
public void testException() throws Exception {
sut.completeExceptionally(new Exception());
assertThat(sut.isCompleted());
}
@Test
public void testCancel() throws Exception {
assertThat(command.isCancelled()).isFalse();
sut.cancel();
assertThat(command.isCancelled()).isTrue();
}
@Test
public void testComplete() throws Exception {
sut.complete();
assertThat(sut.isCompleted()).isTrue();
assertThat(sut.isCancelled()).isFalse();
}
@Test
public void testRedirect() throws Exception {
sut.getOutput().setError("MOVED 1234 127.0.0.1:1000");
sut.complete();
assertThat(sut.isCompleted()).isFalse();
assertThat(sut.isCancelled()).isFalse();
verify(writerMock).write(sut);
}
@Test
public void testRedirectLimit() throws Exception {
sut.getOutput().setError("MOVED 1234 127.0.0.1:1000");
sut.complete();
sut.getOutput().setError("MOVED 1234 127.0.0.1:1000");
sut.complete();
assertThat(sut.isCompleted()).isTrue();
assertThat(sut.isCancelled()).isFalse();
verify(writerMock).write(sut);
}
@Test
public void testCompleteListener() throws Exception {
final List<String> someList = new ArrayList<>();
AsyncCommand<?, ?, ?> asyncCommand = new AsyncCommand<>(sut);
asyncCommand.thenRun(() -> someList.add(""));
asyncCommand.complete();
asyncCommand.await(1, TimeUnit.MINUTES);
assertThat(sut.isCompleted()).isTrue();
assertThat(someList.size()).describedAs("Inner listener has to add one element").isEqualTo(1);
}
}