/* * Copyright 2012 Kantega AS * * Licensed 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.kantega.revoc.demo; import org.kantega.helloworld.HelloWorld; import org.kantega.revoc.analysis.OneLineAnalyze; import org.kantega.revoc.instrumentation.CoverageClassVisitor; import org.kantega.revoc.registry.CoverageData; import org.kantega.revoc.registry.Registry; import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.util.Map; import static org.junit.Assert.assertEquals; /** * */ public class SimpleCoverageVisitorTest { @Test public void shouldRegisterVisitedLine() throws IOException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException { final Class<HelloWorld> clazz = HelloWorld.class; InputStream inputStream = clazz.getResourceAsStream(clazz.getSimpleName() + ".class"); ClassReader cr = new ClassReader(inputStream); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); int classId = Registry.newClassId(clazz.getName().replace('.', '/'), clazz.getClassLoader()); CoverageClassVisitor visitor = new CoverageClassVisitor(cw, classId) { @Override protected MethodVisitor createSecondPassAnalyzer(int classId, Map<Integer, Integer> classLineNumbers, Map<Integer, Integer> methodLineNumbers, Map<Integer, Integer> branchPoints, int reportLoad, OneLineAnalyze oneTimeLines, MethodVisitor mv, int access, String name, String desc) { return new SimpleConverageVisitor(classId, classLineNumbers, mv); } }; cr.accept(visitor, ClassReader.EXPAND_FRAMES); Registry.registerClass(clazz.getClass().getName(), clazz.getClassLoader(), visitor.getSource()); Registry.registerLines(classId, visitor.getLineIndexes()); Registry.registerMethods(classId, visitor.getMethodNames(), visitor.getMethodDescs(), visitor.getMethodLineNumbers()); ClassUtils.invokeMainMethodUsingReflection("org.kantega.helloworld.HelloWorld", cw.toByteArray(), 3); // Then CoverageData data = Registry.getCoverageData(); assertEquals(-1, data.getLinesVisited(classId)[20]); assertEquals(3, data.getLinesVisited(classId)[24]); } }