package net.bytebuddy.dynamic.scaffold.inline; import net.bytebuddy.ClassFileVersion; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodList; import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.method.ParameterList; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.auxiliary.AuxiliaryType; import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.test.utility.MockitoRule; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.mockito.Mock; import org.objectweb.asm.Opcodes; import java.util.Collections; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.when; public class MethodRebaseResolverDefaultTest { private static final String FOO = "foo", BAR = "bar", QUX = "qux"; @Rule public TestRule mockitoRule = new MockitoRule(this); @Mock private MethodDescription.InDefinedShape methodDescription, otherMethod; @Mock private MethodDescription.Token token, otherToken; @Mock private MethodDescription.SignatureToken signatureToken; @Mock private MethodRebaseResolver.Resolution resolution; @Mock private DynamicType dynamicType; @Mock private TypeDescription instrumentedType; @Mock private ClassFileVersion classFileVersion; @Mock private AuxiliaryType.NamingStrategy auxiliaryTypeNamingStrategy; @Mock private MethodNameTransformer methodNameTransformer; @Before public void setUp() throws Exception { when(methodDescription.asDefined()).thenReturn(methodDescription); when(methodDescription.getParameters()).thenReturn(new ParameterList.Empty<ParameterDescription.InDefinedShape>()); when(methodDescription.getReturnType()).thenReturn(TypeDescription.Generic.VOID); when(methodDescription.getInternalName()).thenReturn(FOO); when(methodDescription.asToken(ElementMatchers.is(instrumentedType))).thenReturn(token); when(methodDescription.asSignatureToken()).thenReturn(signatureToken); when(instrumentedType.getDeclaredMethods()).thenReturn(new MethodList.Explicit<MethodDescription.InDefinedShape>(methodDescription)); when(otherMethod.asToken(ElementMatchers.is(instrumentedType))).thenReturn(otherToken); when(methodNameTransformer.transform(methodDescription)).thenReturn(BAR); when(auxiliaryTypeNamingStrategy.name(instrumentedType)).thenReturn(QUX); when(classFileVersion.getMinorMajorVersion()).thenReturn(Opcodes.V1_6); } @Test public void testResolutionLookup() throws Exception { MethodRebaseResolver methodRebaseResolver = new MethodRebaseResolver.Default(Collections.singletonMap(methodDescription, resolution), Collections.singletonList(dynamicType)); assertThat(methodRebaseResolver.resolve(methodDescription), is(resolution)); assertThat(methodRebaseResolver.resolve(otherMethod).isRebased(), is(false)); assertThat(methodRebaseResolver.resolve(otherMethod).getResolvedMethod(), is(otherMethod)); } @Test public void testAuxiliaryTypes() throws Exception { MethodRebaseResolver methodRebaseResolver = new MethodRebaseResolver.Default(Collections.singletonMap(methodDescription, resolution), Collections.singletonList(dynamicType)); assertThat(methodRebaseResolver.getAuxiliaryTypes().size(), is(1)); assertThat(methodRebaseResolver.getAuxiliaryTypes().contains(dynamicType), is(true)); } @Test public void testTokenMap() throws Exception { MethodRebaseResolver methodRebaseResolver = new MethodRebaseResolver.Default(Collections.singletonMap(methodDescription, resolution), Collections.singletonList(dynamicType)); assertThat(methodRebaseResolver.asTokenMap().size(), is(1)); assertThat(methodRebaseResolver.asTokenMap().get(signatureToken), is(resolution)); } @Test public void testCreationWithoutConstructor() throws Exception { MethodRebaseResolver methodRebaseResolver = MethodRebaseResolver.Default.make(instrumentedType, Collections.singleton(token), classFileVersion, auxiliaryTypeNamingStrategy, methodNameTransformer); assertThat(methodRebaseResolver.getAuxiliaryTypes().size(), is(0)); MethodRebaseResolver.Resolution resolution = methodRebaseResolver.resolve(methodDescription); assertThat(resolution.isRebased(), is(true)); assertThat(resolution.getResolvedMethod(), not(methodDescription)); assertThat(resolution.getResolvedMethod().isConstructor(), is(false)); } @Test public void testCreationWithConstructor() throws Exception { when(methodDescription.isConstructor()).thenReturn(true); MethodRebaseResolver methodRebaseResolver = MethodRebaseResolver.Default.make(instrumentedType, Collections.singleton(token), classFileVersion, auxiliaryTypeNamingStrategy, methodNameTransformer); assertThat(methodRebaseResolver.getAuxiliaryTypes().size(), is(1)); assertThat(methodRebaseResolver.getAuxiliaryTypes().get(0).getTypeDescription().getName(), is(QUX)); MethodRebaseResolver.Resolution resolution = methodRebaseResolver.resolve(methodDescription); assertThat(resolution.isRebased(), is(true)); assertThat(resolution.getResolvedMethod(), not(methodDescription)); assertThat(resolution.getResolvedMethod().isConstructor(), is(true)); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(MethodRebaseResolver.Default.class).apply(); } }