test/hotspot/jtreg/runtime/exceptionMsgs/ArrayIndexOutOfBoundsException/ArrayIndexOutOfBoundsExceptionTest.java
changeset 53533 bce458ffed11
parent 50094 2f79462aab9b
child 54800 ad757676262c
--- a/test/hotspot/jtreg/runtime/exceptionMsgs/ArrayIndexOutOfBoundsException/ArrayIndexOutOfBoundsExceptionTest.java	Mon Jan 28 23:00:31 2019 +0100
+++ b/test/hotspot/jtreg/runtime/exceptionMsgs/ArrayIndexOutOfBoundsException/ArrayIndexOutOfBoundsExceptionTest.java	Tue Jan 29 08:43:33 2019 +0100
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2018 SAP SE. All rights reserved.
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2019 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -51,6 +51,10 @@
  */
 public class ArrayIndexOutOfBoundsExceptionTest {
 
+    static {
+        System.loadLibrary("ArrayIndexOutOfBoundsExceptionTest");
+    }
+
     // Some fields used in the test.
     static int[] staticArray = new int[0];
     static long[][] staticLongArray = new long[0][0];
@@ -88,6 +92,26 @@
         }
     }
 
+    static native void  doNativeArrayStore(Object[] dst, Object element, int index);
+    static native Object doNativeArrayLoad(Object[] src, int index);
+
+    static native void doNativeBooleanArrayRegionLoad (boolean[] source, int start, int len);
+    static native void doNativeBooleanArrayRegionStore(boolean[] source, int start, int len);
+    static native void doNativeByteArrayRegionLoad    (byte[] source,    int start, int len);
+    static native void doNativeByteArrayRegionStore   (byte[] source,    int start, int len);
+    static native void doNativeShortArrayRegionLoad   (short[] source,   int start, int len);
+    static native void doNativeShortArrayRegionStore  (short[] source,   int start, int len);
+    static native void doNativeCharArrayRegionLoad    (char[] source,    int start, int len);
+    static native void doNativeCharArrayRegionStore   (char[] source,    int start, int len);
+    static native void doNativeIntArrayRegionLoad     (int[] source,     int start, int len);
+    static native void doNativeIntArrayRegionStore    (int[] source,     int start, int len);
+    static native void doNativeLongArrayRegionLoad    (long[] source,    int start, int len);
+    static native void doNativeLongArrayRegionStore   (long[] source,    int start, int len);
+    static native void doNativeFloatArrayRegionLoad   (float[] source,   int start, int len);
+    static native void doNativeFloatArrayRegionStore  (float[] source,   int start, int len);
+    static native void doNativeDoubleArrayRegionLoad  (double[] source,  int start, int len);
+    static native void doNativeDoubleArrayRegionStore (double[] source,  int start, int len);
+
     /**
      *
      */
@@ -439,5 +463,463 @@
             assertEquals(e.getMessage(),
                 "arraycopy: last destination index 7 out of bounds for float[5]");
         }
