// // Copyright (C) 2011 United States Government as represented by the // Administrator of the National Aeronautics and Space Administration // (NASA). All Rights Reserved. // // This software is distributed under the NASA Open Source Agreement // (NOSA), version 1.3. The NOSA has been approved by the Open Source // Initiative. See the file NOSA-1.3-JPF at the top of the distribution // directory tree for the complete NOSA document. // // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.test.mc.basic; import java.util.ArrayList; import org.junit.Test; import gov.nasa.jpf.ListenerAdapter; import gov.nasa.jpf.jvm.bytecode.LocalVariableInstruction; import gov.nasa.jpf.util.test.TestJPF; import gov.nasa.jpf.vm.Instruction; import gov.nasa.jpf.vm.LocalVarInfo; import gov.nasa.jpf.vm.MethodInfo; import gov.nasa.jpf.vm.ThreadInfo; import gov.nasa.jpf.vm.VM; /** * regression test for LocalVarInfo lookup */ public class LocalVarInfoTest extends TestJPF { public static class TestLookupListener extends ListenerAdapter{ MethodInfo logMethod = null; static ArrayList<String> log; public TestLookupListener(){ log = new ArrayList<String>(); } @Override public void methodEntered (VM vm, ThreadInfo ti, MethodInfo mi){ if (mi.getUniqueName().equals("testLookup()V")){ logMethod = mi; System.out.println("---- " + mi.getUniqueName() + " entered"); System.out.println(" LocalVarInfos (should have {'this', 'x', 'y'} : "); LocalVarInfo[] lvs = mi.getLocalVars(); for (LocalVarInfo lv : lvs){ System.out.println(" " + lv); } System.out.println(); assertTrue( lvs.length == 3); } } @Override public void methodExited (VM vm, ThreadInfo ti, MethodInfo mi){ if (mi == logMethod){ logMethod = null; } } @Override public void instructionExecuted(VM vm, ThreadInfo ti, Instruction nextInsn, Instruction executedInsn){ if (executedInsn.getMethodInfo() == logMethod){ System.out.printf(" %2d: %s", executedInsn.getPosition(), executedInsn); if (executedInsn instanceof LocalVariableInstruction){ LocalVariableInstruction lvinsn = (LocalVariableInstruction)executedInsn; LocalVarInfo lv = lvinsn.getLocalVarInfo(); System.out.print(" : " + lv); log.add( executedInsn.getClass().getSimpleName() + " " + lv.getName()); } System.out.println(); } } } static String[] expected = { "ALOAD this", "ISTORE x", "ILOAD x", "ISTORE y", "ILOAD y" }; @Test public void testLookup (){ if (verifyNoPropertyViolation("+listener=.test.mc.basic.LocalVarInfoTest$TestLookupListener")){ // DON'T CHANGE THIS CODE! // this should be a sequence of // aload this // .. // istore x // iload x // istore y // .. // iload y // .. int x = 42; int y = x; System.out.println(y); } if (!isJPFRun()){ checkLog(); } } private void checkLog(){ System.out.println("--- local var access log: "); int i = 0; assertTrue(TestLookupListener.log.size() == expected.length); for (String s : TestLookupListener.log) { System.out.println(s); assertTrue(s.equals(expected[i++])); } } }