package net.bytebuddy.dynamic.loading;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.test.utility.AgentAttachmentRule;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import net.bytebuddy.utility.RandomString;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import java.io.File;
import java.security.AccessControlContext;
import java.security.ProtectionDomain;
import java.util.Collections;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
public class ClassInjectorUsingInstrumentationTest {
private static final String FOO = "foo", BAR = "bar";
@Rule
public MethodRule agentAttachmentRule = new AgentAttachmentRule();
private File folder;
@Before
public void setUp() throws Exception {
File file = File.createTempFile(FOO, BAR);
assertThat(file.delete(), is(true));
folder = new File(file.getParentFile(), RandomString.make());
assertThat(folder.mkdir(), is(true));
}
@Test
@AgentAttachmentRule.Enforce
public void testBootstrapInjection() throws Exception {
ClassInjector classInjector = ClassInjector.UsingInstrumentation.of(folder,
ClassInjector.UsingInstrumentation.Target.BOOTSTRAP,
ByteBuddyAgent.install());
String name = FOO + RandomString.make();
DynamicType dynamicType = new ByteBuddy().subclass(Object.class).name(name).make();
Map<TypeDescription, Class<?>> types = classInjector.inject(Collections.singletonMap(dynamicType.getTypeDescription(), dynamicType.getBytes()));
assertThat(types.size(), is(1));
assertThat(types.get(dynamicType.getTypeDescription()).getName(), is(name));
assertThat(types.get(dynamicType.getTypeDescription()).getClassLoader(), nullValue(ClassLoader.class));
}
@Test
@AgentAttachmentRule.Enforce
public void testSystemInjection() throws Exception {
ClassInjector classInjector = ClassInjector.UsingInstrumentation.of(folder,
ClassInjector.UsingInstrumentation.Target.SYSTEM,
ByteBuddyAgent.install());
String name = BAR + RandomString.make();
DynamicType dynamicType = new ByteBuddy().subclass(Object.class).name(name).make();
Map<TypeDescription, Class<?>> types = classInjector.inject(Collections.singletonMap(dynamicType.getTypeDescription(), dynamicType.getBytes()));
assertThat(types.size(), is(1));
assertThat(types.get(dynamicType.getTypeDescription()).getName(), is(name));
assertThat(types.get(dynamicType.getTypeDescription()).getClassLoader(), is(ClassLoader.getSystemClassLoader()));
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(ClassInjector.UsingInstrumentation.class).create(new ObjectPropertyAssertion.Creator<AccessControlContext>() {
@Override
public AccessControlContext create() {
return new AccessControlContext(new ProtectionDomain[]{mock(ProtectionDomain.class)});
}
}).apply();
ObjectPropertyAssertion.of(ClassInjector.UsingInstrumentation.Target.class).apply();
}
}