package com.lambdaworks.redis.masterslave;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import java.util.List;
import org.junit.Test;
import com.lambdaworks.redis.RedisURI;
import com.lambdaworks.redis.TestSettings;
import com.lambdaworks.redis.api.StatefulRedisConnection;
import com.lambdaworks.redis.models.role.RedisInstance;
import com.lambdaworks.redis.models.role.RedisNodeDescription;
/**
* @author Mark Paluch
*/
public class MasterSlaveTopologyProviderTest {
private StatefulRedisConnection<String, String> connectionMock = mock(StatefulRedisConnection.class);
private MasterSlaveTopologyProvider sut = new MasterSlaveTopologyProvider(connectionMock,
RedisURI.Builder.redis(TestSettings.host(), TestSettings.port()).build());
@Test
public void shouldParseMaster() throws Exception {
String info = "# Replication\r\n" + "role:master\r\n" + "connected_slaves:1\r\n" + "master_repl_offset:56276\r\n"
+ "repl_backlog_active:1\r\n";
List<RedisNodeDescription> result = sut.getNodesFromInfo(info);
assertThat(result).hasSize(1);
RedisNodeDescription redisNodeDescription = result.get(0);
assertThat(redisNodeDescription.getRole()).isEqualTo(RedisInstance.Role.MASTER);
assertThat(redisNodeDescription.getUri().getHost()).isEqualTo(TestSettings.host());
assertThat(redisNodeDescription.getUri().getPort()).isEqualTo(TestSettings.port());
}
@Test
public void shouldParseMasterAndSlave() throws Exception {
String info = "# Replication\r\n" + "role:slave\r\n" + "connected_slaves:1\r\n" + "master_host:127.0.0.1\r\n"
+ "master_port:1234\r\n" + "master_repl_offset:56276\r\n" + "repl_backlog_active:1\r\n";
List<RedisNodeDescription> result = sut.getNodesFromInfo(info);
assertThat(result).hasSize(2);
RedisNodeDescription slave = result.get(0);
assertThat(slave.getRole()).isEqualTo(RedisInstance.Role.SLAVE);
RedisNodeDescription master = result.get(1);
assertThat(master.getRole()).isEqualTo(RedisInstance.Role.MASTER);
assertThat(master.getUri().getHost()).isEqualTo("127.0.0.1");
}
@Test
public void shouldParseIPv6MasterAddress() throws Exception {
String info = "# Replication\r\n" + "role:slave\r\n" + "connected_slaves:1\r\n" + "master_host:::20f8:1400:0:0\r\n"
+ "master_port:1234\r\n" + "master_repl_offset:56276\r\n" + "repl_backlog_active:1\r\n";
List<RedisNodeDescription> result = sut.getNodesFromInfo(info);
assertThat(result).hasSize(2);
RedisNodeDescription slave = result.get(0);
assertThat(slave.getRole()).isEqualTo(RedisInstance.Role.SLAVE);
RedisNodeDescription master = result.get(1);
assertThat(master.getRole()).isEqualTo(RedisInstance.Role.MASTER);
assertThat(master.getUri().getHost()).isEqualTo("::20f8:1400:0:0");
}
@Test(expected = IllegalStateException.class)
public void shouldFailWithoutRole() throws Exception {
String info = "# Replication\r\n" + "connected_slaves:1\r\n" + "master_repl_offset:56276\r\n"
+ "repl_backlog_active:1\r\n";
sut.getNodesFromInfo(info);
}
@Test(expected = IllegalStateException.class)
public void shouldFailWithInvalidRole() throws Exception {
String info = "# Replication\r\n" + "role:abc\r\n" + "master_repl_offset:56276\r\n" + "repl_backlog_active:1\r\n";
sut.getNodesFromInfo(info);
}
@Test
public void shouldParseSlaves() throws Exception {
String info = "# Replication\r\n" + "role:master\r\n"
+ "slave0:ip=127.0.0.1,port=6483,state=online,offset=56276,lag=0\r\n"
+ "slave1:ip=127.0.0.1,port=6484,state=online,offset=56276,lag=0\r\n" + "master_repl_offset:56276\r\n"
+ "repl_backlog_active:1\r\n";
List<RedisNodeDescription> result = sut.getNodesFromInfo(info);
assertThat(result).hasSize(3);
RedisNodeDescription slave1 = result.get(1);
assertThat(slave1.getRole()).isEqualTo(RedisInstance.Role.SLAVE);
assertThat(slave1.getUri().getHost()).isEqualTo("127.0.0.1");
assertThat(slave1.getUri().getPort()).isEqualTo(6483);
RedisNodeDescription slave2 = result.get(2);
assertThat(slave2.getRole()).isEqualTo(RedisInstance.Role.SLAVE);
assertThat(slave2.getUri().getHost()).isEqualTo("127.0.0.1");
assertThat(slave2.getUri().getPort()).isEqualTo(6484);
}
@Test
public void shouldParseIPv6SlaveAddress() throws Exception {
String info = "# Replication\r\n" + "role:master\r\n"
+ "slave0:ip=::20f8:1400:0:0,port=6483,state=online,offset=56276,lag=0\r\n"
+ "master_repl_offset:56276\r\n"
+ "repl_backlog_active:1\r\n";
List<RedisNodeDescription> result = sut.getNodesFromInfo(info);
assertThat(result).hasSize(2);
RedisNodeDescription slave1 = result.get(1);
assertThat(slave1.getRole()).isEqualTo(RedisInstance.Role.SLAVE);
assertThat(slave1.getUri().getHost()).isEqualTo("::20f8:1400:0:0");
assertThat(slave1.getUri().getPort()).isEqualTo(6483);
}
}