blob: bc1ddf47ba5e158081d48e44a04c09c5c03e3a93 [file] [log] [blame]
/*
* Copyright (c) 2018, Oracle and/or its affiliates. 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
import java.lang.reflect.Field;
import sun.hotspot.WhiteBox;
//
// Test primitive type class mirror objects are cached when open archive heap
// objects are mapped.
//
public class PrimitiveTypesApp {
public static void main(String[] args) {
WhiteBox wb = WhiteBox.getWhiteBox();
if (!wb.areOpenArchiveHeapObjectsMapped()) {
System.out.println("Archived open_archive_heap objects are not mapped.");
System.out.println("This may happen during normal operation. Test Skipped.");
return;
}
FieldsTest ft = new FieldsTest();
ft.testBoolean(wb);
ft.testByte(wb);
ft.testChar(wb);
ft.testInt(wb);
ft.testShort(wb);
ft.testLong(wb);
ft.testFloat(wb);
ft.testDouble(wb);
}
}
class FieldsTest {
public boolean f_boolean;
public byte f_byte;
public char f_char;
public int f_int;
public short f_short;
public long f_long;
public float f_float;
public double f_double;
FieldsTest() {
f_byte = 1;
f_boolean = false;
f_char = 'a';
f_int = 1;
f_short = 100;
f_long = 2018L;
f_float = 1.0f;
f_double = 2.5;
}
void testBoolean(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_boolean");
f.setBoolean(this, true);
if (!f_boolean) {
throw new RuntimeException("FAILED. Field f_boolean has unexpected value: " + f_boolean);
}
checkPrimitiveType(wb, f, Boolean.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testByte(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_byte");
f.setByte(this, (byte)9);
if (f_byte != (byte)9) {
throw new RuntimeException("FAILED. Field f_byte has unexpected value: " + f_byte);
}
checkPrimitiveType(wb, f, Byte.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testChar(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_char");
f.setChar(this, 'b');
if (f_char != 'b') {
throw new RuntimeException("FAILED. Field f_char has unexpected value: " + f_char);
}
checkPrimitiveType(wb, f, Character.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testInt(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_int");
f.setInt(this, 9999);
if (f_int != 9999) {
throw new RuntimeException("FAILED. Field f_int has unexpected value: " + f_int);
}
checkPrimitiveType(wb, f, Integer.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testShort(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_short");
f.setShort(this, (short)99);
if (f_short != 99) {
throw new RuntimeException("FAILED. Field f_short has unexpected value: " + f_short);
}
checkPrimitiveType(wb, f, Short.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testLong(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_long");
f.setLong(this, 99L);
if (f_long != 99L) {
throw new RuntimeException("FAILED. Field f_long has unexpected value: " + f_long);
}
checkPrimitiveType(wb, f, Long.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testFloat(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_float");
f.setFloat(this, 9.9f);
if (f_float != 9.9f) {
throw new RuntimeException("FAILED. Field f_float has unexpected value: " + f_float);
}
checkPrimitiveType(wb, f, Float.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void testDouble(WhiteBox wb) {
try {
Field f = this.getClass().getDeclaredField("f_double");
f.setDouble(this, 9.9);
if (f_double != 9.9) {
throw new RuntimeException("FAILED. Field f_double has unexpected value: " + f_double);
}
checkPrimitiveType(wb, f, Double.TYPE);
} catch (NoSuchFieldException nsfe) {
throw new RuntimeException(nsfe);
} catch (IllegalAccessException iae) {
throw new RuntimeException(iae);
}
}
void checkPrimitiveType(WhiteBox wb, Field f, Class t) {
Class c = f.getType();
if (!(c.isPrimitive() && c == t)) {
throw new RuntimeException("FAILED. " + c + " is not primitive type " + t);
}
if (wb.isShared(c)) {
System.out.println(c + " is cached, expected");
} else {
throw new RuntimeException("FAILED. " + c + " is not cached.");
}
}
}