package rocks.inspectit.server.service; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.Map; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.slf4j.Logger; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.testng.annotations.Test; import rocks.inspectit.server.dao.DefaultDataDao; import rocks.inspectit.server.dao.PlatformIdentDao; import rocks.inspectit.server.event.AgentDeletedEvent; import rocks.inspectit.server.util.AgentStatusDataProvider; import rocks.inspectit.shared.all.cmr.model.PlatformIdent; import rocks.inspectit.shared.all.communication.data.cmr.AgentStatusData; import rocks.inspectit.shared.all.communication.data.cmr.AgentStatusData.AgentConnection; import rocks.inspectit.shared.all.exception.BusinessException; import rocks.inspectit.shared.all.testbase.TestBase; @SuppressWarnings("PMD") public class GlobalDataAccessServiceTest extends TestBase { /** * Class under test. */ @InjectMocks GlobalDataAccessService globalDataAccessService; @Mock Logger log; @Mock PlatformIdentDao platformIdentDao; @Mock DefaultDataDao defaultDataDao; @Mock AgentStatusDataProvider agentStatusProvider; @Mock ApplicationEventPublisher eventPublisher; /** * Tests the {@link GlobalDataAccessService#deleteAgent(long)} method. */ public static class DeleteAgent extends GlobalDataAccessServiceTest { /** * No delete enabled when platform ident can not be found. */ @Test(expectedExceptions = { BusinessException.class }) public void testNonExistingAgentDelete() throws BusinessException { long platformId = 10L; when(platformIdentDao.load(Long.valueOf(platformId))).thenReturn(null); globalDataAccessService.deleteAgent(platformId); } /** * No delete enabled when agent is connected. */ @Test(expectedExceptions = { BusinessException.class }) public void testConnectedAgentDelete() throws BusinessException { long platformId = 10L; PlatformIdent platformIdent = new PlatformIdent(); platformIdent.setId(platformId); when(platformIdentDao.load(Long.valueOf(platformId))).thenReturn(platformIdent); Map<Long, AgentStatusData> map = new HashMap<>(1); AgentStatusData agentStatusData = new AgentStatusData(AgentConnection.CONNECTED); map.put(platformId, agentStatusData); when(agentStatusProvider.getAgentStatusDataMap()).thenReturn(map); globalDataAccessService.deleteAgent(platformId); } /** * Delete enabled when Agent is not connected. */ @Test public void testAgentDelete() throws BusinessException { long platformId = 10L; PlatformIdent platformIdent = new PlatformIdent(); platformIdent.setId(platformId); when(platformIdentDao.load(Long.valueOf(platformId))).thenReturn(platformIdent); Map<Long, AgentStatusData> map = new HashMap<>(1); AgentStatusData agentStatusData = new AgentStatusData(AgentConnection.DISCONNECTED); map.put(platformId, agentStatusData); when(agentStatusProvider.getAgentStatusDataMap()).thenReturn(map); globalDataAccessService.deleteAgent(platformId); verify(platformIdentDao, times(1)).delete(platformIdent); verify(defaultDataDao, times(1)).deleteAll(platformId); ArgumentCaptor<ApplicationEvent> captor = ArgumentCaptor.forClass(ApplicationEvent.class); verify(eventPublisher, times(1)).publishEvent(captor.capture()); AgentDeletedEvent event = (AgentDeletedEvent) captor.getValue(); assertThat(event.getPlatformId(), is(platformId)); } } }