15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/*
25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership.
55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with
75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License.  You may obtain a copy of the License at
85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  Unless required by applicable law or agreed to in writing, software
125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  See the License for the specific language governing permissions and
165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  limitations under the License.
175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Anatoly F. Bondarenko
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 19.06.2006
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.ThreadReference;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.exceptions.*;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP Unit test for ThreadReference.ThreadGroup command.
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class ThreadGroup002Test extends JDWPSyncTestCase {
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusPassed = 0;
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusFailed = -1;
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final String debuggeeSignature =
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "Lorg/apache/harmony/jpda/tests/jdwp/ThreadReference/ThreadGroup002Debuggee;";
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
46e1833aa2673d4f975ad35e7a39317feeea922fe1Sebastien Hertz    @Override
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getDebuggeeClassName() {
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "org.apache.harmony.jpda.tests.jdwp.ThreadReference.ThreadGroup002Debuggee";
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ThreadReference.ThreadGroup command.
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts ThreadGroup002Debuggee which creates some thread
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * groups and starts some tested threads which belong to different created thread groups.
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>After the tested threads start, at first the test wait for the some first
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * tested threads to finish.
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR> Then the test for every tested thread does:
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - performs ThreadReference.Status command;
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - performs the ThreadReference.ThreadGroup command;
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - performs the ThreadGroupReference.name command;
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>It is expected that
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - all threads with status ZOMBIE are only finished tested threads;
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - all threads without status ZOMBIE are only NOT finished tested threads;
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - if status of thread is ZOMBIE then returned groupID must be null;
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - if status of thread is not ZOMBIE then returned groupID must not be null;
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - thread group name should be expected name for thread which is not ZOMBIE;
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testThreadGroup002() {
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> testThreadGroup002: START...");
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String debuggeeMessage = synchronizer.receiveMessage();
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int testedThreadsNumber = 0;
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        try {
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            testedThreadsNumber = Integer.valueOf(debuggeeMessage).intValue();
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (NumberFormatException exception) {
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                ("## FAILURE: Exception while getting number of started threads from debuggee = " + exception);
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            synchronizer.sendMessage("FINISH");
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail("\n## Can NOT get number of started threads from debuggee! ");
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        testedThreadsNumber++; // to add debuggee main thread
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==>  Number of threads in debuggee to test = " + testedThreadsNumber);
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String[] testedThreadsNames = new String[testedThreadsNumber];
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String[] testedThreadGroupsNames = new String[testedThreadsNumber];
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long[] testedThreadsIDs = new long[testedThreadsNumber];
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String debuggeeMainThreadName = synchronizer.receiveMessage();
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String debuggeeMainThreadGroupName = synchronizer.receiveMessage();
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < testedThreadsNumber; i++) {
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( i < (testedThreadsNumber-1) ) {
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                testedThreadsNames[i] = ThreadGroup002Debuggee.THREAD_NAME_PATTERN + i;
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                testedThreadGroupsNames[i] = ThreadGroup002Debuggee.THREAD_GROUP_NAME_PATTERN + (i%2);
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } else {
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                testedThreadsNames[i] = debuggeeMainThreadName;
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                testedThreadGroupsNames[i] = debuggeeMainThreadGroupName;
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            testedThreadsIDs[i] = 0;
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // getting ID of the tested thread
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket allThreadIDReply = null;
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        try {
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            allThreadIDReply = debuggeeWrapper.vmMirror.getAllThreadID();
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (ReplyErrorCodeException exception) {
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                ("## FAILURE: Exception in vmMirror.getAllThreadID() = " + exception);
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            synchronizer.sendMessage("FINISH");
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail("\n## Can NOT get all ThreadID in debuggee! ");
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int threads = allThreadIDReply.getNextValueAsInt();
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==>  Number of all threads in debuggee = " + threads);
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < threads; i++) {
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadID = allThreadIDReply.getNextValueAsThreadID();
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String threadName = null;
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            try {
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                threadName = debuggeeWrapper.vmMirror.getThreadName(threadID);
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } catch (ReplyErrorCodeException exception) {
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    ("==> WARNING: Can NOT get thread name for threadID = " + threadID);
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int k = 0;
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (; k < testedThreadsNumber; k++) {
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( threadName.equals(testedThreadsNames[k]) ) {
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    testedThreadsIDs[k] = threadID;
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    break;
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean testedThreadNotFound = false;
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < testedThreadsNumber; i++) {
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( testedThreadsIDs[i] == 0 ) {
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("## FAILURE: Tested thread is not found out among debuggee threads!");
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("##          Thread name = " + testedThreadsNames[i]);
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                testedThreadNotFound = true;
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( testedThreadNotFound ) {
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            synchronizer.sendMessage("FINISH");
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail("\n## Some of tested threads are not found!");
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> Send signal to debuggee to continue and to finish some first threads...");
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> Wait signal from the debuggee that some first threads finished...");
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String messageFromDebuggee = synchronizer.receiveMessageWithoutException("testThreadGroup002");
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( ! JPDADebuggeeSynchronizer.SGNL_READY.equals(messageFromDebuggee) ) {
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Could NOT receive expected signal from debuggee!");
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail("\n## Could NOT receive expected signal from debuggee! ");
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int finishedTestedThreadsNumber = testedThreadsNumber/2;
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("==> Number of debuggee's finished threads = " +  finishedTestedThreadsNumber);
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = null;
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = null;
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String errorMessage = "";
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean statusCommandFailed = false;
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean threadStatusFailed = false;
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean groupIDFailed = false;
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean threadGroupCommandFailed = false;
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean groupNameFailed = false;
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("\n==> Check that ThreadReference.ThreadGroup command returns expected thread group for each tsted thread...");
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int threadCount = 0; threadCount < testedThreadsNumber; threadCount++) {
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("\n==> Check for Thread: threadID = " + testedThreadsIDs[threadCount]
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + "; threadName = " + testedThreadsNames[threadCount]);
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> Send ThreadReference.Status command...");
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet = new CommandPacket(
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadReferenceCommandSet.StatusCommand);
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsReferenceTypeID(testedThreadsIDs[threadCount]);
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply = debuggeeWrapper.vmMirror.performCommand(packet);
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( ! checkReplyPacketWithoutFail(reply, "ThreadReference.Status command") ) {
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                statusCommandFailed = true;
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int threadStatus = reply.getNextValueAsInt();
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //int suspendStatus =
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> thread status of checked thread = " + threadStatus + "("
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.ThreadStatus.getName(threadStatus) + ")");
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> Send ThreadReference.ThreadGroup command...");
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet = new CommandPacket(
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadReferenceCommandSet.ThreadGroupCommand);
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsThreadID(testedThreadsIDs[threadCount]);
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply = debuggeeWrapper.vmMirror.performCommand(packet);
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( ! checkReplyPacketWithoutFail(reply, "ThreadReference.ThreadGroup command") ) {
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                threadGroupCommandFailed = true;
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadGroupID = reply.getNextValueAsThreadGroupID();
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> thread groupID for checked thread = " + threadGroupID);
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (threadStatus == JDWPConstants.ThreadStatus.ZOMBIE) {
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( threadCount >= finishedTestedThreadsNumber ) {
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## FAILURE: Unexpected status for checked thread!");
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("##          Thread witn number = " + threadCount +
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            " should NOT be ZOMBIE!");
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    threadStatusFailed = true;
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    continue;
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // according to JVMTI spec groupID is NULL if the thread has died
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( threadGroupID != 0 ) {
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## FAILURE: Unexpected thread groupID for checked thread with status = ZOMBIE!");
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("##          Expected thread groupID = 0");
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    groupIDFailed = true;
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } else {
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( threadCount < finishedTestedThreadsNumber ) {
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## FAILURE: Unexpected status for checked thread!");
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("##          Thread witn number = " + threadCount +
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            " should be ZOMBIE!");
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    threadStatusFailed = true;
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    continue;
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( threadGroupID == 0 ) {
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## FAILURE: Unexpected thread groupID for checked thread with status != ZOMBIE!");
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("##          Expected thread groupID != 0");
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    groupIDFailed = true;
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    continue;
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> Getting thread group name by ThreadGroupReference.Name command...");
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet = new CommandPacket(
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadGroupReferenceCommandSet.CommandSetID,
2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    JDWPCommands.ThreadGroupReferenceCommandSet.NameCommand);
2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsThreadID(threadGroupID);
2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply = debuggeeWrapper.vmMirror.performCommand(packet);
2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( ! checkReplyPacketWithoutFail(reply, "ThreadReference.ThreadGroup command") ) {
2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                threadGroupCommandFailed = true;
2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String threadGroupName = reply.getNextValueAsString();
2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("==> thread group name for checked thread = '" + threadGroupName + "'");
2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ( ! testedThreadGroupsNames[threadCount].equals(threadGroupName) ) {
2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("## FAILURE: Unexpected thread group name for checked thread!");
2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("##          Expected thread group name = '" +
2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        testedThreadGroupsNames[threadCount] + "'");
2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                groupNameFailed = true;
2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( statusCommandFailed ) {
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            errorMessage = errorMessage +
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "## Error found out while ThreadReference.Status command performing!\n";
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( threadStatusFailed ) {
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            errorMessage = errorMessage +
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "## Unexpected thread status found out for some tested threads!\n";
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( groupIDFailed ) {
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            errorMessage = errorMessage +
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "## Unexpected thread groupID found out for some tested threads!\n";
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( threadGroupCommandFailed ) {
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            errorMessage = errorMessage +
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "## Error found out while ThreadReference.ThreadGroup command performing!\n";
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( groupNameFailed ) {
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            errorMessage = errorMessage +
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            "## Unexpected thread group name found out for some tested threads!\n";
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> Send signal to debuggee to finish...");
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( ! errorMessage.equals("") ) {
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail("\ntestThreadGroup002 FAILED:\n" + errorMessage);
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> testThreadGroup002 - OK!");
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
292