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