/** * Create a new {@link VirtualMachine} for testing. Since this is heavily used, it tries to avoid the main cost of creating a {@link * VirtualMachine} by reusing the same {@link ClassManager}. * * @return {@link VirtualMachine} for tests */ public static VirtualMachine spawnVM() { return spawnVM(false); }
private static void spawnVM() { if (vm == null) { // Confession: no idea why but if we don't tell classmanager to perform an expensive recache of classes, // it doesn't think the dummy class exists. vm = VMTester.spawnVM(true); } }
public static ExecutionGraphManipulator getGraphManipulator(String className, String methodDescriptor, VMState initial) { // Force reloading of classes since implementations in class definitions may have changed VirtualMachine vm = VMTester.spawnVM(true); return getGraphManipulator(vm, className, methodDescriptor, initial); }
@Before public void setUp() { vm = VMTester.spawnVM(true); }
@Before public void setupVM() { vm = VMTester.spawnVM(true); }
@Test public void canCallHashCodeOfDynamicallyGeneratedClass() throws VirtualMachineException { String className = "Lhash_code;"; String methodName = "createInstance()V"; VirtualMachine vm = VMTester.spawnVM(); vm.execute(className, methodName); } }
private static Class<?> getTestClass() { try { String binaryName = ClassNameUtils.internalToBinary(CLASS_NAME); return VMTester.spawnVM().getClassLoader().loadClass(binaryName); } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } }
@Before public void setUp() { vm = VMTester.spawnVM(true); thisReference = vm.getClassManager().getVirtualClass(CLASS_NAME); }
@Before public void setUp() { vm = VMTester.spawnVM(); virtualClass = vm.getClassManager().getVirtualClass(CLASS_NAME); initial = new VMState(); }
@Test public void invokeVirtualManyParametersThrowsNoExceptions() throws InstantiationException, IllegalAccessException, ClassNotFoundException { VirtualMachine vm = VMTester.spawnVM(); Class<?> virtualClass = vm.getClassLoader().loadClass(CLASS_NAME_BINARY); Object instance = virtualClass.newInstance(); initial.setRegisters(0, instance, CLASS_NAME, 1, 0x100L, "J", 3, 0x200L, "J", 5, 0x300L, "J", 7, 0x3, "I"); expected.setRegisters(MethodState.ResultRegister, 0x3, "I"); VMTester.test(CLASS_NAME, "invokeRangeManyParameters()V", initial, expected); }
@Test public void invokeReturnIntReturnsInt() throws ClassNotFoundException, IllegalAccessException, InstantiationException { VirtualMachine vm = VMTester.spawnVM(); Class<?> virtualClass = vm.getClassLoader().loadClass(CLASS_NAME_BINARY); Object instance = virtualClass.newInstance(); initial.setRegisters(0, instance, CLASS_NAME); expected.setRegisters(MethodState.ResultRegister, 0x7, "I"); VMTester.test(CLASS_NAME, "invokeReturnInt()V", initial, expected); }
@Test public void invokeGetClassOnSelfReturnsCorrectClass() throws InstantiationException, IllegalAccessException, ClassNotFoundException { VirtualMachine vm = VMTester.spawnVM(); Class<?> virtualClass = vm.getClassLoader().loadClass(CLASS_NAME_BINARY); Object instance = virtualClass.newInstance(); initial.setRegisters(0, instance, CLASS_NAME); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "invokeGetClassOnThis()V", initial); HeapItem consensus = graph.getTerminatingRegisterConsensus(MethodState.ResultRegister); assertEquals(instance.getClass(), consensus.getValue()); } }
@Before public void setupVM() { /* * On TravisCI, these tests fail with StackOverflowError and missing classes unless classes are reloaded. Local test classes are actually * completely missing for no obvious reason. */ vm = VMTester.spawnVM(true); ClassManager classManager = vm.getClassManager(); childClass = classManager.getVirtualClass("Lchild_class;"); parentClass = classManager.getVirtualClass("Lparent_class;"); grandparentClass = classManager.getVirtualClass("Lgrandparent_class;"); }
@Test public void invokeReturnVoidReturnsVoid() throws InstantiationException, IllegalAccessException, ClassNotFoundException { VirtualMachine vm = VMTester.spawnVM(true); Class<?> virtualClass = vm.getClassLoader().loadClass(CLASS_NAME_BINARY); Object instance = virtualClass.newInstance(); initial.setRegisters(0, instance, CLASS_NAME); ExecutionGraph graph = VMTester.execute(CLASS_NAME, "invokeReturnVoid()V", initial); HeapItem consensus = graph.getTerminatingRegisterConsensus(MethodState.ResultRegister); assertNull(consensus); }
@Test public void monitorEnterHasExpectedTostring() { String methodDescriptor = "monitorEnter()V"; VirtualMachine vm = VMTester.spawnVM(); ExecutionGraph graph = vm.spawnInstructionGraph(CLASS_NAME, methodDescriptor); ExecutionNode node = graph.getTemplateNode(1); assertEquals("monitor-enter r0", node.getOp().toString()); } }
@Test public void monitorEnterHasExpectedTostring() { String methodDescriptor = "monitorExit()V"; VirtualMachine vm = VMTester.spawnVM(); ExecutionGraph graph = vm.spawnInstructionGraph(CLASS_NAME, methodDescriptor); ExecutionNode node = graph.getTemplateNode(1); assertEquals("monitor-exit r0", node.getOp().toString()); } }
@Test public void hasExpectedToString() { VirtualMachine vm = VMTester.spawnVM(); VirtualClass virtualClass = vm.getClassManager().getVirtualClass(CLASS_NAME); VirtualMethod method = virtualClass.getMethod("invokeReturnVoid()V"); ExecutionGraph graph = vm.spawnInstructionGraph(method); Op op = graph.getOp(0); assertEquals("invoke-static {}, " + CLASS_NAME + "->returnVoid()V", op.toString()); } }
@Test public void enumClassInitializationCreatesCorrectClass() { VirtualMachine vm = VMTester.spawnVM(); VirtualType type = vm.getClassManager().getVirtualType("Lextends_enum;"); initial.setRegisters(0, new UninitializedInstance(type), "Lextends_enum;", 1, "NONE", "Ljava/lang/String;", 2, 0, "I", 3, 0, "I"); ExecutionGraph graph = VMTester.execute("Lextends_enum;", "<init>(Ljava/lang/String;II)V", initial); HeapItem consensus = graph.getTerminatingRegisterConsensus(0); assertEquals("Lextends_enum;", consensus.getType()); } }
@Test public void objectClassInitializationCreatesCorrectClass() { VirtualMachine vm = VMTester.spawnVM(); VirtualType type = vm.getClassManager().getVirtualType("Lhash_code;"); initial.setRegisters(0, new UninitializedInstance(type), "Lhash_code;"); ExecutionGraph graph = VMTester.execute("Lhash_code;", "<init>()V"); HeapItem consensus = graph.getTerminatingRegisterConsensus(0); assertEquals("Lhash_code;", consensus.getType()); }
@Test public void initStringWithByteArrayWithUnknownParameter() { VirtualMachine vm = VMTester.spawnVM(true); VirtualClass instanceType = vm.getClassManager().getVirtualClass("Ljava/lang/String;"); initial.setRegisters(0, new UninitializedInstance(instanceType), "Ljava/lang/String;", 1, new UnknownValue(), "[B"); expected.setRegisters(0, new UnknownValue(), "Ljava/lang/String;", 1, new UnknownValue(), "[B"); VMTester.test(CLASS_NAME, "initStringWithByteArray()V", initial, expected); }