/** * {@inheritDoc} */ @Override public Object dispatchSpecialMethodBeforeBody(long id, Object object, Object[] parameters) { try { SpecialSensorConfig ssc = specialMappings.get(id); IMethodSensor methodSensor = ssc.getSensor(); ISpecialHook specialHook = (ISpecialHook) methodSensor.getHook(); Object result = specialHook.beforeBody(id, object, parameters, ssc); if (null != result) { return result; } } catch (Throwable throwable) { // NOPMD log.error("An error happened in the Hook Dispatcher! (before special method)", throwable); } return null; }
/** * {@inheritDoc} */ @Override public Object beforeBody(long methodId, Object object, Object[] parameters, SpecialSensorConfig ssc) { String methodName = ssc.getTargetMethodName(); MBeanServer server = getServerFromParameters(parameters); if (ADD_METHOD.equals(methodName)) { mbeanServerAdded(server); } else if (REMOVE_METHOD.equals(methodName)) { mbeanServerRemoved(server); } else if (LOG.isWarnEnabled()) { LOG.warn("MBeanServerInterceptorHook not dispatched on the add or remove mbean server method. Dispatched method is " + methodName + " on class " + object.getClass().getName() + "."); } return null; }
SpecialSensorConfig ssc = new SpecialSensorConfig(); this.copyInfo(ssc, config); ssc.setId(specialInstrumentationPoint.getId()); IMethodSensor sensor = methodSensorMap.get(sensorId); if (null != sensor) { ssc.setSensor(sensor); } else { String methodFull = config.getTargetClassFqn() + "#" + config.getTargetMethodName();
ArgumentCaptor<SpecialSensorConfig> sscCaptor = ArgumentCaptor.forClass(SpecialSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(sscId), sscCaptor.capture()); assertThat(sscCaptor.getValue().getId(), is(sscId)); assertThat(sscCaptor.getValue().getSensor(), is(methodSensor)); assertThat(sscCaptor.getValue().getTargetClassFqn(), is(methodInstrumentationConfig.getTargetClassFqn())); assertThat(sscCaptor.getValue().getTargetMethodName(), is(methodInstrumentationConfig.getTargetMethodName())); assertThat(sscCaptor.getValue().getReturnType(), is(methodInstrumentationConfig.getReturnType())); verifyNoMoreInteractions(hookDispatcherMapper, connection, classHashHelper);
if (null != specialSensorConfig) { SpecialInstrumentationPoint specialInstrumentationPoint = config.getSpecialInstrumentationPoint(); hookDispatcherMapper.addMapping(specialSensorConfig.getId(), specialSensorConfig); methodToSensorMap.put(Long.valueOf(specialSensorConfig.getId()), new long[] { specialInstrumentationPoint.getSensorId() });
@Test public void wrongParameterType() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = new Object[] { 1L }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); } }
/** * {@inheritDoc} */ @Override public Object dispatchSpecialMethodAfterBody(long id, Object object, Object[] parameters, Object returnValue) { try { SpecialSensorConfig ssc = specialMappings.get(id); IMethodSensor methodSensor = ssc.getSensor(); ISpecialHook specialHook = (ISpecialHook) methodSensor.getHook(); Object result = specialHook.afterBody(id, object, parameters, returnValue, ssc); if (null != result) { return result; } } catch (Throwable throwable) { // NOPMD log.error("An error happened in the Hook Dispatcher! (after special method)", throwable); } return null; }
@Test public void notCorrectMethod() { when(ssc.getTargetMethodName()).thenReturn("somethingelse"); Object[] parameters = new Object[] { server }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); }
@Test public void dispatchNoSpecialHooks() { int methodId = 3; Object object = mock(Object.class); Object[] parameters = new Object[0]; Object returnValue = mock(Object.class); SpecialSensorConfig specialSensorConfig = mock(SpecialSensorConfig.class); when(specialSensorConfig.getSensor()).thenReturn(null); hookDispatcher.addMapping(methodId, specialSensorConfig); Object result = hookDispatcher.dispatchSpecialMethodBeforeBody(methodId, object, parameters); verify(specialSensorConfig, times(1)).getSensor(); assertThat(result, is(nullValue())); result = hookDispatcher.dispatchSpecialMethodAfterBody(methodId, object, parameters, returnValue); verify(specialSensorConfig, times(2)).getSensor(); assertThat(result, is(nullValue())); verifyZeroInteractions(object, coreService, returnValue); verifyNoMoreInteractions(specialSensorConfig); }
@Test public void tooMuchParameters() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = new Object[] { server, server }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); }
@Test public void dispatchOneSpecialHook() { long sensorTypeId = 7L; IMethodSensor methodSensor = mock(IMethodSensor.class); ISpecialHook specialHook = mock(ISpecialHook.class); MethodSensorTypeConfig methodSensorConfig = mock(MethodSensorTypeConfig.class); when(methodSensor.getHook()).thenReturn(specialHook); when(methodSensor.getSensorTypeConfig()).thenReturn(methodSensorConfig); when(methodSensorConfig.getId()).thenReturn(sensorTypeId); SpecialSensorConfig specialSensorConfig = mock(SpecialSensorConfig.class); when(specialSensorConfig.getSensor()).thenReturn(methodSensor); int methodId = 3; Object object = mock(Object.class); Object[] parameters = new Object[0]; Object returnValue = mock(Object.class); hookDispatcher.addMapping(methodId, specialSensorConfig); Object result = hookDispatcher.dispatchSpecialMethodBeforeBody(methodId, object, parameters); verify(specialSensorConfig, times(1)).getSensor(); verify(specialHook, times(1)).beforeBody(methodId, object, parameters, specialSensorConfig); assertThat(result, is(nullValue())); result = hookDispatcher.dispatchSpecialMethodAfterBody(methodId, object, parameters, returnValue); verify(specialSensorConfig, times(2)).getSensor(); verify(specialHook, times(1)).afterBody(methodId, object, parameters, returnValue, specialSensorConfig); assertThat(result, is(nullValue())); verifyZeroInteractions(object, coreService, returnValue); verifyNoMoreInteractions(specialSensorConfig, specialHook); }
@Test public void happyPathAdd() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = new Object[] { server }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verify(listener).mbeanServerAdded(server); verifyNoMoreInteractions(ssc, listener); verifyZeroInteractions(object); }
when(specialSensorConfig.getSensor()).thenReturn(methodSensor); verify(specialSensorConfig, times(1)).getSensor(); verify(specialHook, times(1)).beforeBody(methodId, object, parameters, specialSensorConfig); assertThat(result, is(resultBefore)); verify(specialSensorConfig, times(2)).getSensor(); verify(specialHook, times(1)).afterBody(methodId, object, parameters, returnValue, specialSensorConfig); assertThat(result, is(resultAfter));
@Test public void emptyParameters() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = new Object[] {}; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); }
@Test public void nullParameters() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = null; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); }
@Test public void nullFirstParameter() { when(ssc.getTargetMethodName()).thenReturn("addMBeanServer"); Object[] parameters = new String[] { null }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verifyNoMoreInteractions(ssc); verifyZeroInteractions(object, listener); }
@Test public void happyPathRemove() { when(ssc.getTargetMethodName()).thenReturn("removeMBeanServer"); Object[] parameters = new Object[] { server }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verify(ssc).getTargetMethodName(); verify(listener).mbeanServerRemoved(server); verifyNoMoreInteractions(ssc, listener); verifyZeroInteractions(object); }