blob: 461ce89e65987005fed868b46917aeb20da11f1f [file] [log] [blame]
/*
* 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) {
}
}
}