package com.netflix.discovery;
import com.netflix.appinfo.DataCenterInfo;
import com.netflix.appinfo.HealthCheckHandler;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.LeaseInfo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.UUID;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author David Liu
*/
public class InstanceInfoReplicatorTest {
private final int burstSize = 2;
private final int refreshRateSeconds = 2;
private DiscoveryClient discoveryClient;
private InstanceInfoReplicator replicator;
@Before
public void setUp() throws Exception {
discoveryClient = mock(DiscoveryClient.class);
HealthCheckHandler healthCheckHandler = mock(HealthCheckHandler.class);
when(discoveryClient.getHealthCheckHandler()).thenReturn(healthCheckHandler);
when(healthCheckHandler.getStatus(any(InstanceInfo.InstanceStatus.class))).thenReturn(null);
InstanceInfo.Builder builder = InstanceInfo.Builder.newBuilder()
.setIPAddr("10.10.101.00")
.setHostName("Hosttt")
.setAppName("EurekaTestApp-" + UUID.randomUUID())
.setDataCenterInfo(new DataCenterInfo() {
@Override
public Name getName() {
return Name.MyOwn;
}
})
.setLeaseInfo(LeaseInfo.Builder.newBuilder().setRenewalIntervalInSecs(30).build());
InstanceInfo instanceInfo = builder.build();
instanceInfo.setStatus(InstanceInfo.InstanceStatus.DOWN);
this.replicator = new InstanceInfoReplicator(discoveryClient, instanceInfo, refreshRateSeconds, burstSize);
}
@After
public void tearDown() throws Exception {
replicator.stop();
}
@Test
public void testOnDemandUpdate() throws Throwable {
assertTrue(replicator.onDemandUpdate());
Thread.sleep(10); // give some time for execution
assertTrue(replicator.onDemandUpdate());
Thread.sleep(1000 * refreshRateSeconds / 2);
assertTrue(replicator.onDemandUpdate());
Thread.sleep(10);
verify(discoveryClient, times(3)).refreshInstanceInfo();
verify(discoveryClient, times(1)).register();
}
@Test
public void testOnDemandUpdateRateLimiting() throws Throwable {
assertTrue(replicator.onDemandUpdate());
Thread.sleep(10); // give some time for execution
assertTrue(replicator.onDemandUpdate());
Thread.sleep(10); // give some time for execution
assertFalse(replicator.onDemandUpdate());
Thread.sleep(10);
verify(discoveryClient, times(2)).refreshInstanceInfo();
verify(discoveryClient, times(1)).register();
}
@Test
public void testOnDemandUpdateResetAutomaticRefresh() throws Throwable {
replicator.start(0);
Thread.sleep(1000 * refreshRateSeconds / 2);
assertTrue(replicator.onDemandUpdate());
Thread.sleep(1000 * refreshRateSeconds + 50);
verify(discoveryClient, times(3)).refreshInstanceInfo(); // 1 initial refresh, 1 onDemand, 1 auto
verify(discoveryClient, times(1)).register(); // all but 1 is no-op
}
@Test
public void testOnDemandUpdateResetAutomaticRefreshWithInitialDelay() throws Throwable {
replicator.start(1000 * refreshRateSeconds);
assertTrue(replicator.onDemandUpdate());
Thread.sleep(1000 * refreshRateSeconds + 100);
verify(discoveryClient, times(2)).refreshInstanceInfo(); // 1 onDemand, 1 auto
verify(discoveryClient, times(1)).register(); // all but 1 is no-op
}
}