0N/A/*
2362N/A * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A/*
0N/A * @test
0N/A * @bug 4982289
0N/A * @summary Test ThreadInfo.from to return a valid
0N/A * ThreadInfo object. Or throw exception if
0N/A * the input CompositeData is invalid.
0N/A * @author Mandy Chung
0N/A *
1952N/A * @compile OpenTypeConverter.java
0N/A * @build ThreadInfoCompositeData
0N/A * @run main ThreadInfoCompositeData
0N/A */
0N/A
0N/Aimport javax.management.openmbean.*;
0N/Aimport java.lang.management.LockInfo;
0N/Aimport java.lang.management.MonitorInfo;
0N/Aimport java.lang.management.ThreadInfo;
0N/A
0N/Apublic class ThreadInfoCompositeData {
0N/A private static StackTraceElement[] ste = new StackTraceElement[1];
0N/A private static CompositeData[] steCD = new CompositeData[1];
0N/A private static String lockClassName = "myClass";
0N/A private static int lockIdentityHashCode = 123456;
0N/A private static String lockName = lockClassName + '@' +
0N/A Integer.toHexString(lockIdentityHashCode);
0N/A private static LockInfo lockInfo =
0N/A new LockInfo(lockClassName, lockIdentityHashCode);
0N/A
0N/A public static void main(String[] argv) throws Exception {
0N/A // A valid CompositeData is passed to ThreadInfo
0N/A createGoodCompositeData();
0N/A // A valid CompositeData for JDK 5.0 ThreadInfo
0N/A // is passed to ThreadInfo
0N/A createV5ThreadInfo();
0N/A // An invalid CompositeData is passed to ThreadInfo.from()
0N/A badNameCompositeData();
0N/A badTypeCompositeData();
0N/A System.out.println("Test passed");
0N/A }
0N/A
0N/A public static void createGoodCompositeData() throws Exception {
0N/A CompositeType ct =
0N/A new CompositeType("MyCompositeType",
0N/A "CompositeType for ThreadInfo",
0N/A validItemNames,
0N/A validItemNames,
0N/A validItemTypes);
0N/A CompositeData cd =
0N/A new CompositeDataSupport(ct,
0N/A validItemNames,
0N/A values);
0N/A ThreadInfo info = ThreadInfo.from(cd);
0N/A checkThreadInfo(info);
0N/A }
0N/A
0N/A public static void createV5ThreadInfo() throws Exception {
0N/A String[] v5ItemNames = new String[NUM_V5_ATTS];
0N/A OpenType[] v5ItemTypes = new OpenType[NUM_V5_ATTS];
0N/A Object[] v5ItemValues = new Object[NUM_V5_ATTS];
0N/A for (int i = 0; i < NUM_V5_ATTS; i++) {
0N/A v5ItemNames[i] = validItemNames[i];
0N/A v5ItemTypes[i] = validItemTypes[i];
0N/A v5ItemValues[i] = values[i];
0N/A }
0N/A CompositeType ct =
0N/A new CompositeType("MyCompositeType",
0N/A "CompositeType for JDK 5.0 ThreadInfo",
0N/A v5ItemNames,
0N/A v5ItemNames,
0N/A v5ItemTypes);
0N/A CompositeData cd =
0N/A new CompositeDataSupport(ct,
0N/A v5ItemNames,
0N/A v5ItemValues);
0N/A ThreadInfo info = ThreadInfo.from(cd);
0N/A checkThreadInfo(info);
0N/A }
0N/A
0N/A static void checkThreadInfo(ThreadInfo info) throws Exception {
0N/A if (info.getThreadId() != ((Long) values[THREAD_ID]).longValue()) {
0N/A throw new RuntimeException("Thread Id = " + info.getThreadId() +
0N/A " expected = " + values[THREAD_ID]);
0N/A }
0N/A if (!info.getThreadName().equals(values[THREAD_NAME])) {
0N/A throw new RuntimeException("Thread Name = " +
0N/A info.getThreadName() + " expected = " + values[THREAD_NAME]);
0N/A }
0N/A if (info.getThreadState() != Thread.State.RUNNABLE) {
0N/A throw new RuntimeException("Thread Name = " +
0N/A info.getThreadName() + " expected = " + Thread.State.RUNNABLE);
0N/A }
0N/A if (info.getBlockedTime() != ((Long) values[BLOCKED_TIME]).longValue()) {
0N/A throw new RuntimeException("blocked time = " +
0N/A info.getBlockedTime() +
0N/A " expected = " + values[BLOCKED_TIME]);
0N/A }
0N/A if (info.getBlockedCount() != ((Long) values[BLOCKED_COUNT]).longValue()) {
0N/A throw new RuntimeException("blocked count = " +
0N/A info.getBlockedCount() +
0N/A " expected = " + values[BLOCKED_COUNT]);
0N/A }
0N/A if (info.getWaitedTime() != ((Long) values[WAITED_TIME]).longValue()) {
0N/A throw new RuntimeException("waited time = " +
0N/A info.getWaitedTime() +
0N/A " expected = " + values[WAITED_TIME]);
0N/A }
0N/A if (info.getWaitedCount() != ((Long) values[WAITED_COUNT]).longValue()) {
0N/A throw new RuntimeException("waited count = " +
0N/A info.getWaitedCount() +
0N/A " expected = " + values[WAITED_COUNT]);
0N/A }
0N/A if (!info.getLockName().equals(values[LOCK_NAME])) {
0N/A throw new RuntimeException("Lock Name = " +
0N/A info.getLockName() + " expected = " + values[LOCK_NAME]);
0N/A }
0N/A if (info.getLockOwnerId() !=
0N/A ((Long) values[LOCK_OWNER_ID]).longValue()) {
0N/A throw new RuntimeException(
0N/A "LockOwner Id = " + info.getLockOwnerId() +
0N/A " expected = " + values[LOCK_OWNER_ID]);
0N/A }
0N/A if (!info.getLockOwnerName().equals(values[LOCK_OWNER_NAME])) {
0N/A throw new RuntimeException("LockOwner Name = " +
0N/A info.getLockOwnerName() + " expected = " +
0N/A values[LOCK_OWNER_NAME]);
0N/A }
0N/A
0N/A checkStackTrace(info.getStackTrace());
0N/A
0N/A checkLockInfo(info.getLockInfo());
0N/A }
0N/A
0N/A private static void checkStackTrace(StackTraceElement[] s)
0N/A throws Exception {
0N/A if (ste.length != s.length) {
0N/A throw new RuntimeException("Stack Trace length = " +
0N/A s.length + " expected = " + ste.length);
0N/A }
0N/A
0N/A StackTraceElement s1 = ste[0];
0N/A StackTraceElement s2 = s[0];
0N/A
0N/A if (!s1.getClassName().equals(s2.getClassName())) {
0N/A throw new RuntimeException("Class name = " +
0N/A s2.getClassName() + " expected = " + s1.getClassName());
0N/A }
0N/A if (!s1.getMethodName().equals(s2.getMethodName())) {
0N/A throw new RuntimeException("Method name = " +
0N/A s2.getMethodName() + " expected = " + s1.getMethodName());
0N/A }
0N/A if (!s1.getFileName().equals(s2.getFileName())) {
0N/A throw new RuntimeException("File name = " +
0N/A s2.getFileName() + " expected = " + s1.getFileName());
0N/A }
0N/A if (s1.getLineNumber() != s2.getLineNumber()) {
0N/A throw new RuntimeException("Line number = " +
0N/A s2.getLineNumber() + " expected = " + s1.getLineNumber());
0N/A }
0N/A }
0N/A
0N/A private static void checkLockInfo(LockInfo li)
0N/A throws Exception {
0N/A if (!li.getClassName().equals(lockInfo.getClassName())) {
0N/A throw new RuntimeException("Class Name = " +
0N/A li.getClassName() + " expected = " + lockInfo.getClassName());
0N/A }
0N/A if (li.getIdentityHashCode() != lockInfo.getIdentityHashCode()) {
0N/A throw new RuntimeException("Class Name = " +
0N/A li.getIdentityHashCode() + " expected = " +
0N/A lockInfo.getIdentityHashCode());
0N/A }
0N/A }
0N/A
0N/A public static void badNameCompositeData() throws Exception {
0N/A CompositeType ct =
0N/A new CompositeType("MyCompositeType",
0N/A "CompositeType for ThreadInfo",
0N/A badItemNames,
0N/A badItemNames,
0N/A validItemTypes);
0N/A CompositeData cd =
0N/A new CompositeDataSupport(ct,
0N/A badItemNames,
0N/A values);
0N/A
0N/A try {
0N/A ThreadInfo info = ThreadInfo.from(cd);
0N/A } catch (IllegalArgumentException e) {
0N/A System.out.println("Expected exception: " +
0N/A e.getMessage());
0N/A return;
0N/A }
0N/A throw new RuntimeException(
0N/A "IllegalArgumentException not thrown");
0N/A }
0N/A
0N/A public static void badTypeCompositeData() throws Exception {
0N/A CompositeType ct =
0N/A new CompositeType("MyCompositeType",
0N/A "CompositeType for ThreadInfo",
0N/A validItemNames,
0N/A validItemNames,
0N/A badItemTypes);
0N/A
0N/A // patch values[STACK_TRACE] to Long
0N/A values[STACK_TRACE] = new Long(1000);
0N/A values[LOCK_INFO] = new Long(1000);
0N/A CompositeData cd =
0N/A new CompositeDataSupport(ct,
0N/A validItemNames,
0N/A values);
0N/A
0N/A try {
0N/A ThreadInfo info = ThreadInfo.from(cd);
0N/A } catch (IllegalArgumentException e) {
0N/A System.out.println("Expected exception: " +
0N/A e.getMessage());
0N/A return;
0N/A }
0N/A throw new RuntimeException(
0N/A "IllegalArgumentException not thrown");
0N/A }
0N/A
0N/A private static final int THREAD_ID = 0;
0N/A private static final int THREAD_NAME = 1;
0N/A private static final int THREAD_STATE = 2;
0N/A private static final int BLOCKED_TIME = 3;
0N/A private static final int BLOCKED_COUNT = 4;
0N/A private static final int WAITED_TIME = 5;
0N/A private static final int WAITED_COUNT = 6;
0N/A private static final int LOCK_NAME = 7;
0N/A private static final int LOCK_OWNER_ID = 8;
0N/A private static final int LOCK_OWNER_NAME = 9;
0N/A private static final int STACK_TRACE = 10;
0N/A private static final int SUSPENDED = 11;
0N/A private static final int IN_NATIVE = 12;
0N/A private static final int NUM_V5_ATTS = 13;
0N/A // JDK 6.0 ThreadInfo attribtues
0N/A private static final int LOCK_INFO = 13;
0N/A
0N/A private static final String[] validItemNames = {
0N/A "threadId",
0N/A "threadName",
0N/A "threadState",
0N/A "blockedTime",
0N/A "blockedCount",
0N/A "waitedTime",
0N/A "waitedCount",
0N/A "lockName",
0N/A "lockOwnerId",
0N/A "lockOwnerName",
0N/A "stackTrace",
0N/A "suspended",
0N/A "inNative",
0N/A "lockInfo",
0N/A };
0N/A
0N/A private static OpenType[] validItemTypes = {
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A SimpleType.STRING,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A null, // ArrayType for StackTraceElement[]
0N/A SimpleType.BOOLEAN,
0N/A SimpleType.BOOLEAN,
0N/A null, // CompositeType for LockInfo
0N/A };
0N/A
0N/A private static Object[] values = {
0N/A new Long(100),
0N/A "FooThread",
0N/A "RUNNABLE",
0N/A new Long(200),
0N/A new Long(10),
0N/A new Long(300),
0N/A new Long(20),
0N/A lockName,
0N/A new Long(99),
0N/A "BarThread",
0N/A steCD,
0N/A new Boolean(false),
0N/A new Boolean(false),
0N/A null, // To be initialized to lockInfoCD
0N/A };
0N/A
0N/A private static final String[] steItemNames = {
0N/A "className",
0N/A "methodName",
0N/A "fileName",
0N/A "lineNumber",
0N/A "nativeMethod",
0N/A };
0N/A
0N/A private static final String[] lockInfoItemNames = {
0N/A "className",
0N/A "identityHashCode",
0N/A };
0N/A
0N/A static {
0N/A // create stack trace element
0N/A ste[0] = new StackTraceElement("FooClass", "getFoo", "Foo.java", 100);
0N/A
0N/A // initialize the ste[0] and values and validItemTypes
0N/A try {
0N/A CompositeType steCType = (CompositeType)
0N/A OpenTypeConverter.toOpenType(StackTraceElement.class);
0N/A validItemTypes[STACK_TRACE] = new ArrayType(1, steCType);
0N/A
0N/A final Object[] steValue = {
0N/A ste[0].getClassName(),
0N/A ste[0].getMethodName(),
0N/A ste[0].getFileName(),
0N/A new Integer(ste[0].getLineNumber()),
0N/A new Boolean(ste[0].isNativeMethod()),
0N/A };
0N/A
0N/A steCD[0] =
0N/A new CompositeDataSupport(steCType,
0N/A steItemNames,
0N/A steValue);
0N/A
0N/A CompositeType lockInfoCType = (CompositeType)
0N/A OpenTypeConverter.toOpenType(LockInfo.class);
0N/A validItemTypes[LOCK_INFO] = lockInfoCType;
0N/A
0N/A final Object[] lockInfoValue = {
0N/A lockInfo.getClassName(),
0N/A lockInfo.getIdentityHashCode(),
0N/A };
0N/A
0N/A values[LOCK_INFO] =
0N/A new CompositeDataSupport(lockInfoCType,
0N/A lockInfoItemNames,
0N/A lockInfoValue);
0N/A } catch (Exception e) {
0N/A throw new RuntimeException(e);
0N/A }
0N/A }
0N/A
0N/A private static final String[] badItemNames = {
0N/A "threadId",
0N/A "threadName",
0N/A "threadState",
0N/A "blockedTime",
0N/A "blockedCount",
0N/A "waitedTime",
0N/A "waitedCount",
0N/A "lockName",
0N/A "lockOwnerId",
0N/A "lockOwnerName",
0N/A "BadStackTrace", // bad item name
0N/A "suspended",
0N/A "inNative",
0N/A "lockInfo",
0N/A };
0N/A private static final OpenType[] badItemTypes = {
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A SimpleType.STRING,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A SimpleType.LONG,
0N/A SimpleType.STRING,
0N/A SimpleType.LONG, // bad type
0N/A SimpleType.BOOLEAN,
0N/A SimpleType.BOOLEAN,
0N/A SimpleType.LONG, // bad type
0N/A };
0N/A
0N/A}