/** * Gets the message object from the parameters. This method will consult the * {@link RegisteredSensorConfig} in order to find parameter index with the FQN of * {@value JmsMessage#JAVAX_JMS_MESSAGE}. * * @param parameters * Parameters of method invocation. * @param rsc * {@link RegisteredSensorConfig} * @return Message object or <code>null</code> if one can not be located. */ private Object getMessage(Object[] parameters, RegisteredSensorConfig rsc) { int index = rsc.getParameterTypes().indexOf(JmsMessage.JAVAX_JMS_MESSAGE); if (index >= 0) { return parameters[index]; } return null; }
/** * {@inheritDoc} */ @Override public void secondAfterBody(ICoreService coreService, long methodId, long sensorTypeId, Object object, Object[] parameters, Object result, boolean exception, RegisteredSensorConfig rsc) { // NOCHK:8-params if (threadLast.get().booleanValue()) { threadLast.set(Boolean.FALSE); List<String> parameterTypes = rsc.getParameterTypes(); if (METHOD_VALUE_MAP.containsKey(rsc.getTargetMethodName()) && !parameterTypes.isEmpty() && "int".equals(parameterTypes.get(0))) { // subtract one as the index starts at 1, and not at 0 int index = ((Integer) parameters[0]).intValue() - 1; Object value = METHOD_VALUE_MAP.get(rsc.getTargetMethodName()); statementStorage.addParameter(object, index, value); } else if ((parameterTypes.size() >= 2) && "int".equals(parameterTypes.get(0))) { // subtract one as the index starts at 1, and not at 0 int index = ((Integer) parameters[0]).intValue() - 1; Object value = parameters[1]; statementStorage.addParameter(object, index, value); } else if ("clearParameters".equals(rsc.getTargetMethodName())) { statementStorage.clearParameters(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)); }
@BeforeMethod public void initTestClass() { statementHook = new StatementHook(timer, platformManager, connectionMetaDataStorage, statementReflectionCache, parameter); statementHook2 = new StatementHook(timer, platformManager, connectionMetaDataStorage, statementReflectionCache, parameter); List<String> list = new ArrayList<String>(); list.add("java.lang.String"); when(registeredSensorConfig.getParameterTypes()).thenReturn(list); }
@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 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 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 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 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.CHILD_OF)); assertThat(adapter.getFormat(), is(Format.Builtin.TEXT_MAP)); 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 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); } }
/** * Tests that no interaction is happening when first parameter is not 'int'. */ @SuppressWarnings("unchecked") @Test public void wrongFirstParameter() { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(2); Mockito.when(parameterTypes.get(0)).thenReturn("long"); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Object[] parameters = new Object[] { 1L, "Value" }; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); Mockito.verifyZeroInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }
/** * Tests arbitrary method with wrong parameter count. */ @SuppressWarnings("unchecked") @Test public void wrongMethodInstrumentation() { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(1); Mockito.when(parameterTypes.get(0)).thenReturn("int"); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Mockito.when(rsc.getTargetMethodName()).thenReturn("myMethod"); Object[] parameters = new Object[] { 1 }; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); Mockito.verifyZeroInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }
/** * Test setting of the correct index and parameter value. */ @SuppressWarnings("unchecked") @Test public void setCorrectParameterAndIndex() { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(2); Mockito.when(parameterTypes.get(0)).thenReturn("int"); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Object[] parameters = new Object[] { 1, "Value" }; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); Mockito.verify(statementStorage, Mockito.times(1)).addParameter(object, 0, "Value"); Mockito.verifyNoMoreInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }
/** * Test that setNull() methods of the prepare statement will set the <code>null</code> as the * parameter value. */ @SuppressWarnings("unchecked") @Test public void setNull() { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(2); Mockito.when(parameterTypes.get(0)).thenReturn("int"); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Mockito.when(rsc.getTargetMethodName()).thenReturn("setNull"); Object[] parameters = new Object[] { 1, 2 }; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); Mockito.verify(statementStorage, Mockito.times(1)).addParameter(object, 0, null); Mockito.verifyNoMoreInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }
/** * Tests clear parameters method being invoked. */ @SuppressWarnings("unchecked") @Test public void clearParameters() { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(0); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Mockito.when(rsc.getTargetMethodName()).thenReturn("clearParameters"); Object[] parameters = new Object[0]; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); Mockito.verify(statementStorage, Mockito.times(1)).clearParameters(object); Mockito.verifyNoMoreInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }
/** * Tests that the methods with big data structures will not set the complete structure, but a * simple marker instead. * * @param methodName * Method name that holds big structure. */ @SuppressWarnings("unchecked") @Test(dataProvider = "methodsWithBigDataStructures") public void methodWithBigData(String methodName) { List<String> parameterTypes = Mockito.mock(List.class); Mockito.when(parameterTypes.size()).thenReturn(2); Mockito.when(parameterTypes.get(0)).thenReturn("int"); Mockito.when(rsc.getParameterTypes()).thenReturn(parameterTypes); Mockito.when(rsc.getTargetMethodName()).thenReturn(methodName); Object[] parameters = new Object[] { 1, "Value" }; Object object = new Object(); preparedStatementParameterHook.beforeBody(0, 0, object, parameters, rsc); preparedStatementParameterHook.firstAfterBody(0, 0, object, parameters, null, false, rsc); preparedStatementParameterHook.secondAfterBody(coreService, 0, 0, object, parameters, null, false, rsc); String expected = "[" + methodName.substring("set".length()) + "]"; Mockito.verify(statementStorage, Mockito.times(1)).addParameter(object, 0, expected); Mockito.verifyNoMoreInteractions(statementStorage); Mockito.verifyZeroInteractions(coreService); }