package com.netflix.eureka.util; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.transport.EurekaTransportConfig; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.EurekaServerContext; import com.netflix.eureka.cluster.PeerEurekaNode; import com.netflix.eureka.cluster.PeerEurekaNodes; import com.netflix.eureka.registry.PeerAwareInstanceRegistry; public class StatusUtilTest { @Test public void testGetStatusInfoHealthy() { StatusUtil statusUtil = getStatusUtil(3, 3, 2); assertTrue(statusUtil.getStatusInfo().isHealthy()); } @Test public void testGetStatusInfoUnhealthy() { StatusUtil statusUtil = getStatusUtil(5, 3, 4); assertFalse(statusUtil.getStatusInfo().isHealthy()); } @Test public void testGetStatusInfoUnsetHealth() { StatusUtil statusUtil = getStatusUtil(5, 3, -1); StatusInfo statusInfo = statusUtil.getStatusInfo(); try { statusInfo.isHealthy(); } catch (NullPointerException e) { // Expected that the healthy flag is not set when the minimum value is -1 return; } fail("Excpected NPE to be thrown when healthy threshold is not set"); } /** * @param replicas the number of replicas to mock * @param instances the number of instances to mock * @param minimum the minimum number of peers * @return the status utility with the mocked replicas/instances */ private StatusUtil getStatusUtil(int replicas, int instances, int minimum) { EurekaServerContext mockEurekaServerContext = mock(EurekaServerContext.class); List<InstanceInfo> mockInstanceInfos = getMockInstanceInfos(instances); Application mockApplication = mock(Application.class); when(mockApplication.getInstances()).thenReturn(mockInstanceInfos); ApplicationInfoManager mockAppInfoManager = mock(ApplicationInfoManager.class); when(mockAppInfoManager.getInfo()).thenReturn(mockInstanceInfos.get(0)); when(mockEurekaServerContext.getApplicationInfoManager()).thenReturn(mockAppInfoManager); PeerAwareInstanceRegistry mockRegistry = mock(PeerAwareInstanceRegistry.class); when(mockRegistry.getApplication("stuff", false)).thenReturn(mockApplication); when(mockEurekaServerContext.getRegistry()).thenReturn(mockRegistry); List<PeerEurekaNode> mockNodes = getMockNodes(replicas); EurekaTransportConfig mockTransportConfig = mock(EurekaTransportConfig.class); when(mockTransportConfig.applicationsResolverUseIp()).thenReturn(false); EurekaClientConfig mockClientConfig = mock(EurekaClientConfig.class); when(mockClientConfig.getTransportConfig()).thenReturn(mockTransportConfig); EurekaServerConfig mockServerConfig = mock(EurekaServerConfig.class); when(mockServerConfig.getHealthStatusMinNumberOfAvailablePeers()).thenReturn(minimum); PeerEurekaNodes peerEurekaNodes = new PeerEurekaNodes(mockRegistry, mockServerConfig, mockClientConfig, null, mockAppInfoManager); PeerEurekaNodes spyPeerEurekaNodes = spy(peerEurekaNodes); when(spyPeerEurekaNodes.getPeerEurekaNodes()).thenReturn(mockNodes); when(mockEurekaServerContext.getPeerEurekaNodes()).thenReturn(spyPeerEurekaNodes); return new StatusUtil(mockEurekaServerContext); } List<InstanceInfo> getMockInstanceInfos(int size) { List<InstanceInfo> instances = new ArrayList<>(); for (int i = 0; i < size; i++) { InstanceInfo mockInstance = mock(InstanceInfo.class); when(mockInstance.getHostName()).thenReturn(String.valueOf(i)); when(mockInstance.getIPAddr()).thenReturn(String.valueOf(i)); when(mockInstance.getAppName()).thenReturn("stuff"); instances.add(mockInstance); } return instances; } List<PeerEurekaNode> getMockNodes(int size) { List<PeerEurekaNode> nodes = new ArrayList<>(); for (int i = 0; i < size; i++) { PeerEurekaNode mockNode = mock(PeerEurekaNode.class); when(mockNode.getServiceUrl()).thenReturn(String.format("http://%d:8080/v2", i)); nodes.add(mockNode); } return nodes; } }