package rocks.inspectit.agent.java.connection.impl; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.slf4j.Logger; import org.springframework.context.ApplicationEventPublisher; import org.testng.annotations.Test; import rocks.inspectit.agent.java.connection.IConnection; import rocks.inspectit.agent.java.connection.ServerUnavailableException; import rocks.inspectit.agent.java.core.IPlatformManager; import rocks.inspectit.agent.java.event.AgentMessagesReceivedEvent; import rocks.inspectit.shared.all.communication.message.IAgentMessage; import rocks.inspectit.shared.all.testbase.TestBase; /** * Tests the {@link AgentMessageFetcher} class. * * @author Marius Oehler * */ @SuppressWarnings("PMD") public class AgentMessageFetcherTest extends TestBase { @InjectMocks AgentMessageFetcher messageFetcher; @Mock Logger log; /** * Test the {@link AgentMessageFetcher#postConstruct()} method. */ public static class PostConstruct extends AgentMessageFetcherTest { @Mock ScheduledExecutorService executorService; @Test public void successful() { messageFetcher.postConstruct(); verify(executorService).scheduleAtFixedRate(messageFetcher, 30L, 30L, TimeUnit.SECONDS); verifyNoMoreInteractions(executorService); } } /** * Test the {@link AgentMessageFetcher#run()} method. */ public static class Run extends AgentMessageFetcherTest { @Mock ApplicationEventPublisher eventPublisher; @Mock IPlatformManager platformManager; @Mock IConnection connection; @Test public void successful() throws Exception { when(connection.isConnected()).thenReturn(true); when(platformManager.getPlatformId()).thenReturn(10L); List<IAgentMessage<?>> messages = Arrays.<IAgentMessage<?>> asList(mock(IAgentMessage.class)); when(connection.fetchAgentMessages(10L)).thenReturn(messages); messageFetcher.run(); verify(connection).isConnected(); verify(connection).fetchAgentMessages(10L); verify(platformManager).getPlatformId(); ArgumentCaptor<AgentMessagesReceivedEvent> eventCaptor = ArgumentCaptor.forClass(AgentMessagesReceivedEvent.class); verify(eventPublisher).publishEvent(eventCaptor.capture()); verifyNoMoreInteractions(connection, eventPublisher, platformManager); assertThat(eventCaptor.getValue().getAgentMessages(), is(equalTo(messages))); } @Test @SuppressWarnings("unchecked") public void successfulNoMessages() throws Exception { when(connection.isConnected()).thenReturn(true); when(platformManager.getPlatformId()).thenReturn(10L); when(connection.fetchAgentMessages(10L)).thenReturn(Collections.EMPTY_LIST); messageFetcher.run(); verify(connection).isConnected(); verify(connection).fetchAgentMessages(10L); verify(platformManager).getPlatformId(); verifyNoMoreInteractions(connection, platformManager); verifyZeroInteractions(eventPublisher); } @Test @SuppressWarnings("unchecked") public void serverUnavailable() throws Exception { when(connection.isConnected()).thenReturn(true); when(platformManager.getPlatformId()).thenReturn(10L); when(connection.fetchAgentMessages(any(Long.class))).thenThrow(ServerUnavailableException.class); messageFetcher.run(); verify(connection).isConnected(); verify(connection).fetchAgentMessages(any(Long.class)); verify(platformManager).getPlatformId(); verifyNoMoreInteractions(connection, platformManager); verifyZeroInteractions(eventPublisher); } @Test @SuppressWarnings("unchecked") public void unexpectedException() throws Exception { when(connection.isConnected()).thenReturn(true); when(platformManager.getPlatformId()).thenReturn(10L); when(connection.fetchAgentMessages(any(Long.class))).thenThrow(RuntimeException.class); messageFetcher.run(); verify(connection).isConnected(); verify(connection).fetchAgentMessages(any(Long.class)); verify(platformManager).getPlatformId(); verifyNoMoreInteractions(connection, platformManager); verifyZeroInteractions(eventPublisher); } @Test public void notConnected() { when(connection.isConnected()).thenReturn(false); messageFetcher.run(); verify(connection).isConnected(); verifyNoMoreInteractions(connection); verifyZeroInteractions(eventPublisher, platformManager); } } }