package net.bytebuddy.agent.builder;
import net.bytebuddy.test.utility.MockitoRule;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.mockito.Mock;
import java.lang.instrument.ClassFileTransformer;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
public class LambdaFactoryTest {
private static final String FOO = "foo";
private static final byte[] BAR = new byte[]{1, 2, 3};
@Rule
public TestRule mockitoRule = new MockitoRule(this);
@Mock
private Object a1, a3, a4, a5, a6;
@Mock
private List<?> a8, a9;
@Mock
private ClassFileTransformer classFileTransformer, otherTransformer;
@Test
public void testValidFactory() throws Exception {
PseudoFactory pseudoFactory = new PseudoFactory();
assertThat(LambdaFactory.register(classFileTransformer, pseudoFactory), is(true));
try {
assertThat(LambdaFactory.class
.getMethod("make", Object.class, String.class, Object.class, Object.class, Object.class, Object.class, boolean.class, List.class, List.class)
.invoke(null, a1, FOO, a3, a4, a5, a6, true, a8, a9), is((Object) BAR));
assertThat(pseudoFactory.args[0], is(a1));
assertThat(pseudoFactory.args[1], is((Object) FOO));
assertThat(pseudoFactory.args[2], is(a3));
assertThat(pseudoFactory.args[3], is(a4));
assertThat(pseudoFactory.args[4], is(a5));
assertThat(pseudoFactory.args[5], is(a6));
assertThat(pseudoFactory.args[6], is((Object) true));
assertThat(pseudoFactory.args[7], is((Object) a8));
assertThat(pseudoFactory.args[8], is((Object) a9));
assertThat(pseudoFactory.args[9], is((Object) Collections.singleton(classFileTransformer)));
} finally {
assertThat(LambdaFactory.release(classFileTransformer), is(true));
}
}
@Test
public void testUnknownTransformer() throws Exception {
assertThat(LambdaFactory.release(classFileTransformer), is(false));
}
@Test
public void testPreviousTransformer() throws Exception {
PseudoFactory pseudoFactory = new PseudoFactory();
try {
assertThat(LambdaFactory.register(classFileTransformer, pseudoFactory), is(true));
assertThat(LambdaFactory.register(otherTransformer, pseudoFactory), is(false));
} finally {
assertThat(LambdaFactory.release(classFileTransformer), is(false));
assertThat(LambdaFactory.release(otherTransformer), is(true));
}
}
@Test(expected = IllegalStateException.class)
public void testIllegalTransformer() throws Exception {
LambdaFactory.register(classFileTransformer, new Object());
}
@Test
public void testTypeAndMethodArePublic() throws Exception {
assertThat(Modifier.isPublic(LambdaFactory.class.getModifiers()), is(true));
assertThat(Modifier.isPublic(LambdaFactory.class.getDeclaredMethod("make",
Object.class,
String.class,
Object.class,
Object.class,
Object.class,
Object.class,
boolean.class,
List.class,
List.class).getModifiers()), is(true));
assertThat(Modifier.isStatic(LambdaFactory.class.getDeclaredMethod("make",
Object.class,
String.class,
Object.class,
Object.class,
Object.class,
Object.class,
boolean.class,
List.class,
List.class).getModifiers()), is(true));
}
@Test
public void testObjectProperties() throws Exception {
final Iterator<Method> methods = Arrays.asList(Object.class.getDeclaredMethods()).iterator();
ObjectPropertyAssertion.of(LambdaFactory.class).create(new ObjectPropertyAssertion.Creator<Method>() {
@Override
public Method create() {
return methods.next();
}
}).apply();
}
public static class PseudoFactory {
private Object[] args;
public byte[] make(Object a1, String a2, Object a3, Object a4, Object a5, Object a6, boolean a7, List<?> a8, List<?> a9, Collection<?> a10) {
args = new Object[]{a1, a2, a3, a4, a5, a6, a7, a8, a9, a10};
return BAR;
}
}
}