package rocks.inspectit.agent.java.sensor.method.remote.client.mq; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.util.Collections; 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 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.constants.ExtraTags; import rocks.inspectit.shared.all.tracing.data.PropagationType; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class JmsRemoteClientSensorTest extends TestBase { @InjectMocks JmsRemoteClientSensor sensor; @Mock RegisteredSensorConfig rsc; public static class GetClientRequestAdapter extends JmsRemoteClientSensorTest { @Mock Object object; @Mock Message message; @Mock Destination jmsDestination; @Test public void properties() { when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); assertThat(adapter.getPropagationType(), is(PropagationType.JMS)); assertThat(adapter.getReferenceType(), is(References.FOLLOWS_FROM)); assertThat(adapter.getFormat(), is(Format.Builtin.TEXT_MAP)); verifyZeroInteractions(object); } @Test public void spanStarting() { when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); assertThat(adapter.startClientSpan(), is(true)); } @Test public void destination() throws Exception { String destination = "destination"; when(message.getJMSDestination()).thenReturn(jmsDestination); when(jmsDestination.toString()).thenReturn(destination); when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(ExtraTags.JMS_MESSAGE_DESTINATION, destination)); verifyZeroInteractions(object); } @Test public void destinationNull() throws Exception { when(message.getJMSDestination()).thenReturn(null); when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object); } @Test public void destinationException() throws Exception { when(message.getJMSDestination()).thenThrow(new Exception()); when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object); } @Test public void messageId() throws Exception { String id = "id"; when(message.getJMSMessageID()).thenReturn(id); when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(1)); assertThat(tags, hasEntry(ExtraTags.JMS_MESSAGE_ID, id)); verifyZeroInteractions(object); } @Test public void messageIdException() throws Exception { when(message.getJMSMessageID()).thenThrow(new Exception()); when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object); } @Test public void baggageInjection() throws Exception { String key = "key"; String value = "value"; when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); adapter.getCarrier().put(key, value); verify(message).setStringProperty(key, value); verifyZeroInteractions(object); } } public static class GetClientResponseAdapter extends JmsRemoteClientSensorTest { @Mock Object object; @Mock Object result; @Test public void empty() { ResponseAdapter adapter = sensor.getClientResponseAdapter(object, null, result, rsc); Map<String, String> tags = adapter.getTags(); assertThat(tags.size(), is(0)); verifyZeroInteractions(object, result, rsc); } } interface Message { Destination getJMSDestination() throws Exception; String getJMSMessageID() throws Exception; void setStringProperty(String key, String value) throws Exception; }; interface Destination { }; }