package com.lambdaworks.redis.cluster;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.TimeUnit;
import com.lambdaworks.redis.resource.ClientResources;
import com.lambdaworks.redis.resource.DnsResolvers;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.lambdaworks.redis.RedisURI;
import com.lambdaworks.redis.cluster.models.partitions.Partitions;
import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
/**
* @author Mark Paluch
*/
@RunWith(MockitoJUnitRunner.class)
public class RoundRobinSocketAddressSupplierTest {
private static RedisURI hap1 = new RedisURI("127.0.0.1", 1, 1, TimeUnit.SECONDS);
private static RedisURI hap2 = new RedisURI("127.0.0.1", 2, 1, TimeUnit.SECONDS);
private static RedisURI hap3 = new RedisURI("127.0.0.1", 3, 1, TimeUnit.SECONDS);
private static RedisURI hap4 = new RedisURI("127.0.0.1", 4, 1, TimeUnit.SECONDS);
private static Partitions partitions;
@Mock
private ClientResources clientResourcesMock;
@BeforeClass
public static void beforeClass() throws Exception {
hap1.getResolvedAddress();
hap2.getResolvedAddress();
hap3.getResolvedAddress();
}
@Before
public void before() throws Exception {
when(clientResourcesMock.dnsResolver()).thenReturn(DnsResolvers.JVM_DEFAULT);
partitions = new Partitions();
partitions.addPartition(
new RedisClusterNode(hap1, "1", true, "", 0, 0, 0, new ArrayList<>(), new HashSet<>()));
partitions.addPartition(
new RedisClusterNode(hap2, "2", true, "", 0, 0, 0, new ArrayList<>(), new HashSet<>()));
partitions.addPartition(
new RedisClusterNode(hap3, "3", true, "", 0, 0, 0, new ArrayList<>(), new HashSet<>()));
partitions.updateCache();
}
@Test
public void noOffset() throws Exception {
RoundRobinSocketAddressSupplier sut = new RoundRobinSocketAddressSupplier(partitions, redisClusterNodes -> redisClusterNodes,
clientResourcesMock);
assertThat(sut.get()).isEqualTo(hap1.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap2.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap3.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap1.getResolvedAddress());
assertThat(sut.get()).isNotEqualTo(hap3.getResolvedAddress());
}
@Test
public void partitionTableChanges() throws Exception {
RoundRobinSocketAddressSupplier sut = new RoundRobinSocketAddressSupplier(partitions, redisClusterNodes -> redisClusterNodes,
clientResourcesMock);
assertThat(sut.get()).isEqualTo(hap1.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap2.getResolvedAddress());
partitions.add(
new RedisClusterNode(hap4, "4", true, "", 0, 0, 0, new ArrayList<>(), new HashSet<>()));
assertThat(sut.get()).isEqualTo(hap1.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap2.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap3.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap4.getResolvedAddress());
assertThat(sut.get()).isEqualTo(hap1.getResolvedAddress());
}
}