public static void test(String className, String methodSignature, VMState initialState, VMState expectedState) { ExecutionGraph graph = execute(className, methodSignature, initialState); testState(graph, expectedState); }
@Test public void invokeReturnParameterReturnsParameter() 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, 0x5, "I"); expected.setRegisters(1, 0x5, "I", MethodState.ResultRegister, 0x5, "I"); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "invokeReturnParameter()V", initial); VMTester.testState(graph, expected); // Can't simply put instance in the expected state because mutable objects get cloned. // The object class at consensus would be different than the initial class. HeapItem consensus = graph.getTerminatingRegisterConsensus(0); assertEquals(CLASS_NAME, consensus.getType()); assertEquals(virtualClass.getName(), consensus.getValue().getClass().getName()); }
@Test public void canCreateLocalInstance() throws ClassNotFoundException { initial.setRegisters(0, 1, "I"); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "newLocalInstance()V", initial); VirtualType instanceType = vm.getClassManager().getVirtualType(CLASS_NAME); expected.setRegisters(0, new UninitializedInstance(instanceType), CLASS_NAME); VMTester.testState(graph, expected); }
@Test public void canConstClassLocal() throws ClassNotFoundException { VirtualMachine vm = VMTester.spawnVM(); Class<?> expectedClass = vm.getClassLoader().loadClass(ClassNameUtils.internalToBinary(CLASS_NAME)); expected.setRegisters(0, expectedClass, CommonTypes.CLASS); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "constClassLocal()V"); VMTester.testState(graph, expected); }
@Test public void canCreateNonLocalInstance() { initial.setRegisters(0, 1, "I"); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "newNonLocalInstance()V", initial); VirtualType instanceType = vm.getClassManager().getVirtualType("Ljava/lang/Integer;"); expected.setRegisters(0, new UninitializedInstance(instanceType), "Ljava/lang/Integer;"); VMTester.testState(graph, expected); }
@Test public void sometimesThrownExceptionExecutesExceptionalAndNormalExecutionPaths() { initial.setRegisters(0, new UnknownValue(), "I"); ExecutionGraph graph = VMTester.execute(CLASS_NAME, "invokeMethodWhichMayThrowNullPointerException()V", initial); int[] expectedAddresses = new int[] { 0, 3, 4, 5 }; VMTester.testVisitation(graph, expectedAddresses); String exceptionClass = "Ljava/lang/NullPointerException;"; // Unknown type for register 0 because could be I or exceptionClass expected.setRegisters(MethodState.ThrowRegister, new UnknownValue(), exceptionClass, 0, new UnknownValue(), "?"); VMTester.testState(graph, expected); } }
@Test public void canCallInitOfClassWithoutDefaultConstructorAndGetNewInstance() throws ClassNotFoundException { String instanceClassName = "Lclass_without_default_constructor;"; VirtualMachine vm = VMTester.spawnVM(false); VirtualClass instanceType = vm.getClassManager().getVirtualClass(instanceClassName); Class<?> virtualClass = vm.getClassLoader().loadClass(ClassNameUtils.internalToBinary(instanceClassName)); char[] initArg = new char[] { '4', '2' }; initial.setRegisters(0, new UninitializedInstance(instanceType), instanceClassName, 1, initArg, "[C"); expected.setRegisters(1, initArg, "[C"); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "callInitOfClassWithoutDefaultConstructor()V", initial); VMTester.testState(graph, expected); HeapItem consensus = graph.getTerminatingRegisterConsensus(0); assertEquals(instanceClassName, consensus.getType()); assertEquals(virtualClass.getName(), consensus.getValue().getClass().getName()); }
@Test public void canCallInitOfClassWithoutDefaultConstructorWhichChecksForNullArgumentAndGetNewInstance() throws ClassNotFoundException { String instanceClassName = "Lclass_without_default_constructor_checks_null;"; VirtualMachine vm = VMTester.spawnVM(false); VirtualClass instanceType = vm.getClassManager().getVirtualClass(instanceClassName); Class<?> virtualClass = vm.getClassLoader().loadClass(ClassNameUtils.internalToBinary(instanceClassName)); char[] initArg = new char[] { '4', '2' }; initial.setRegisters(0, new UninitializedInstance(instanceType), instanceClassName, 1, initArg, "[C"); expected.setRegisters(1, initArg, "[C"); ExecutionGraph graph = VMTester.execute(vm, CLASS_NAME, "callInitOfClassWithoutDefaultConstructorWhichChecksForNullArgument()V", initial); VMTester.testState(graph, expected); HeapItem consensus = graph.getTerminatingRegisterConsensus(0); assertEquals(instanceClassName, consensus.getType()); assertEquals(virtualClass.getName(), consensus.getValue().getClass().getName()); }