package com.ikokoon.serenity.instrumentation.coverage; import org.apache.log4j.Logger; import org.objectweb.asm.MethodAdapter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; import com.ikokoon.serenity.Collector; public class CoverageMethodAdapterChecker extends MethodAdapter { private Logger logger = Logger.getLogger(this.getClass()); private boolean isCovered = false; private Type stringType = Type.getType(String.class); private Type intType = Type.getType(int.class); private Type[] types = new Type[] { stringType, stringType, stringType, intType }; private String className = Type.getInternalName(Collector.class); private String methodName = "collectCoverage"; private String methodDescription = Type.getMethodDescriptor(Type.VOID_TYPE, types); public CoverageMethodAdapterChecker(MethodVisitor methodVisitor) { super(methodVisitor); } public void visitMethodInsn(int opcode, String owner, String name, String desc) { logger.debug("visitMethod:" + opcode + ", " + owner + ", " + name + ", " + desc); if (owner.equals(className) && name.equals(methodName) && desc.equals(methodDescription)) { isCovered = true; } super.visitMethodInsn(opcode, owner, name, desc); } public void visitEnd() { super.visitEnd(); if (!isCovered) { throw new RuntimeException("Class not covered : "); } } }