package net.bytebuddy.agent; import net.bytebuddy.test.utility.MockitoRule; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.mockito.Mock; import java.lang.instrument.Instrumentation; import java.lang.reflect.*; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.fail; public class InstallerTest { private static final String FOO = "foo"; private static final String INSTRUMENTATION = "instrumentation"; private static final Object STATIC_FIELD = null; @Rule public final TestRule mockitoRule = new MockitoRule(this); @Mock private Instrumentation instrumentation; private Instrumentation actualInstrumentation; @Before public void setUp() throws Exception { Field field = Installer.class.getDeclaredField(INSTRUMENTATION); field.setAccessible(true); actualInstrumentation = (Instrumentation) field.get(STATIC_FIELD); } @After public void tearDown() throws Exception { Field field = Installer.class.getDeclaredField(INSTRUMENTATION); field.setAccessible(true); field.set(STATIC_FIELD, actualInstrumentation); } @Test public void testPreMain() throws Exception { Installer.premain(FOO, instrumentation); assertThat(ByteBuddyAgent.getInstrumentation(), is(instrumentation)); } @Test public void testAgentMain() throws Exception { Installer.agentmain(FOO, instrumentation); assertThat(ByteBuddyAgent.getInstrumentation(), is(instrumentation)); } @Test public void testAgentInstallerIsPublic() throws Exception { Class<?> type = Installer.class; assertThat(Modifier.isPublic(type.getModifiers()), is(true)); assertThat(type.getDeclaringClass(), nullValue(Class.class)); assertThat(type.getDeclaredClasses().length, is(0)); } @Test public void testAgentInstallerStoreIsPrivate() throws Exception { Field field = Installer.class.getDeclaredField("instrumentation"); assertThat(Modifier.isPrivate(field.getModifiers()), is(true)); } @Test public void testAgentInstallerGetterIsPublic() throws Exception { Method method = Installer.class.getDeclaredMethod("getInstrumentation"); assertThat(Modifier.isPublic(method.getModifiers()), is(true)); } @Test(expected = UnsupportedOperationException.class) public void testConstructorThrowsException() throws Exception { Constructor<?> constructor = Installer.class.getDeclaredConstructor(); constructor.setAccessible(true); try { constructor.newInstance(); fail(); } catch (InvocationTargetException exception) { throw (Exception) exception.getCause(); } } }