package rocks.inspectit.agent.java.sensor.method.remote.client.http; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.util.Map; import org.mockito.InjectMocks; import org.mockito.Mock; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import io.opentracing.References; import io.opentracing.propagation.Format; import io.opentracing.propagation.TextMap; import io.opentracing.tag.Tags; import rocks.inspectit.agent.java.config.impl.RegisteredSensorConfig; import rocks.inspectit.agent.java.tracing.core.adapter.ClientRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.ResponseAdapter; import rocks.inspectit.shared.all.testbase.TestBase; import rocks.inspectit.shared.all.tracing.data.PropagationType; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class ApacheHttpClientV40SensorTest extends TestBase { @InjectMocks ApacheHttpClientV40Sensor sensor; @Mock RegisteredSensorConfig rsc; public static class GetClientRequestAdapter extends ApacheHttpClientV40SensorTest { @Mock Object object; @Mock HttpRequest httpRequest; @Mock RequestLine requestLine; @BeforeMethod public void setup() { when(httpRequest.getRequestLine()).thenReturn(requestLine); } @Test public void properties() { ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); assertThat(adapter.getPropagationType(), is(PropagationType.HTTP)); assertThat(adapter.getReferenceType(), is(References.CHILD_OF)); assertThat(adapter.getFormat(), is(Format.Builtin.HTTP_HEADERS)); verifyZeroInteractions(object, rsc); } @Test public void spanStarting() { when(httpRequest.containsHeader(anyString())).thenReturn(false); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); assertThat(adapter.startClientSpan(), is(true)); } @Test public void spanStartingContainsHeader() { when(httpRequest.containsHeader(anyString())).thenReturn(true); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); assertThat(adapter.startClientSpan(), is(false)); } @Test public void url() { String uri = "uri"; when(requestLine.getUri()).thenReturn(uri); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_URL.getKey(), uri)); verifyZeroInteractions(object, rsc); } @Test public void method() { String method = "get"; when(requestLine.getMethod()).thenReturn(method); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_METHOD.getKey(), method)); verifyZeroInteractions(object, rsc); } @Test public void nullRequestLine() { when(httpRequest.getRequestLine()).thenReturn(null); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object, rsc); } @Test public void baggageInjection() { String key = "key"; String value = "value"; ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { null, httpRequest }, rsc); adapter.getCarrier().put(key, value); verify(httpRequest).setHeader(key, value); verifyZeroInteractions(object, rsc); } } public static class GetClientResponseAdapter extends ApacheHttpClientV40SensorTest { @Mock Object object; @Mock HttpResponse httpResponse; @Mock StatusLine statusLine; @Test public void responseNull() { ResponseAdapter adapter = sensor.getClientResponseAdapter(object, null, null, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object, rsc); } @Test public void status() { int status = 200; when(statusLine.getStatusCode()).thenReturn(status); when(httpResponse.getStatusLine()).thenReturn(statusLine); ResponseAdapter adapter = sensor.getClientResponseAdapter(object, null, httpResponse, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_STATUS.getKey(), String.valueOf(status))); verifyZeroInteractions(object, rsc); } @Test public void statusNullStatusLine() { when(httpResponse.getStatusLine()).thenReturn(null); ResponseAdapter adapter = sensor.getClientResponseAdapter(object, null, httpResponse, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object, rsc); } } interface HttpRequest { RequestLine getRequestLine(); void setHeader(String key, String value); boolean containsHeader(String key); }; interface HttpResponse { StatusLine getStatusLine(); }; interface RequestLine { String getUri(); String getMethod(); }; interface StatusLine { int getStatusCode(); }; }