/* * Copyright (C) 2016 The Android Open Source Project * * 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 dalvik.system; import junit.framework.TestCase; import java.lang.invoke.MethodType; public class EmulatedStackFrameTest extends TestCase { public void testReaderWriter_allParamTypes() { EmulatedStackFrame stackFrame = EmulatedStackFrame.create(MethodType.methodType( void.class, new Class[] { boolean.class, char.class, short.class, int.class, long.class, float.class, double.class, String.class })); EmulatedStackFrame.StackFrameWriter writer = new EmulatedStackFrame.StackFrameWriter(); writer.attach(stackFrame); writer.putNextBoolean(true); writer.putNextChar('a'); writer.putNextShort((short) 42); writer.putNextInt(43); writer.putNextLong(56); writer.putNextFloat(42.0f); writer.putNextDouble(52.0); writer.putNextReference("foo", String.class); EmulatedStackFrame.StackFrameReader reader = new EmulatedStackFrame.StackFrameReader(); reader.attach(stackFrame); assertTrue(reader.nextBoolean()); assertEquals('a', reader.nextChar()); assertEquals((short) 42, reader.nextShort()); assertEquals(43, reader.nextInt()); assertEquals(56, reader.nextLong()); assertEquals(42.0f, reader.nextFloat()); assertEquals(52.0, reader.nextDouble()); assertEquals("foo", reader.nextReference(String.class)); } public void testReaderWriter_allReturnTypes() { EmulatedStackFrame stackFrame = EmulatedStackFrame.create( MethodType.methodType(boolean.class)); EmulatedStackFrame.StackFrameWriter writer = new EmulatedStackFrame.StackFrameWriter(); writer.attach(stackFrame).makeReturnValueAccessor(); EmulatedStackFrame.StackFrameReader reader = new EmulatedStackFrame.StackFrameReader(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextBoolean(true); assertTrue(reader.nextBoolean()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(char.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextChar('a'); assertEquals('a', reader.nextChar()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(short.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextShort((short) 52); assertEquals((short) 52, reader.nextShort()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(int.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextInt(64); assertEquals(64, reader.nextInt()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(long.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextLong(72); assertEquals(72, reader.nextLong()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(float.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextFloat(52.0f); assertEquals(52.0f, reader.nextFloat()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(double.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextDouble(73.0); assertEquals(73.0, reader.nextDouble()); stackFrame = EmulatedStackFrame.create(MethodType.methodType(String.class)); writer.attach(stackFrame).makeReturnValueAccessor(); reader.attach(stackFrame).makeReturnValueAccessor(); writer.putNextReference("foo", String.class); assertEquals("foo", reader.nextReference(String.class)); } public void testReaderWriter_wrongTypes() { EmulatedStackFrame stackFrame = EmulatedStackFrame.create( MethodType.methodType(boolean.class, String.class)); EmulatedStackFrame.StackFrameReader reader = new EmulatedStackFrame.StackFrameReader(); reader.attach(stackFrame); try { reader.nextInt(); fail(); } catch (IllegalArgumentException expected) { } try { reader.nextDouble(); fail(); } catch (IllegalArgumentException expected) { } assertNull(reader.nextReference(String.class)); try { reader.nextDouble(); fail(); } catch (IllegalArgumentException expected) { } EmulatedStackFrame.StackFrameWriter writer = new EmulatedStackFrame.StackFrameWriter(); writer.attach(stackFrame); try { writer.putNextInt(0); fail(); } catch (IllegalArgumentException expected) { } try { writer.putNextDouble(0); fail(); } catch (IllegalArgumentException expected) { } writer.putNextReference(null, String.class); try { writer.putNextDouble(0); fail(); } catch (IllegalArgumentException expected) { } } public void testReturnValueReaderWriter_wrongTypes() { EmulatedStackFrame stackFrame = EmulatedStackFrame.create( MethodType.methodType(boolean.class, String.class)); EmulatedStackFrame.StackFrameReader reader = new EmulatedStackFrame.StackFrameReader(); reader.attach(stackFrame); reader.makeReturnValueAccessor(); try { reader.nextInt(); fail(); } catch (IllegalArgumentException expected) { } // Should succeeed. assertFalse(reader.nextBoolean()); // The next attempt should fail. try { reader.nextBoolean(); fail(); } catch (IllegalArgumentException expected) { } EmulatedStackFrame.StackFrameWriter writer = new EmulatedStackFrame.StackFrameWriter(); writer.attach(stackFrame); writer.makeReturnValueAccessor(); try { writer.putNextInt(0); fail(); } catch (IllegalArgumentException expected) { } // Should succeeed. writer.putNextBoolean(true); // The next attempt should fail. try { writer.putNextBoolean(false); fail(); } catch (IllegalArgumentException expected) { } } }