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.anyObject;
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.net.URI;
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 SpringRestTemplateClientSensorTest extends TestBase {
@InjectMocks
SpringRestTemplateClientSensor sensor;
@Mock
RegisteredSensorConfig rsc;
@Mock
ClientHttpRequest httpRequest;
public static class GetClientRequestAdapter extends SpringRestTemplateClientSensorTest {
@Mock
Headers headers;
@Test
public void properties() {
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
assertThat(adapter.getPropagationType(), is(PropagationType.HTTP));
assertThat(adapter.getReferenceType(), is(References.CHILD_OF));
assertThat(adapter.getFormat(), is(Format.Builtin.HTTP_HEADERS));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void propertiesAsync() {
when(rsc.getTargetMethodName()).thenReturn("executeAsync");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
assertThat(adapter.getPropagationType(), is(PropagationType.HTTP));
assertThat(adapter.getReferenceType(), is(References.FOLLOWS_FROM));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void spanStarting() {
when(httpRequest.getHeaders()).thenReturn(headers);
when(headers.containsKey(anyObject())).thenReturn(false);
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
assertThat(adapter.startClientSpan(), is(true));
}
@Test
public void spanStartingContainsHeader() {
when(httpRequest.getHeaders()).thenReturn(headers);
when(headers.containsKey(anyObject())).thenReturn(true);
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
assertThat(adapter.startClientSpan(), is(false));
}
@Test
public void spanStartingHeadersNull() {
when(httpRequest.getHeaders()).thenReturn(null);
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
assertThat(adapter.startClientSpan(), is(true));
}
@Test
public void url() throws Exception {
String uri = "http://localhost";
when(httpRequest.getURI()).thenReturn(new URI(uri));
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(1));
assertThat(tags, hasEntry(Tags.HTTP_URL.getKey(), uri));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void urlUriNull() {
when(httpRequest.getURI()).thenReturn(null);
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void method() throws Exception {
String method = "GET";
when(httpRequest.getMethod()).thenReturn(method);
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(1));
assertThat(tags, hasEntry(Tags.HTTP_METHOD.getKey(), method));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void methodNull() {
when(httpRequest.getMethod()).thenReturn(null);
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void baggageInjection() {
String key = "key";
String value = "value";
when(httpRequest.getHeaders()).thenReturn(headers);
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
adapter.getCarrier().put(key, value);
verify(headers).set(key, value);
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
@Test
public void baggageInjectionHeadersNull() {
String key = "key";
String value = "value";
when(httpRequest.getHeaders()).thenReturn(null);
when(rsc.getTargetMethodName()).thenReturn("execute");
ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(httpRequest, null, rsc);
adapter.getCarrier().put(key, value);
verify(rsc).getTargetMethodName();
verifyNoMoreInteractions(rsc);
}
}
public static class GetClientResponseAdapter extends SpringRestTemplateClientSensorTest {
@Mock
ClientHttpResponse httpResponse;
@Test
public void responseNull() {
ResponseAdapter adapter = sensor.getClientResponseAdapter(httpRequest, null, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verify(rsc).getTargetMethodName();
verifyZeroInteractions(httpRequest);
verifyNoMoreInteractions(rsc);
}
@Test
public void status() {
int status = 200;
when(httpResponse.getRawStatusCode()).thenReturn(status);
when(rsc.getTargetMethodName()).thenReturn("execute");
ResponseAdapter adapter = sensor.getClientResponseAdapter(httpRequest, null, httpResponse, 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();
verifyZeroInteractions(httpRequest);
verifyNoMoreInteractions(rsc);
}
@Test
public void statusAsync() {
when(rsc.getTargetMethodName()).thenReturn("executeAsync");
ResponseAdapter adapter = sensor.getClientResponseAdapter(httpRequest, null, null, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verify(rsc).getTargetMethodName();
verifyZeroInteractions(httpRequest);
verifyNoMoreInteractions(rsc);
}
}
interface ClientHttpRequest {
Object getURI();
Object getMethod();
Headers getHeaders();
};
interface Headers {
void set(String key, String value);
boolean containsKey(Object key);
}
interface ClientHttpResponse {
int getRawStatusCode();
};
}