blob: 914d1f7ded1097a693ae1aa51de3e1c8cbc47acc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tomee.patch.core;
import org.junit.Ignore;
import org.junit.Test;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.tomitribe.jkta.usage.BytecodeUsage;
import org.tomitribe.jkta.usage.Jar;
import org.tomitribe.jkta.usage.MethodScanner;
import org.tomitribe.jkta.usage.Package;
import org.tomitribe.jkta.usage.Usage;
import javax.ejb.EnterpriseBean;
import javax.ejb.Process;
import javax.ejb.Schedule;
import javax.ejb.ScheduleExpression;
import javax.ejb.SessionBean;
import javax.enterprise.context.MockScoped;
import javax.jms.EnterpriseBeanConsumer;
import javax.persistence.EntityBean;
import javax.persistence.Persist;
import javax.persistence.PersistenceException;
import javax.servlet.http.HttpServlet;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Cookie;
import java.util.ArrayList;
import java.util.List;
import static org.apache.tomee.patch.core.Scan.assertUsage;
import static org.apache.tomee.patch.core.Transform.usage;
public class MethodTransformerTest {
// ------------------------------------------------------
@Test
public void visitAnnotation() {
final Usage<Jar> usage = usage(new Object() {
@Schedule
public void get() {
}
});
assertUsage(usage, Package.JAVAX_EJB);
}
// ------------------------------------------------------
@Test
public void visitAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)})
public void get() {
}
});
assertUsage(usage, Package.JAVAX_SERVLET, Package.JAVAX_WS_RS);
}
// ------------------------------------------------------
@Test
public void visitTypeAnnotation() {
final Usage<Jar> usage = usage(new Object() {
public <@MockScoped V> V get() {
return null;
}
});
assertUsage(usage, Package.JAVAX_ENTERPRISE);
}
// ------------------------------------------------------
@Test
public void visitTypeAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
public <@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)}) V> V get() {
return null;
}
});
assertUsage(usage, Package.JAVAX_SERVLET, Package.JAVAX_WS_RS);
}
// ------------------------------------------------------
@Test
public void visitParameterAnnotation() {
final Usage<Jar> usage = usage(new Object() {
public void m(@PathParam("id") int id) {
}
});
assertUsage(usage, Package.JAVAX_WS_RS);
}
// ------------------------------------------------------
@Ignore
@Test
public void visitParameterAnnotation_Deep_PotentialAsmBug() {
final Usage<Jar> usage = usage(new Object() {
public void m(@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)}) int id) {
}
});
assertUsage(usage, Package.JAVAX_WS_RS, Package.JAVAX_SERVLET);
}
// ------------------------------------------------------
@Test
public void visitParameterAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
public void m(@Data(type = HttpServlet.class) int id) {
}
});
assertUsage(usage, Package.JAVAX_SERVLET);
}
// ------------------------------------------------------
@Test
public void visitFrame() {
final Usage<Jar> usage = usage(new Object() {
public void m(Object o) {
EnterpriseBean bean = (SessionBean) o;
try {
m(bean);
} catch (Exception e) {
e.printStackTrace();
}
}
});
assertUsage(usage, Package.JAVAX_EJB, Package.JAVAX_EJB);
}
// ------------------------------------------------------
@Test
public void visitTypeInsn() {
final Usage<Jar> usage = usage(new Object() {
public void m(Object o) {
final Object bean = (SessionBean) o;
System.out.println(bean);
}
});
assertUsage(usage, Package.JAVAX_EJB);
}
// ------------------------------------------------------
@Test
public void visitFieldInsn() {
final Usage<Jar> usage = usage(new Object() {
final SessionBean bean = null;
});
assertUsage(usage, Package.JAVAX_EJB, Package.JAVAX_EJB);
}
// ------------------------------------------------------
@Test
public void visitMethodInsn() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
new ScheduleExpression();
}
});
assertUsage(usage, Package.JAVAX_EJB, Package.JAVAX_EJB);
}
// ------------------------------------------------------
@Test
public void visitMethodInsn_Descriptor() {
final Usage<Jar> usage = usage(new Object() {
public void m(final EnterpriseBeanConsumer consumer, final EntityBean bean) {
consumer.accept(bean);
}
});
assertUsage(usage, Package.JAVAX_JMS, Package.JAVAX_JMS, Package.JAVAX_EJB, Package.JAVAX_PERSISTENCE);
}
// ------------------------------------------------------
@Test
public void visitInvokeDynamicInsn_Direct() {
final Usage usage = new Usage();
final MethodScanner methodScanner = new MethodScanner(Opcodes.ASM8, new BytecodeUsage(usage, Opcodes.ASM8));
methodScanner.visitInvokeDynamicInsn(
"accept",
"(Ljavax/ejb/Process;)Ljavax/jms/Consumer;",
new Handle(Opcodes.H_INVOKESTATIC,
"java/lang/invoke/LambdaMetafactory",
"metafactory",
"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;",
false),
new Object[]{
Type.getType("(Ljava/lang/Object;)V"),
new Handle(Opcodes.H_INVOKEVIRTUAL,
"javax/ejb/Process",
"process",
"(Ljavax/ejb/EnterpriseBean;)V",
false),
Type.getType("(Ljavax/ejb/EnterpriseBean;)V")
}
);
assertUsage(usage,
Package.JAVAX_EJB,
Package.JAVAX_EJB,
Package.JAVAX_EJB,
Package.JAVAX_EJB,
Package.JAVAX_JMS
);
}
@Test
public void visitInvokeDynamicInsn() {
final Usage<Jar> usage = usage(new Object() {
public void invokedynamic(Persist<EnterpriseBean> persist, Process process) {
persist.forEach(process::process);
}
});
assertUsage(usage,
Package.JAVAX_PERSISTENCE, // visitMethod
Package.JAVAX_EJB, // visitMethod
Package.JAVAX_EJB, // visitMethod
Package.JAVAX_EJB, // visitInvokeDynamicInsn
Package.JAVAX_EJB, // visitInvokeDynamicInsn
Package.JAVAX_EJB, // visitInvokeDynamicInsn
Package.JAVAX_EJB, // visitInvokeDynamicInsn
Package.JAVAX_JMS, // visitInvokeDynamicInsn
Package.JAVAX_PERSISTENCE, // visitMethodInsn
Package.JAVAX_JMS // visitMethodInsn
);
}
// ------------------------------------------------------
@Test
public void visitLdcInsn_Type() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
System.out.println(GET.class);
}
});
assertUsage(usage,
Package.JAVAX_WS_RS
);
}
// ------------------------------------------------------
/**
* TODO This is a stub. Real test needed.
*/
@Ignore("https://github.com/tomitribe/jkta/issues/2")
@Test
public void visitLdcInsn_Handle() {
}
// ------------------------------------------------------
/**
* TODO This is a stub. Real test needed.
*/
@Ignore("https://github.com/tomitribe/jkta/issues/3")
@Test
public void visitLdcInsn_ConstantDynamic() {
}
// ------------------------------------------------------
@Test
public void visitMultiANewArrayInsn() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
final Cookie[][][] cookies = new Cookie[4][8][16];
}
});
assertUsage(usage,
Package.JAVAX_WS_RS
);
}
// ------------------------------------------------------
@Test
public void visitInsnAnnotation() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
final List list = (@MockScoped ArrayList) null;
}
});
assertUsage(usage,
Package.JAVAX_ENTERPRISE
);
}
// ------------------------------------------------------
@Test
public void visitInsnAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
final List list = (@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)}) ArrayList) null;
}
});
assertUsage(usage,
Package.JAVAX_SERVLET,
Package.JAVAX_WS_RS
);
}
// ------------------------------------------------------
@Test
public void visitTryCatchBlock() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
try {
System.out.println();
} catch (PersistenceException e) {
System.out.println();
}
}
});
assertUsage(usage,
Package.JAVAX_PERSISTENCE, // visitTryCatchBlock
Package.JAVAX_PERSISTENCE // visitFrame
);
}
// ------------------------------------------------------
@Test
public void visitTryCatchAnnotation() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
try {
System.out.println();
} catch (@MockScoped PersistenceException e) {
System.out.println();
}
}
});
assertUsage(usage,
Package.JAVAX_ENTERPRISE, // visitTryCatchBlock
Package.JAVAX_PERSISTENCE, // visitTryCatchBlock
Package.JAVAX_PERSISTENCE // visitFrame
);
}
// ------------------------------------------------------
@Test
public void visitTryCatchAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
try {
System.out.println();
} catch (@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)}) PersistenceException e) {
System.out.println();
}
}
});
assertUsage(usage,
Package.JAVAX_SERVLET,
Package.JAVAX_WS_RS,
Package.JAVAX_PERSISTENCE,
Package.JAVAX_PERSISTENCE
);
}
// ------------------------------------------------------
@Test
public void visitLocalVariableAnnotation() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
@MockScoped long e = System.nanoTime();
}
});
assertUsage(usage,
Package.JAVAX_ENTERPRISE
);
}
// ------------------------------------------------------
@Test
public void visitLocalVariableAnnotation_Deep() {
final Usage<Jar> usage = usage(new Object() {
public void m() {
@ArrayData(data = {@Data(path = @Path("/foo")), @Data(type = HttpServlet.class)}) long e = System.nanoTime();
}
});
assertUsage(usage,
Package.JAVAX_SERVLET,
Package.JAVAX_WS_RS
);
}
}