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.hamcrest.Matchers.nullValue; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doThrow; 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.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import org.mockito.InjectMocks; import org.mockito.Mock; 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 UrlConnectionSensorTest extends TestBase { @InjectMocks UrlConnectionSensor sensor; @Mock RegisteredSensorConfig rsc; @Mock HttpURLConnection urlConnection; public static class GetClientRequestAdapter extends UrlConnectionSensorTest { public void properties() { ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); assertThat(adapter.getPropagationType(), is(PropagationType.HTTP)); assertThat(adapter.getReferenceType(), is(References.CHILD_OF)); assertThat(adapter.getFormat(), is(Format.Builtin.HTTP_HEADERS)); verifyZeroInteractions(rsc); } @Test public void spanStarting() { when(urlConnection.getRequestProperty(anyString())).thenReturn(null); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); assertThat(adapter.startClientSpan(), is(true)); } @Test public void spanStartingContainsHeader() { when(urlConnection.getRequestProperty(anyString())).thenReturn("bla bla"); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); assertThat(adapter.startClientSpan(), is(false)); } @Test public void spanStartingAlreadyConnected() throws Exception { doThrow(IllegalStateException.class).when(urlConnection).setRequestMethod(anyString()); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); assertThat(adapter.startClientSpan(), is(false)); } @Test public void url() throws MalformedURLException { String uri = "http://localhost"; when(urlConnection.getURL()).thenReturn(new URL(uri)); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_URL.getKey(), uri)); verifyZeroInteractions(rsc); } @Test public void urlNull() { when(urlConnection.getURL()).thenReturn(null); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(rsc); } @Test public void method() throws MalformedURLException { String method = "GET"; when(urlConnection.getRequestMethod()).thenReturn(method); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_METHOD.getKey(), method)); verifyZeroInteractions(rsc); } @Test public void baggageInjection() { String key = "key"; String value = "value"; ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(urlConnection, null, rsc); adapter.getCarrier().put(key, value); verify(urlConnection).setRequestProperty(key, value); verifyZeroInteractions(rsc); } @Test public void notUrlConnection() throws IOException { ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(new Object(), null, rsc); assertThat(adapter, is(nullValue())); } } public static class GetClientResponseAdapter extends UrlConnectionSensorTest { @Mock Object result; @Test public void status() throws IOException { int status = 200; when(urlConnection.getResponseCode()).thenReturn(status); when(rsc.getTargetMethodName()).thenReturn("getInputStream"); ResponseAdapter adapter = sensor.getClientResponseAdapter(urlConnection, null, result, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(Tags.HTTP_STATUS.getKey(), String.valueOf(status))); verify(rsc).getTargetMethodName(); verifyNoMoreInteractions(rsc); verifyZeroInteractions(result); } @Test public void statusIOException() throws IOException { when(urlConnection.getResponseCode()).thenThrow(new IOException()); when(rsc.getTargetMethodName()).thenReturn("getInputStream"); ResponseAdapter adapter = sensor.getClientResponseAdapter(urlConnection, null, result, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verify(rsc).getTargetMethodName(); verifyNoMoreInteractions(rsc); verifyZeroInteractions(result); } @Test public void notUrlConnection() throws IOException { when(rsc.getTargetMethodName()).thenReturn("getInputStream"); ResponseAdapter adapter = sensor.getClientResponseAdapter(new Object(), null, result, rsc); assertThat(adapter, is(nullValue())); verifyZeroInteractions(result, rsc); } @Test public void notInputStreamMethod() throws IOException { when(rsc.getTargetMethodName()).thenReturn("connect"); ResponseAdapter adapter = sensor.getClientResponseAdapter(urlConnection, null, result, rsc); assertThat(adapter, is(nullValue())); verify(rsc).getTargetMethodName(); verifyNoMoreInteractions(rsc); verifyZeroInteractions(result); } } }