package net.bytebuddy.dynamic.loading; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.test.utility.ClassFileExtraction; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import org.junit.Before; import org.junit.Test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.is; public class ClassInjectorUsingUnsafeTest { private ClassLoader classLoader; @Before public void setUp() throws Exception { classLoader = new URLClassLoader(new URL[0], ClassLoadingStrategy.BOOTSTRAP_LOADER); } @Test public void testUnsafeInjection() throws Exception { assertThat(new ClassInjector.UsingUnsafe(classLoader) .inject(Collections.singletonMap(new TypeDescription.ForLoadedType(Foo.class), ClassFileExtraction.extract(Foo.class))) .get(new TypeDescription.ForLoadedType(Foo.class)), notNullValue(Class.class)); assertThat(Class.forName(Foo.class.getName(), false, classLoader).getName(), is(Foo.class.getName())); } @Test public void testAvailability() throws Exception { assertThat(ClassInjector.UsingUnsafe.isAvailable(), is(true)); assertThat(new ClassInjector.UsingUnsafe.Dispatcher.Disabled(null).isAvailable(), is(false)); } @Test(expected = RuntimeException.class) public void testUnavailableThrowsException() throws Exception { new ClassInjector.UsingUnsafe.Dispatcher.Disabled(new RuntimeException()).initialize(); } @Test public void testHelperMethods() throws Exception { assertThat(ClassInjector.UsingUnsafe.ofBootstrapLoader(), is((ClassInjector) new ClassInjector.UsingUnsafe(ClassLoadingStrategy.BOOTSTRAP_LOADER))); assertThat(ClassInjector.UsingUnsafe.ofClassPath(), is((ClassInjector) new ClassInjector.UsingUnsafe(ClassLoader.getSystemClassLoader()))); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(ClassInjector.UsingUnsafe.class).apply(); ObjectPropertyAssertion.of(ClassInjector.UsingUnsafe.Dispatcher.CreationAction.class).apply(); final Iterator<Method> methods = Arrays.asList(String.class.getDeclaredMethods()).iterator(); final Iterator<Field> fields = Arrays.asList(String.class.getDeclaredFields()).iterator(); ObjectPropertyAssertion.of(ClassInjector.UsingUnsafe.Dispatcher.Enabled.class).create(new ObjectPropertyAssertion.Creator<Method>() { @Override public Method create() { return methods.next(); } }).create(new ObjectPropertyAssertion.Creator<Field>() { @Override public Field create() { return fields.next(); } }).apply(); ObjectPropertyAssertion.of(ClassInjector.UsingUnsafe.Dispatcher.Disabled.class).apply(); } private static class Foo { /* empty */ } }