+
+
+        // Test native array access.
+
+
+        try {
+            System.out.println(doNativeArrayLoad(oa2, 77));
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Index 77 out of bounds for length 5");
+        }
+        try {
+            System.out.println(doNativeArrayLoad(oa1, -1));
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Index -1 out of bounds for length 10");
+        }
+
+        try {
+            doNativeArrayStore(oa1, "Some String", Integer.MIN_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Index -2147483648 out of bounds for length 10");
+        }
+        try {
+            doNativeArrayStore(oa1, "Some String", 13);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Index 13 out of bounds for length 10");
+        }
+
+        // Boolean
+
+        // Native array region loads.
+        // Boolean, len negative.
+        try {
+            doNativeBooleanArrayRegionLoad(za2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Boolean, index negative.
+        try {
+            doNativeBooleanArrayRegionLoad(za2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Boolean, index+len too big.
+        try {
+            doNativeBooleanArrayRegionLoad(za2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Boolean, len negative.
+        try {
+            doNativeBooleanArrayRegionStore(za2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Boolean, index negative.
+        try {
+            doNativeBooleanArrayRegionStore(za2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Boolean, index+len too big.
+        try {
+            doNativeBooleanArrayRegionStore(za2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Byte
+
+        // Native array region loads.
+        // Byte, len negative.
+        try {
+            doNativeByteArrayRegionLoad(ba1, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Byte, index negative.
+        try {
+            doNativeByteArrayRegionLoad(ba1, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 0");
+        }
+        // Byte, index+len too big.
+        try {
+            doNativeByteArrayRegionLoad(ba2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Byte, len negative.
+        try {
+            doNativeByteArrayRegionStore(ba2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Byte, index negative.
+        try {
+            doNativeByteArrayRegionStore(ba2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Byte, index+len too big.
+        try {
+            doNativeByteArrayRegionStore(ba2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Short
+
+        // Native array region loads.
+        // Short, len negative.
+        try {
+            doNativeShortArrayRegionLoad(sa2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Short, index negative.
+        try {
+            doNativeShortArrayRegionLoad(sa2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Short, index+len too big.
+        try {
+            doNativeShortArrayRegionLoad(sa2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Short, len negative.
+        try {
+            doNativeShortArrayRegionStore(sa2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Short, index negative.
+        try {
+            doNativeShortArrayRegionStore(sa2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Short, index+len too big.
+        try {
+            doNativeShortArrayRegionStore(sa2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Char
+
+        // Native array region loads.
+        // Char, len negative.
+        try {
+            doNativeCharArrayRegionLoad(ca2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Char, index negative.
+        try {
+            doNativeCharArrayRegionLoad(ca2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Char, index+len too big.
+        try {
+            doNativeCharArrayRegionLoad(ca2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Char, len negative.
+        try {
+            doNativeCharArrayRegionStore(ca2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Char, index negative.
+        try {
+            doNativeCharArrayRegionStore(ca2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Char, index+len too big.
+        try {
+            doNativeCharArrayRegionStore(ca2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Int
+
+        // Native array region loads.
+        // Int, len negative.
+        try {
+            doNativeIntArrayRegionLoad(ia2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Int, index negative.
+        try {
+            doNativeIntArrayRegionLoad(ia2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Int, index+len too big.
+        try {
+            doNativeIntArrayRegionLoad(ia2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Int, len negative.
+        try {
+            doNativeIntArrayRegionStore(ia2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Int, index negative.
+        try {
+            doNativeIntArrayRegionStore(ia2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Int, index+len too big.
+        try {
+            doNativeIntArrayRegionStore(ia2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Long
+
+        // Native array region loads.
+        // Long, len negative.
+        try {
+            doNativeLongArrayRegionLoad(la2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Long, index negative.
+        try {
+            doNativeLongArrayRegionLoad(la2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Long, index+len too big.
+        try {
+            doNativeLongArrayRegionLoad(la2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Long, len negative.
+        try {
+            doNativeLongArrayRegionStore(la2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Long, index negative.
+        try {
+            doNativeLongArrayRegionStore(la2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Long, index+len too big.
+        try {
+            doNativeLongArrayRegionStore(la2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Float
+
+        // Native array region loads.
+        // Float, len negative.
+        try {
+            doNativeFloatArrayRegionLoad(fa2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Float, index negative.
+        try {
+            doNativeFloatArrayRegionLoad(fa2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Float, index+len too big.
+        try {
+            doNativeFloatArrayRegionLoad(fa2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Float, len negative.
+        try {
+            doNativeFloatArrayRegionStore(fa2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Float, index negative.
+        try {
+            doNativeFloatArrayRegionStore(fa2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Float, index+len too big.
+        try {
+            doNativeFloatArrayRegionStore(fa2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
+
+        // Double
+
+        // Native array region loads.
+        // Double, len negative.
+        try {
+            doNativeDoubleArrayRegionLoad(da2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Double, index negative.
+        try {
+            doNativeDoubleArrayRegionLoad(da2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Double, index+len too big.
+        try {
+            doNativeDoubleArrayRegionLoad(da2, 3, Integer.MAX_VALUE-1);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483649 out of bounds for length 10");
+        }
+        // Native array region stores
+        // Double, len negative.
+        try {
+            doNativeDoubleArrayRegionStore(da2, 3, -77);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Length -77 is negative");
+        }
+        // Double, index negative.
+        try {
+            doNativeDoubleArrayRegionStore(da2, -3, 3);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region -3..0 out of bounds for length 10");
+        }
+        // Double, index+len too big.
+        try {
+            doNativeDoubleArrayRegionStore(da2, 3, Integer.MAX_VALUE);
+            fail();
+        } catch (ArrayIndexOutOfBoundsException e) {
+            assertEquals(e.getMessage(),
+                "Array region 3..2147483650 out of bounds for length 10");
+        }
     }
 }