package org.openstack.atlas.api.resources; import net.spy.memcached.MemcachedClient; import org.dozer.DozerBeanMapper; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.openstack.atlas.cfg.PublicApiServiceConfigurationKeys; import org.openstack.atlas.cfg.RestApiConfiguration; import org.openstack.atlas.api.integration.AsyncService; import org.openstack.atlas.api.integration.ReverseProxyLoadBalancerService; import org.openstack.atlas.service.domain.entities.LoadBalancer; import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException; import org.openstack.atlas.service.domain.operations.Operation; import org.openstack.atlas.service.domain.pojos.Stats; import org.openstack.atlas.service.domain.services.LoadBalancerService; import javax.jms.JMSException; import javax.ws.rs.core.Response; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.*; @RunWith(Enclosed.class) public class LoadBalancerResourceTest { public static class WhenRetrievingResources { private LoadBalancerResource loadBalancerResource; @Before public void setUp() { loadBalancerResource = new LoadBalancerResource(); } @Test public void shouldSetAccountIdAndLbIdForAccessListResource() { AccessListResource accessListResource = mock(AccessListResource.class); loadBalancerResource.setAccessListResource(accessListResource); loadBalancerResource.retrieveAccessListResource(); verify(accessListResource).setAccountId(anyInt()); verify(accessListResource).setLoadBalancerId(anyInt()); } @Test public void shouldSetAccountIdAndLbIdForHealthMonitorResource() { HealthMonitorResource healthMonitorResource = mock(HealthMonitorResource.class); loadBalancerResource.setHealthMonitorResource(healthMonitorResource); loadBalancerResource.retrieveHealthMonitorResource(); verify(healthMonitorResource).setAccountId(anyInt()); verify(healthMonitorResource).setLoadBalancerId(anyInt()); } @Test public void shouldSetAccountIdAndLbIdForNodesResource() { NodesResource nodesResource = mock(NodesResource.class); loadBalancerResource.setNodesResource(nodesResource); loadBalancerResource.retrieveNodesResource(); verify(nodesResource).setAccountId(anyInt()); verify(nodesResource).setLoadBalancerId(anyInt()); } @Test public void shouldSetAccountIdAndLbIdForSessionPersistenceResource() { SessionPersistenceResource persistenceResource = mock(SessionPersistenceResource.class); loadBalancerResource.setSessionPersistenceResource(persistenceResource); loadBalancerResource.retrieveSessionPersistenceResource(); verify(persistenceResource).setAccountId(anyInt()); verify(persistenceResource).setLoadBalancerId(anyInt()); } @Test public void shouldSetAccountIdAndLbIdForConnectionThrottleResource() { ConnectionThrottleResource throttleResource = mock(ConnectionThrottleResource.class); loadBalancerResource.setConnectionThrottleResource(throttleResource); loadBalancerResource.retrieveConnectionThrottleResource(); verify(throttleResource).setAccountId(anyInt()); verify(throttleResource).setLoadBalancerId(anyInt()); } @Test public void shouldSetAccountIdAndLbIdForVirtualIpsResource() { VirtualIpsResource virtualIpsResource = mock(VirtualIpsResource.class); loadBalancerResource.setVirtualIpsResource(virtualIpsResource); loadBalancerResource.retrieveVirtualIpsResource(); verify(virtualIpsResource).setAccountId(anyInt()); verify(virtualIpsResource).setLoadBalancerId(anyInt()); } } public static class WhenDeletingALoadBalancer { private LoadBalancerService loadBalancerService; private ReverseProxyLoadBalancerService reverseProxyLoadBalancerService; private AsyncService asyncService; private LoadBalancerResource loadBalancerResource; private Response response; @Before public void standUp() { loadBalancerService = mock(LoadBalancerService.class); reverseProxyLoadBalancerService = mock(ReverseProxyLoadBalancerService.class); asyncService = mock(AsyncService.class); loadBalancerResource = new LoadBalancerResource(); loadBalancerResource.setId(1); loadBalancerResource.setAccountId(1234); loadBalancerResource.setLoadBalancerService(loadBalancerService); loadBalancerResource.setAsyncService(asyncService); } @Test public void shouldReturnA202OnSuccess() throws Exception { when(loadBalancerService.get(anyInt())).thenReturn(null); doNothing().when(loadBalancerService).prepareForDelete(Matchers.<LoadBalancer>any()); doNothing().when(asyncService).callAsyncLoadBalancingOperation(Matchers.eq(Operation.DELETE_LOADBALANCER), Matchers.<LoadBalancer>any()); response = loadBalancerResource.deleteLoadBalancer(); Assert.assertEquals((String) response.getEntity(), 202, response.getStatus()); } @Test public void shouldReturnA404WhenEntityNotFoundIsThrown() throws Exception { when(loadBalancerService.get(anyInt())).thenReturn(null); doThrow(new EntityNotFoundException("Exception")).when(loadBalancerService).prepareForDelete(Matchers.<LoadBalancer>any()); response = loadBalancerResource.deleteLoadBalancer(); Assert.assertEquals(404, response.getStatus()); } @Test public void shouldReturnA500WhenDeletionFails() throws Exception { when(loadBalancerService.get(anyInt())).thenReturn(null); doThrow(new Exception("Exception")).when(loadBalancerService).prepareForDelete(Matchers.<LoadBalancer>any()); response = loadBalancerResource.deleteLoadBalancer(); Assert.assertEquals(500, response.getStatus()); } @Test public void shouldReturn500OnJmsException() throws Exception { when(loadBalancerService.get(anyInt())).thenReturn(null); doNothing().when(loadBalancerService).prepareForDelete(Matchers.<LoadBalancer>any()); doThrow(new JMSException("Exception")).when(asyncService).callAsyncLoadBalancingOperation(Matchers.eq(Operation.DELETE_LOADBALANCER), Matchers.<LoadBalancer>any()); response = loadBalancerResource.deleteLoadBalancer(); Assert.assertEquals(500, response.getStatus()); } } public static class WhenTestingStats { private LoadBalancerService loadBalancerService; private ReverseProxyLoadBalancerService reverseProxyLoadBalancerService; private AsyncService asyncService; private LoadBalancerResource loadBalancerResource; private RestApiConfiguration restApiConfiguration; private MemcachedClient memcachedClient; private DozerBeanMapper dozerBeanMapper; private Stats stats; org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer lb; private Response response; @Before public void standUp() { loadBalancerService = mock(LoadBalancerService.class); restApiConfiguration = mock(RestApiConfiguration.class); reverseProxyLoadBalancerService = mock(ReverseProxyLoadBalancerService.class); asyncService = mock(AsyncService.class); memcachedClient = mock(MemcachedClient.class); dozerBeanMapper = mock(DozerBeanMapper.class); loadBalancerResource = new LoadBalancerResource(); loadBalancerResource.setId(1); loadBalancerResource.setAccountId(1234); loadBalancerResource.setLoadBalancerService(loadBalancerService); loadBalancerResource.setAsyncService(asyncService); loadBalancerResource.setRestApiConfiguration(restApiConfiguration); loadBalancerResource.setReverseProxyLoadBalancerService(reverseProxyLoadBalancerService); loadBalancerResource.setDozerMapper(dozerBeanMapper); stats = new Stats(); stats.setConnectError(new int[]{90}); stats.setConnectFailure(new int[]{30}); stats.setConnectTimeOut(new int[]{40}); stats.setDataTimedOut(new int[]{500}); stats.setKeepAliveTimedOut(new int[]{40}); stats.setMaxConn(new int[]{20}); lb = new org.openstack.atlas.docs.loadbalancers.api.v1.LoadBalancer(); lb.setStatus("ACTIVE"); } @Ignore @Test public void shouldReturnOkWhenRetrievingStats() throws Exception { doReturn(true).when(restApiConfiguration).hasKeys(PublicApiServiceConfigurationKeys.stats); doReturn("true").when(restApiConfiguration).getString(PublicApiServiceConfigurationKeys.stats); when(loadBalancerService.get(anyInt(), anyInt())).thenReturn(null); doReturn(stats).when(reverseProxyLoadBalancerService).getLoadBalancerStats(Matchers.any(LoadBalancer.class)); response = loadBalancerResource.retrieveLoadBalancerStats(); Assert.assertEquals(200, response.getStatus()); } @Test public void shouldReturn400WhenRetrievingStatsWithFalseFlag() throws Exception { doReturn(true).when(restApiConfiguration).hasKeys(PublicApiServiceConfigurationKeys.stats); doReturn("false").when(restApiConfiguration).getString(PublicApiServiceConfigurationKeys.stats); when(loadBalancerService.get(anyInt())).thenReturn(null); doReturn(stats).when(reverseProxyLoadBalancerService).getLoadBalancerStats(Matchers.any(LoadBalancer.class)); response = loadBalancerResource.retrieveLoadBalancerStats(); Assert.assertEquals(400, response.getStatus()); } } }