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.verifyZeroInteractions; import java.lang.reflect.Constructor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.testng.annotations.Test; import rocks.inspectit.agent.java.config.impl.SpecialSensorConfig; import rocks.inspectit.shared.all.testbase.TestBase; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class ClassLoadingDelegationHookTest extends TestBase { @InjectMocks ClassLoadingDelegationHook hook; @Mock SpecialSensorConfig ssc; @Mock Object object; public static class BeforeBody extends ClassLoadingDelegationHookTest { static final long METHOD_ID = 11L; @Test public void happyPath() { Object[] parameters = new String[] { ClassLoadingDelegationHookTest.class.getName() }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is((Object) ClassLoadingDelegationHookTest.class)); verifyZeroInteractions(object, ssc); } @Test public void notOurClass() { Object[] parameters = new String[] { String.class.getName() }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void notExistingOurClass() { Object[] parameters = new String[] { "rocks.inspectit.agent.java.StupidClass" }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void emptyParameters() { Object[] parameters = new String[] {}; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void nullParameters() { Object[] parameters = null; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void nullFirstParameter() { Object[] parameters = new String[] { null }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void tooMuchParameters() { Object[] parameters = new String[] { "bla", "nah" }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void wrongParameterType() { Object[] parameters = new Long[] { 1L }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(object, ssc); } @Test public void opentracingClass() throws Exception { Object[] parameters = new String[] { io.opentracing.Tracer.class.getName() }; Object result = hook.beforeBody(METHOD_ID, object, parameters, ssc); assertThat(result, is((Object) io.opentracing.Tracer.class)); verifyZeroInteractions(object, ssc); } @Test public void reflectAsmClassLoader() throws Exception { Class<?> classLoaderClass = Class.forName("com.esotericsoftware.reflectasm.AccessClassLoader"); Constructor<?> constructor = classLoaderClass.getDeclaredConstructor(ClassLoader.class); constructor.setAccessible(true); Object classLoader = constructor.newInstance(this.getClass().getClassLoader()); Object[] parameters = new String[] { ClassLoadingDelegationHookTest.class.getName() }; Object result = hook.beforeBody(METHOD_ID, classLoader, parameters, ssc); assertThat(result, is(nullValue())); verifyZeroInteractions(ssc); } } public static class AfterBody extends ClassLoadingDelegationHookTest { @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); } } }