110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers/* 210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * Copyright (C) 2014 The Android Open Source Project 310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * 410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * you may not use this file except in compliance with the License. 610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * You may obtain a copy of the License at 710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * 810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * 1010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * Unless required by applicable law or agreed to in writing, software 1110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 1210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * See the License for the specific language governing permissions and 1410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * limitations under the License. 1510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers */ 1610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 1710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogerspackage dalvik.system; 1810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 1910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogersimport java.lang.reflect.Array; 2010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogersimport junit.framework.TestCase; 2110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 2210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers/** 2310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers * Test VMRuntime behavior. 2410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers */ 2510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogerspublic final class VMRuntimeTest extends TestCase { 2610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 2710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers private void doTestNewNonMovableArray(Class<?> componentType, int step, int maxLength) { 2810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create negative sized arrays. 2910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 3010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newNonMovableArray(componentType, -1); 3110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 3210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NegativeArraySizeException expected) { 3310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 3410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 3510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 3610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newNonMovableArray(componentType, Integer.MIN_VALUE); 3710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 3810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NegativeArraySizeException expected) { 3910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 4010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 4110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Allocate arrays in a loop and check their properties. 4210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers for (int i = 0; i <= maxLength; i += step) { 4310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newNonMovableArray(componentType, i); 4410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(array.getClass().isArray()); 4510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertEquals(array.getClass().getComponentType(), componentType); 4610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertEquals(Array.getLength(array), i); 4710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 4810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 4910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 5010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers public void testNewNonMovableArray() { 5110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create arrays with no component type. 5210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 5310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newNonMovableArray(null, 0); 5410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 5510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NullPointerException expected) { 5610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 5710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 5810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create arrays of void. 5910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 6010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newNonMovableArray(void.class, 0); 6110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 62023ada91266cd5a8e073f978d01f769ff978340eIan Rogers } catch (NoClassDefFoundError expected) { 6310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 6410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 6510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers int maxLengthForLoop = 16 * 1024; 6610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers int step = 67; 6710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(boolean.class, step, maxLengthForLoop); 6810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(byte.class, step, maxLengthForLoop); 6910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(char.class, step, maxLengthForLoop); 7010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(short.class, step, maxLengthForLoop); 7110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(int.class, step, maxLengthForLoop); 7210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(long.class, step, maxLengthForLoop); 7310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(float.class, step, maxLengthForLoop); 7410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(double.class, step, maxLengthForLoop); 7510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(Object.class, step, maxLengthForLoop); 7610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(Number.class, step, maxLengthForLoop); 7710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(String.class, step, maxLengthForLoop); 7810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewNonMovableArray(Runnable.class, step, maxLengthForLoop); 7910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 8010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 8110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers private void doTestNewUnpaddedArray(Class<?> componentType, int step, int maxLength) { 8210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create negative sized arrays. 8310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 8410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newUnpaddedArray(componentType, -1); 8510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 8610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NegativeArraySizeException expected) { 8710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 8810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 8910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 9010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newUnpaddedArray(componentType, Integer.MIN_VALUE); 9110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 9210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NegativeArraySizeException expected) { 9310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 9410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 9510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Allocate arrays in a loop and check their properties. 9610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers for (int i = 0; i <= maxLength; i += step) { 9710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newUnpaddedArray(componentType, i); 9810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(array.getClass().isArray()); 9910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertEquals(array.getClass().getComponentType(), componentType); 10010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(Array.getLength(array) >= i); 10110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 10210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 10310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 10410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers public void testNewUnpaddedArray() { 10510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create arrays with no component type. 10610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 10710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newUnpaddedArray(null, 0); 10810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 10910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } catch (NullPointerException expected) { 11010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 11110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 11210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers // Can't create arrays of void. 11310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers try { 11410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers Object array = VMRuntime.getRuntime().newUnpaddedArray(void.class, 0); 11510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers assertTrue(false); 116023ada91266cd5a8e073f978d01f769ff978340eIan Rogers } catch (NoClassDefFoundError expected) { 11710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 11810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 11910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers int maxLengthForLoop = 16 * 1024; 12010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers int step = 67; 12110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(boolean.class, step, maxLengthForLoop); 12210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(byte.class, step, maxLengthForLoop); 12310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(char.class, step, maxLengthForLoop); 12410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(short.class, step, maxLengthForLoop); 12510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(int.class, step, maxLengthForLoop); 12610af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(long.class, step, maxLengthForLoop); 12710af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(float.class, step, maxLengthForLoop); 12810af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(double.class, step, maxLengthForLoop); 12910af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(Object.class, step, maxLengthForLoop); 13010af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(Number.class, step, maxLengthForLoop); 13110af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(String.class, step, maxLengthForLoop); 13210af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers doTestNewUnpaddedArray(Runnable.class, step, maxLengthForLoop); 13310af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers } 13410af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers} 13510af76d5af1d87686ff9ab8d00f3dadc15a84fb7Ian Rogers 136