Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java
38821 views
/*1* Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 498228926* @summary Test ThreadInfo.from to return a valid27* ThreadInfo object. Or throw exception if28* the input CompositeData is invalid.29* @author Mandy Chung30*31* @compile OpenTypeConverter.java32* @build ThreadInfoCompositeData33* @run main ThreadInfoCompositeData34*/3536import javax.management.openmbean.*;37import java.lang.management.LockInfo;38import java.lang.management.MonitorInfo;39import java.lang.management.ThreadInfo;4041public class ThreadInfoCompositeData {42private static StackTraceElement[] ste = new StackTraceElement[1];43private static CompositeData[] steCD = new CompositeData[1];44private static String lockClassName = "myClass";45private static int lockIdentityHashCode = 123456;46private static String lockName = lockClassName + '@' +47Integer.toHexString(lockIdentityHashCode);48private static LockInfo lockInfo =49new LockInfo(lockClassName, lockIdentityHashCode);5051public static void main(String[] argv) throws Exception {52// A valid CompositeData is passed to ThreadInfo53createGoodCompositeData();54// A valid CompositeData for JDK 5.0 ThreadInfo55// is passed to ThreadInfo56createV5ThreadInfo();57// An invalid CompositeData is passed to ThreadInfo.from()58badNameCompositeData();59badTypeCompositeData();60System.out.println("Test passed");61}6263public static void createGoodCompositeData() throws Exception {64CompositeType ct =65new CompositeType("MyCompositeType",66"CompositeType for ThreadInfo",67validItemNames,68validItemNames,69validItemTypes);70CompositeData cd =71new CompositeDataSupport(ct,72validItemNames,73values);74ThreadInfo info = ThreadInfo.from(cd);75checkThreadInfo(info);76}7778public static void createV5ThreadInfo() throws Exception {79String[] v5ItemNames = new String[NUM_V5_ATTS];80OpenType[] v5ItemTypes = new OpenType[NUM_V5_ATTS];81Object[] v5ItemValues = new Object[NUM_V5_ATTS];82for (int i = 0; i < NUM_V5_ATTS; i++) {83v5ItemNames[i] = validItemNames[i];84v5ItemTypes[i] = validItemTypes[i];85v5ItemValues[i] = values[i];86}87CompositeType ct =88new CompositeType("MyCompositeType",89"CompositeType for JDK 5.0 ThreadInfo",90v5ItemNames,91v5ItemNames,92v5ItemTypes);93CompositeData cd =94new CompositeDataSupport(ct,95v5ItemNames,96v5ItemValues);97ThreadInfo info = ThreadInfo.from(cd);98checkThreadInfo(info);99}100101static void checkThreadInfo(ThreadInfo info) throws Exception {102if (info.getThreadId() != ((Long) values[THREAD_ID]).longValue()) {103throw new RuntimeException("Thread Id = " + info.getThreadId() +104" expected = " + values[THREAD_ID]);105}106if (!info.getThreadName().equals(values[THREAD_NAME])) {107throw new RuntimeException("Thread Name = " +108info.getThreadName() + " expected = " + values[THREAD_NAME]);109}110if (info.getThreadState() != Thread.State.RUNNABLE) {111throw new RuntimeException("Thread Name = " +112info.getThreadName() + " expected = " + Thread.State.RUNNABLE);113}114if (info.getBlockedTime() != ((Long) values[BLOCKED_TIME]).longValue()) {115throw new RuntimeException("blocked time = " +116info.getBlockedTime() +117" expected = " + values[BLOCKED_TIME]);118}119if (info.getBlockedCount() != ((Long) values[BLOCKED_COUNT]).longValue()) {120throw new RuntimeException("blocked count = " +121info.getBlockedCount() +122" expected = " + values[BLOCKED_COUNT]);123}124if (info.getWaitedTime() != ((Long) values[WAITED_TIME]).longValue()) {125throw new RuntimeException("waited time = " +126info.getWaitedTime() +127" expected = " + values[WAITED_TIME]);128}129if (info.getWaitedCount() != ((Long) values[WAITED_COUNT]).longValue()) {130throw new RuntimeException("waited count = " +131info.getWaitedCount() +132" expected = " + values[WAITED_COUNT]);133}134if (!info.getLockName().equals(values[LOCK_NAME])) {135throw new RuntimeException("Lock Name = " +136info.getLockName() + " expected = " + values[LOCK_NAME]);137}138if (info.getLockOwnerId() !=139((Long) values[LOCK_OWNER_ID]).longValue()) {140throw new RuntimeException(141"LockOwner Id = " + info.getLockOwnerId() +142" expected = " + values[LOCK_OWNER_ID]);143}144if (!info.getLockOwnerName().equals(values[LOCK_OWNER_NAME])) {145throw new RuntimeException("LockOwner Name = " +146info.getLockOwnerName() + " expected = " +147values[LOCK_OWNER_NAME]);148}149150checkStackTrace(info.getStackTrace());151152checkLockInfo(info.getLockInfo());153}154155private static void checkStackTrace(StackTraceElement[] s)156throws Exception {157if (ste.length != s.length) {158throw new RuntimeException("Stack Trace length = " +159s.length + " expected = " + ste.length);160}161162StackTraceElement s1 = ste[0];163StackTraceElement s2 = s[0];164165if (!s1.getClassName().equals(s2.getClassName())) {166throw new RuntimeException("Class name = " +167s2.getClassName() + " expected = " + s1.getClassName());168}169if (!s1.getMethodName().equals(s2.getMethodName())) {170throw new RuntimeException("Method name = " +171s2.getMethodName() + " expected = " + s1.getMethodName());172}173if (!s1.getFileName().equals(s2.getFileName())) {174throw new RuntimeException("File name = " +175s2.getFileName() + " expected = " + s1.getFileName());176}177if (s1.getLineNumber() != s2.getLineNumber()) {178throw new RuntimeException("Line number = " +179s2.getLineNumber() + " expected = " + s1.getLineNumber());180}181}182183private static void checkLockInfo(LockInfo li)184throws Exception {185if (!li.getClassName().equals(lockInfo.getClassName())) {186throw new RuntimeException("Class Name = " +187li.getClassName() + " expected = " + lockInfo.getClassName());188}189if (li.getIdentityHashCode() != lockInfo.getIdentityHashCode()) {190throw new RuntimeException("Class Name = " +191li.getIdentityHashCode() + " expected = " +192lockInfo.getIdentityHashCode());193}194}195196public static void badNameCompositeData() throws Exception {197CompositeType ct =198new CompositeType("MyCompositeType",199"CompositeType for ThreadInfo",200badItemNames,201badItemNames,202validItemTypes);203CompositeData cd =204new CompositeDataSupport(ct,205badItemNames,206values);207208try {209ThreadInfo info = ThreadInfo.from(cd);210} catch (IllegalArgumentException e) {211System.out.println("Expected exception: " +212e.getMessage());213return;214}215throw new RuntimeException(216"IllegalArgumentException not thrown");217}218219public static void badTypeCompositeData() throws Exception {220CompositeType ct =221new CompositeType("MyCompositeType",222"CompositeType for ThreadInfo",223validItemNames,224validItemNames,225badItemTypes);226227// patch values[STACK_TRACE] to Long228values[STACK_TRACE] = new Long(1000);229values[LOCK_INFO] = new Long(1000);230CompositeData cd =231new CompositeDataSupport(ct,232validItemNames,233values);234235try {236ThreadInfo info = ThreadInfo.from(cd);237} catch (IllegalArgumentException e) {238System.out.println("Expected exception: " +239e.getMessage());240return;241}242throw new RuntimeException(243"IllegalArgumentException not thrown");244}245246private static final int THREAD_ID = 0;247private static final int THREAD_NAME = 1;248private static final int THREAD_STATE = 2;249private static final int BLOCKED_TIME = 3;250private static final int BLOCKED_COUNT = 4;251private static final int WAITED_TIME = 5;252private static final int WAITED_COUNT = 6;253private static final int LOCK_NAME = 7;254private static final int LOCK_OWNER_ID = 8;255private static final int LOCK_OWNER_NAME = 9;256private static final int STACK_TRACE = 10;257private static final int SUSPENDED = 11;258private static final int IN_NATIVE = 12;259private static final int NUM_V5_ATTS = 13;260// JDK 6.0 ThreadInfo attribtues261private static final int LOCK_INFO = 13;262263private static final String[] validItemNames = {264"threadId",265"threadName",266"threadState",267"blockedTime",268"blockedCount",269"waitedTime",270"waitedCount",271"lockName",272"lockOwnerId",273"lockOwnerName",274"stackTrace",275"suspended",276"inNative",277"lockInfo",278};279280private static OpenType[] validItemTypes = {281SimpleType.LONG,282SimpleType.STRING,283SimpleType.STRING,284SimpleType.LONG,285SimpleType.LONG,286SimpleType.LONG,287SimpleType.LONG,288SimpleType.STRING,289SimpleType.LONG,290SimpleType.STRING,291null, // ArrayType for StackTraceElement[]292SimpleType.BOOLEAN,293SimpleType.BOOLEAN,294null, // CompositeType for LockInfo295};296297private static Object[] values = {298new Long(100),299"FooThread",300"RUNNABLE",301new Long(200),302new Long(10),303new Long(300),304new Long(20),305lockName,306new Long(99),307"BarThread",308steCD,309new Boolean(false),310new Boolean(false),311null, // To be initialized to lockInfoCD312};313314private static final String[] steItemNames = {315"className",316"methodName",317"fileName",318"lineNumber",319"nativeMethod",320};321322private static final String[] lockInfoItemNames = {323"className",324"identityHashCode",325};326327static {328// create stack trace element329ste[0] = new StackTraceElement("FooClass", "getFoo", "Foo.java", 100);330331// initialize the ste[0] and values and validItemTypes332try {333CompositeType steCType = (CompositeType)334OpenTypeConverter.toOpenType(StackTraceElement.class);335validItemTypes[STACK_TRACE] = new ArrayType(1, steCType);336337final Object[] steValue = {338ste[0].getClassName(),339ste[0].getMethodName(),340ste[0].getFileName(),341new Integer(ste[0].getLineNumber()),342new Boolean(ste[0].isNativeMethod()),343};344345steCD[0] =346new CompositeDataSupport(steCType,347steItemNames,348steValue);349350CompositeType lockInfoCType = (CompositeType)351OpenTypeConverter.toOpenType(LockInfo.class);352validItemTypes[LOCK_INFO] = lockInfoCType;353354final Object[] lockInfoValue = {355lockInfo.getClassName(),356lockInfo.getIdentityHashCode(),357};358359values[LOCK_INFO] =360new CompositeDataSupport(lockInfoCType,361lockInfoItemNames,362lockInfoValue);363} catch (Exception e) {364throw new RuntimeException(e);365}366}367368private static final String[] badItemNames = {369"threadId",370"threadName",371"threadState",372"blockedTime",373"blockedCount",374"waitedTime",375"waitedCount",376"lockName",377"lockOwnerId",378"lockOwnerName",379"BadStackTrace", // bad item name380"suspended",381"inNative",382"lockInfo",383};384private static final OpenType[] badItemTypes = {385SimpleType.LONG,386SimpleType.STRING,387SimpleType.STRING,388SimpleType.LONG,389SimpleType.LONG,390SimpleType.LONG,391SimpleType.LONG,392SimpleType.STRING,393SimpleType.LONG,394SimpleType.STRING,395SimpleType.LONG, // bad type396SimpleType.BOOLEAN,397SimpleType.BOOLEAN,398SimpleType.LONG, // bad type399};400401}402403404