Package kilim.test

Source Code of kilim.test.Base

/* Copyright (c) 2006, Sriram Srinivasan
*
* You may distribute this software under the terms of the license
* specified in the file "License"
*/

package kilim.test;

import java.util.ArrayList;

import junit.framework.TestCase;
import kilim.analysis.BasicBlock;
import kilim.analysis.ClassFlow;
import kilim.analysis.MethodFlow;
import kilim.mirrors.Detector;

import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;

public class Base extends TestCase {
    private static ArrayList<MethodFlow> stflows;
    private static String                lastClassName = null;

    protected void cache(String className) throws Exception {
        if (lastClassName != className) {
            ClassFlow cf = new ClassFlow(className, Detector.DEFAULT);
            stflows = cf.analyze(/* forceAnalysis = */true);
            lastClassName = className;
        }
    }

    protected MethodFlow getFlow(String methodName) {
        for (int i = 0; i < stflows.size(); i++) {
            MethodFlow flow = stflows.get(i);
            if (flow.name.equals(methodName)) {
                return flow;
            }
        }
        fail("No method called " + methodName);
        return null;
    }

    /**
     * Returns the first basic block in the flow that has a method invocation of
     * <methodName>
     */
    protected BasicBlock getBBForMethod(MethodFlow flow, String methodName) {
        for (BasicBlock bb : flow.getBasicBlocks()) {
            AbstractInsnNode ainode = bb.getInstruction(bb.startPos);
            if (ainode instanceof MethodInsnNode
                    && ((MethodInsnNode) ainode).name.equals(methodName)) {
                return bb;
            }
        }
        fail("No method invocation found for " + methodName);
        return null;
    }

    protected ArrayList<MethodFlow> getFlows() {
        return stflows;
    }

    protected void checkCov(String methodName) {
        MethodFlow flow = getFlow(methodName);
        if (flow == null)
            return;
        ArrayList<BasicBlock> bbs = flow.getBasicBlocks();
        // Verify that all instructions are covered and that the only ones that
        // aren't are labelnodes. Also verify that there are no overlaps.
        int size = flow.instructions.size();
        boolean coverage[] = new boolean[size];
        for (int i = 0; i < size; i++) {
            coverage[i] = false;
        }
        for (BasicBlock bb : bbs) {
            /*
             * if (bb.startFrame == null) { fail("BB doesn't have a starting
             * frame"); return; }
             */
            int end = bb.endPos;
            for (int i = bb.startPos; i <= end; i++) {
                if (coverage[i]) {
                    fail("BasicBlock overlap");
                    return;
                }
                coverage[i] = true;
            }
        }
        for (int i = 0; i < size; i++) {
            if (!coverage[i]) {
                fail("Instruction " + i + " not covered");
                return;
            }
        }
    }

}
TOP

Related Classes of kilim.test.Base

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.