package org.hotswap.agent.util.signature;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.javassist.CtClass;
import org.hotswap.agent.javassist.NotFoundException;
import org.junit.Test;
public class SignatureTest {
private static ClassSignatureElement SIGNATURE_ELEMENTS[] = {
ClassSignatureElement.SUPER_CLASS,
ClassSignatureElement.INTERFACES,
ClassSignatureElement.CLASS_ANNOTATION,
ClassSignatureElement.CONSTRUCTOR,
ClassSignatureElement.CONSTRUCTOR_PRIVATE,
ClassSignatureElement.METHOD,
ClassSignatureElement.METHOD_PRIVATE,
ClassSignatureElement.METHOD_STATIC,
ClassSignatureElement.METHOD_ANNOTATION,
ClassSignatureElement.METHOD_PARAM_ANNOTATION,
ClassSignatureElement.METHOD_EXCEPTION,
ClassSignatureElement.FIELD,
ClassSignatureElement.FIELD_STATIC,
ClassSignatureElement.FIELD_ANNOTATION
};
public enum SigTestEnum {
NEW, FINISHED, WAITING
}
@Target({ ElementType.PARAMETER, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Asd {
SigTestEnum value() default SigTestEnum.FINISHED;
SigTestEnum value2() default SigTestEnum.FINISHED;
// TransformationState value3();
}
@Target({ ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Bcd {
}
@Asd(value2 = SigTestEnum.FINISHED)
@Bcd
public static class A {
static {
}
{
}
}
@Asd(value = SigTestEnum.WAITING)
public static class OneMethod {
@Asd(value = SigTestEnum.WAITING)
int aField;
@Asd(value = SigTestEnum.WAITING)
public int get9(@Asd(value = SigTestEnum.NEW) @Bcd Object o,@Asd(value = SigTestEnum.NEW) @Bcd Object o2 ) throws IOException {
return 0;
}
}
public static abstract class B implements TestSignatures {
public abstract int get8();
public int get9() {
return 0;
}
}
public static class C extends B {
@Override
public int get9() {
return 0;
}
@Override
public int get3() {
return 0;
}
@Override
public int get2() {
return 0;
}
@Override
public int get1() {
return 0;
}
@Override
public int getA() {
return 0;
}
@Override
public int getB() {
return 0;
}
@Override
public int[] getBArray() {
return null;
}
@Override
public Object[] getBObjectArray() {
return null;
}
@Override
public Object getBObject() {
return null;
}
@Override
public int get3(int[] a) {
return 0;
}
@Override
public int get2(int[] a, int[] b) {
return 0;
}
@Override
public int get1(int[]... b) {
return 0;
}
@Override
public int getA(Object o) {
return 0;
}
@Override
public int getB(Object... o) {
return 0;
}
@Override
public int get3(Object[] a) {
return 0;
}
@Override
public int get2(Object[] a, Object[] b) {
return 0;
}
@Override
public int getA(Object[] a, Object[]... b) {
return 0;
}
@Override
public int getB(Object[]... o) {
return 0;
}
@Override
public int get8() {
return 0;
}
public int get123() throws IOException, NotFoundException {
return 0;
}
}
public interface TestSignatures {
// test ordering
public int get3();
public int get2();
public int get1();
public int getA();
public int getB();
// test return types
public int[] getBArray();
public Object[] getBObjectArray();
public Object getBObject();
// test parameters
public int get3(int[] a);
public int get2(int[] a, int[] b);
public int get1(int[]... b);
public int getA(Object o);
public int getB(Object... o);
public int get3(Object[] a);
public int get2(@Asd Object[] a, @Asd Object[] b);
public int getA(Object[] a, Object[]... b);
public int getB(Object[]... o);
}
@Test
public void testInterfaceSignature() throws Exception {
CtClass makeClass = ClassPool.getDefault().get(TestSignatures.class.getName());
String expected = ClassSignatureComparerHelper.getJavaClassSignature(TestSignatures.class, SIGNATURE_ELEMENTS);
String actual = ClassSignatureComparerHelper.getCtClassSignature(makeClass, SIGNATURE_ELEMENTS);
assertEquals("Signatures not equal", expected, actual);
}
@Test
public void testClassSignature() throws Exception {
{
CtClass makeClass = ClassPool.getDefault().get(A.class.getName());
String expected = ClassSignatureComparerHelper.getJavaClassSignature(A.class, SIGNATURE_ELEMENTS);
String actual = ClassSignatureComparerHelper.getCtClassSignature(makeClass, SIGNATURE_ELEMENTS);
assertEquals("Signatures not equal", expected, actual);
}
{
CtClass makeClass = ClassPool.getDefault().get(C.class.getName());
String expected = ClassSignatureComparerHelper.getJavaClassSignature(C.class, SIGNATURE_ELEMENTS);
String actual = ClassSignatureComparerHelper.getCtClassSignature(makeClass, SIGNATURE_ELEMENTS);
assertEquals("Signatures not equal", expected, actual);
}
}
@Test
public void testAbstractClassSignature() throws Exception {
CtClass makeClass = ClassPool.getDefault().get(B.class.getName());
String expected = ClassSignatureComparerHelper.getJavaClassSignature(B.class, SIGNATURE_ELEMENTS);
String actual = ClassSignatureComparerHelper.getCtClassSignature(makeClass, SIGNATURE_ELEMENTS);
assertEquals("Signatures not equal", expected, actual);
}
@Test
public void testOne() throws Exception {
CtClass makeClass = ClassPool.getDefault().get(OneMethod.class.getName());
String expected = ClassSignatureComparerHelper.getJavaClassSignature(OneMethod.class, SIGNATURE_ELEMENTS);
String actual = ClassSignatureComparerHelper.getCtClassSignature(makeClass, SIGNATURE_ELEMENTS);
assertEquals("Signatures not equal", expected, actual);
}
}