package rocks.inspectit.agent.java.sensor.method.remote.server; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; 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 org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.testng.annotations.Test; import rocks.inspectit.agent.java.config.impl.RegisteredSensorConfig; import rocks.inspectit.agent.java.core.ICoreService; import rocks.inspectit.agent.java.core.IPlatformManager; import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanContextImpl; import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanImpl; import rocks.inspectit.agent.java.tracing.core.ServerInterceptor; import rocks.inspectit.agent.java.tracing.core.adapter.ResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.ServerAdapterProvider; import rocks.inspectit.agent.java.tracing.core.adapter.ServerRequestAdapter; import rocks.inspectit.shared.all.testbase.TestBase; import rocks.inspectit.shared.all.tracing.data.ServerSpan; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class RemoteServerHookTest extends TestBase { @InjectMocks RemoteServerHook hook; @Mock ICoreService coreService; @Mock ServerInterceptor serverInterceptor; @Mock ServerAdapterProvider adapterProvider; @Mock ServerRequestAdapter<?> requestAdapter; @Mock ResponseAdapter responseAdapter; @Mock IPlatformManager platformManager; @Mock Object object; @Mock Object result; @Mock RegisteredSensorConfig rsc; @Test public void happyPath() throws Exception { // ids long platformId = 1l; long methodId = 7l; long sensorId = 13l; long spanId = 17l; // platform when(platformManager.getPlatformId()).thenReturn(platformId); // interceptor Object[] parameters = new String[] { "blah", "bla" }; doReturn(requestAdapter).when(adapterProvider).getServerRequestAdapter(object, parameters, rsc); doReturn(responseAdapter).when(adapterProvider).getServerResponseAdapter(object, parameters, result, rsc); SpanContextImpl context = mock(SpanContextImpl.class); when(context.getId()).thenReturn(spanId); SpanImpl spanImpl = mock(SpanImpl.class); when(spanImpl.context()).thenReturn(context); when(spanImpl.isClient()).thenReturn(false); when(serverInterceptor.handleRequest(requestAdapter)).thenReturn(spanImpl); when(serverInterceptor.handleResponse(spanImpl, responseAdapter)).thenReturn(spanImpl); // execute calls hook.beforeBody(methodId, sensorId, object, parameters, rsc); hook.firstAfterBody(methodId, sensorId, object, parameters, result, rsc); hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, rsc); ArgumentCaptor<ServerSpan> captor = ArgumentCaptor.forClass(ServerSpan.class); verify(coreService).addMethodSensorData(eq(sensorId), eq(methodId), eq(String.valueOf(spanId)), captor.capture()); assertThat(captor.getValue().getPlatformIdent(), is(platformId)); assertThat(captor.getValue().getSensorTypeIdent(), is(sensorId)); assertThat(captor.getValue().getMethodIdent(), is(methodId)); // verify timer, interceptor and adapters verify(serverInterceptor).handleRequest(requestAdapter); verify(serverInterceptor).handleResponse(spanImpl, responseAdapter); verify(adapterProvider).getServerRequestAdapter(object, parameters, rsc); verify(adapterProvider).getServerResponseAdapter(object, parameters, result, rsc); verifyNoMoreInteractions(adapterProvider, serverInterceptor, coreService); } @Test public void spanNull() throws Exception { // ids long platformId = 1l; long methodId = 7l; long sensorId = 13l; // platform when(platformManager.getPlatformId()).thenReturn(platformId); // interceptor Object[] parameters = new String[] { "blah", "bla" }; doReturn(requestAdapter).when(adapterProvider).getServerRequestAdapter(object, parameters, rsc); doReturn(responseAdapter).when(adapterProvider).getServerResponseAdapter(object, parameters, result, rsc); when(serverInterceptor.handleRequest(requestAdapter)).thenReturn(null); // execute calls hook.beforeBody(methodId, sensorId, object, parameters, rsc); hook.firstAfterBody(methodId, sensorId, object, parameters, result, rsc); hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, rsc); // verify timer, interceptor and adapters verify(serverInterceptor).handleRequest(requestAdapter); verify(adapterProvider).getServerRequestAdapter(object, parameters, rsc); verifyNoMoreInteractions(adapterProvider, serverInterceptor, coreService); verifyZeroInteractions(coreService); } @Test public void twoCalls() throws Exception { // ids long platformId = 1l; long methodId = 7l; long sensorId = 13l; long spanId = 17l; // platform when(platformManager.getPlatformId()).thenReturn(platformId); // interceptor Object[] parameters = new String[] { "blah", "bla" }; doReturn(requestAdapter).when(adapterProvider).getServerRequestAdapter(object, parameters, rsc); doReturn(responseAdapter).when(adapterProvider).getServerResponseAdapter(object, parameters, result, rsc); SpanContextImpl context = mock(SpanContextImpl.class); when(context.getId()).thenReturn(spanId); SpanImpl spanImpl = mock(SpanImpl.class); when(spanImpl.context()).thenReturn(context); when(spanImpl.isClient()).thenReturn(false); when(serverInterceptor.handleRequest(requestAdapter)).thenReturn(spanImpl); when(serverInterceptor.handleResponse(spanImpl, responseAdapter)).thenReturn(spanImpl); // execute calls hook.beforeBody(methodId, sensorId, object, parameters, rsc); // new call hook.beforeBody(methodId, sensorId, object, parameters, rsc); hook.firstAfterBody(methodId, sensorId, object, parameters, result, rsc); hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, rsc); // end new call hook.firstAfterBody(methodId, sensorId, object, parameters, result, rsc); hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, rsc); ArgumentCaptor<ServerSpan> captor = ArgumentCaptor.forClass(ServerSpan.class); verify(coreService).addMethodSensorData(eq(sensorId), eq(methodId), eq(String.valueOf(spanId)), captor.capture()); assertThat(captor.getValue().getPlatformIdent(), is(platformId)); assertThat(captor.getValue().getSensorTypeIdent(), is(sensorId)); assertThat(captor.getValue().getMethodIdent(), is(methodId)); // verify timer, interceptor and adapters verify(serverInterceptor).handleRequest(requestAdapter); verify(serverInterceptor).handleResponse(spanImpl, responseAdapter); verify(adapterProvider).getServerRequestAdapter(object, parameters, rsc); verify(adapterProvider).getServerResponseAdapter(object, parameters, result, rsc); verifyNoMoreInteractions(adapterProvider, serverInterceptor, coreService); } }