package rocks.inspectit.agent.java.sensor.method.special; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Mockito.mock; 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.util.Collections; import javax.management.MBeanServer; import org.mockito.Mock; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import rocks.inspectit.agent.java.config.impl.SpecialSensorConfig; import rocks.inspectit.agent.java.sensor.jmx.IMBeanServerListener; import rocks.inspectit.shared.all.testbase.TestBase; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class MBeanServerInterceptorHookTest extends TestBase { MBeanServerInterceptorHook hook; @Mock SpecialSensorConfig ssc; @Mock Object object; @Mock IMBeanServerListener listener; @Mock MBeanServer server; @BeforeMethod public void init() { hook = new MBeanServerInterceptorHook(Collections.singletonList(listener)); } public static class BeforeBody extends MBeanServerInterceptorHookTest { static final long METHOD_ID = 11L; @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); } @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); } @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 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 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 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); } } public static class AfterBody extends MBeanServerInterceptorHookTest { @Test public void ignored() { long methodId = 11L; Object[] parameters = new Object[] {}; Object result = mock(Object.class); Object resultAfter = hook.afterBody(methodId, object, parameters, result, ssc); assertThat(resultAfter, is(nullValue())); verifyZeroInteractions(object, result, ssc, listener); } } }