package rocks.inspectit.agent.java.sensor.method.remote.server.http;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.testng.annotations.Test;
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.ResponseAdapter;
import rocks.inspectit.agent.java.tracing.core.adapter.ServerRequestAdapter;
import rocks.inspectit.shared.all.testbase.TestBase;
import rocks.inspectit.shared.all.tracing.data.PropagationType;
/**
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class JavaHttpRemoteServerSensorTest extends TestBase {
@InjectMocks
JavaHttpRemoteServerSensor sensor;
@Mock
RegisteredSensorConfig rsc;
@Mock
HttpServletRequest httpRequest;
@Mock
HttpServletResponse httpResponse;
public static class GetServerRequestAdapter extends JavaHttpRemoteServerSensorTest {
@Mock
Object object;
@Test
public void properties() {
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
assertThat(adapter.getPropagationType(), is(PropagationType.HTTP));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void uri() {
String uri = "uri";
when(httpRequest.getRequestURI()).thenReturn(uri);
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(1));
assertThat(tags, hasEntry(Tags.HTTP_URL.getKey(), uri));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void uriNull() {
when(httpRequest.getRequestURI()).thenReturn(null);
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void method() {
String method = "get";
when(httpRequest.getMethod()).thenReturn(method);
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(1));
assertThat(tags, hasEntry(Tags.HTTP_METHOD.getKey(), method));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void methodNull() {
when(httpRequest.getMethod()).thenReturn(null);
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
Map<String, String> tags = adapter.getTags();
assertThat(tags.size(), is(0));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void baggageExtraction() {
String key = "key";
String value = "value";
when(httpRequest.getHeader(key)).thenReturn(value);
doReturn(Collections.enumeration(Collections.singleton(key))).when(httpRequest).getHeaderNames();
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
Entry<String, String> next = adapter.getCarrier().iterator().next();
assertThat(next.getKey(), is(key));
assertThat(next.getValue(), is(value));
assertThat(adapter.getCarrier().iterator().hasNext(), is(false));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void baggageExtractionEnumerationEmpty() throws Exception {
doReturn(Collections.enumeration(Collections.emptyList())).when(httpRequest).getHeaderNames();
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
assertThat(adapter.getCarrier().iterator().hasNext(), is(false));
verifyZeroInteractions(object, httpResponse, rsc);
}
@Test
public void baggageExtractionEnumerationNull() throws Exception {
doReturn(null).when(httpRequest).getHeaderNames();
ServerRequestAdapter<TextMap> adapter = sensor.getServerRequestAdapter(object, new Object[] { httpRequest, httpResponse }, rsc);
assertThat(adapter.getCarrier().iterator().hasNext(), is(false));
verifyZeroInteractions(object, httpResponse, rsc);
}
}
public static class GetServertResponseAdapter extends JavaHttpRemoteServerSensorTest {
@Mock
Object object;
@Test
public void status() {
int status = 200;
when(httpResponse.getStatus()).thenReturn(status);
ResponseAdapter adapter = sensor.getServerResponseAdapter(object, new Object[] { httpRequest, httpResponse }, null, 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);
}
}
}