package com.lambdaworks.redis.sentinel;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.lambdaworks.Wait;
import com.lambdaworks.redis.RedisClient;
import com.lambdaworks.redis.RedisFuture;
import com.lambdaworks.redis.RedisURI;
import com.lambdaworks.redis.TestSettings;
import com.lambdaworks.redis.codec.ByteArrayCodec;
import com.lambdaworks.redis.sentinel.api.StatefulRedisSentinelConnection;
import com.lambdaworks.redis.sentinel.api.async.RedisSentinelAsyncCommands;
import com.lambdaworks.redis.sentinel.api.sync.RedisSentinelCommands;
public class SentinelConnectionTest extends AbstractSentinelTest {
private StatefulRedisSentinelConnection<String, String> connection;
private RedisSentinelAsyncCommands<String, String> sentinelAsync;
@BeforeClass
public static void setupClient() {
sentinelClient = new RedisClient(RedisURI.Builder.sentinel(TestSettings.host(), MASTER_ID).build());
}
@Before
public void openConnection() throws Exception {
connection = sentinelClient.connectSentinel();
sentinel = connection.sync();
sentinelAsync = connection.async();
}
@Test
public void testAsync() throws Exception {
RedisFuture<List<Map<String, String>>> future = sentinelAsync.masters();
assertThat(future.get()).isNotNull();
assertThat(future.isDone()).isTrue();
assertThat(future.isCancelled()).isFalse();
}
@Test
public void testFuture() throws Exception {
RedisFuture<Map<String, String>> future = sentinelAsync.master("unknown master");
AtomicBoolean state = new AtomicBoolean();
future.exceptionally(throwable -> {
state.set(true);
return null;
});
assertThat(future.await(5, TimeUnit.SECONDS)).isTrue();
assertThat(state.get()).isTrue();
}
@Test
public void testStatefulConnection() throws Exception {
StatefulRedisSentinelConnection<String, String> statefulConnection = sentinel.getStatefulConnection();
assertThat(statefulConnection).isSameAs(statefulConnection.async().getStatefulConnection());
}
@Test
public void testSyncConnection() throws Exception {
StatefulRedisSentinelConnection<String, String> statefulConnection = sentinel.getStatefulConnection();
RedisSentinelCommands<String, String> sync = statefulConnection.sync();
assertThat(sync.ping()).isEqualTo("PONG");
}
@Test
public void testSyncAsyncConversion() throws Exception {
StatefulRedisSentinelConnection<String, String> statefulConnection = sentinel.getStatefulConnection();
assertThat(statefulConnection.sync().getStatefulConnection()).isSameAs(statefulConnection);
assertThat(statefulConnection.sync().getStatefulConnection().sync()).isSameAs(statefulConnection.sync());
}
@Test
public void testSyncClose() throws Exception {
StatefulRedisSentinelConnection<String, String> statefulConnection = sentinel.getStatefulConnection();
statefulConnection.sync().close();
Wait.untilTrue(() -> !sentinel.isOpen()).waitOrTimeout();
assertThat(sentinel.isOpen()).isFalse();
assertThat(statefulConnection.isOpen()).isFalse();
}
@Test
public void testAsyncClose() throws Exception {
StatefulRedisSentinelConnection<String, String> statefulConnection = sentinel.getStatefulConnection();
statefulConnection.async().close();
Wait.untilTrue(() -> !sentinel.isOpen()).waitOrTimeout();
assertThat(sentinel.isOpen()).isFalse();
assertThat(statefulConnection.isOpen()).isFalse();
}
@Test
public void connectToOneNode() throws Exception {
RedisSentinelCommands<String, String> connection = sentinelClient
.connectSentinel(RedisURI.Builder.sentinel(TestSettings.host(), MASTER_ID).build()).sync();
assertThat(connection.ping()).isEqualTo("PONG");
connection.close();
}
@Test
public void deprecatedConnectToOneNode() throws Exception {
RedisSentinelAsyncCommands<String, String> connection = sentinelClient
.connectSentinelAsync(RedisURI.Builder.sentinel(TestSettings.host(), MASTER_ID).build());
assertThat(connection.ping().get()).isEqualTo("PONG");
connection.close();
}
@Test
public void connectWithByteCodec() throws Exception {
RedisSentinelCommands<byte[], byte[]> connection = sentinelClient.connectSentinel(new ByteArrayCodec()).sync();
assertThat(connection.master(MASTER_ID.getBytes())).isNotNull();
connection.close();
}
@Test
public void deprecatedConnectWithByteCodec() throws Exception {
RedisSentinelAsyncCommands<byte[], byte[]> connection = sentinelClient.connectSentinelAsync(new ByteArrayCodec());
assertThat(connection.master(MASTER_ID.getBytes())).isNotNull();
connection.close();
}
}