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 Vitaly A. Provodin 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 15.02.2005 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/** 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP Unit test for ThreadReference.Suspend command. 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class SuspendTest extends JDWPSyncTestCase { 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final int testStatusPassed = 0; 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final int testStatusFailed = -1; 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected String getDebuggeeClassName() { 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return "org.apache.harmony.jpda.tests.jdwp.ThreadReference.SuspendDebuggee"; 475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This testcase exercises ThreadReference.Suspend command. 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR>At first the test starts SuspendDebuggee which starts and runs some tested threads. 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR>After the tested threads starts, the test for every tested thread does: 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR> - suspends thread by ThreadReference.Suspend command; 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR> - performs the ThreadReference.Status command for tested thread; 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR>It is expected that for every tested thread returned suspend 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * status is SUSPEND_STATUS_SUSPENDED status; 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public void testSuspend001() { 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> testSuspend001: START..."); 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String debuggeeMessage = synchronizer.receiveMessage(); 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int testedThreadsNumber = 0; 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testedThreadsNumber = Integer.valueOf(debuggeeMessage).intValue(); 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (NumberFormatException exception) { 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("## FAILURE: Exception while getting number of started threads from debuggee = " + exception); 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes printErrorAndFail("Can NOT get number of started threads from debuggee! "); 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( testedThreadsNumber == 0 ) { 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> There are no started threads in debuggee to test!"); 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return; 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> Number of started threads in debuggee to test = " + testedThreadsNumber); 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String[] testedThreadsNames = new String[testedThreadsNumber]; 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long[] testedThreadsIDs = new long[testedThreadsNumber]; 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int i = 0; i < testedThreadsNumber; i++) { 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testedThreadsNames[i] = SuspendDebuggee.THREAD_NAME_PATTERN + i; 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testedThreadsIDs[i] = 0; 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // getting ID of the tested thread 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ReplyPacket allThreadIDReply = null; 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes allThreadIDReply = debuggeeWrapper.vmMirror.getAllThreadID(); 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (ReplyErrorCodeException exception) { 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("## FAILURE: Exception in vmMirror.getAllThreadID() = " + exception); 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes printErrorAndFail("Can NOT get all ThreadID in debuggee! "); 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int threads = allThreadIDReply.getNextValueAsInt(); 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> Number of all threads in debuggee = " + threads); 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean suspendCommandFailed = false; 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean statusCommandFailed = false; 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean suspendStatusFailed = false; 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean resumeThreadFailed = false; 965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int i = 0; i < threads; i++) { 985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long threadID = allThreadIDReply.getNextValueAsThreadID(); 995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String threadName = null; 1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes threadName = debuggeeWrapper.vmMirror.getThreadName(threadID); 1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (ReplyErrorCodeException exception) { 1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("==> WARNING: Can NOT get thread name for threadID = " + threadID); 1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int k = 0; 1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (; k < testedThreadsNumber; k++) { 1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( threadName.equals(testedThreadsNames[k]) ) { 1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testedThreadsIDs[k] = threadID; 1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes break; 1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( k == testedThreadsNumber ) { 1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // it is not thread to test 1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n==> Check for Thread: threadID = " + threadID 1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + "; threadName = " + threadName); 1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // suspending the thread 1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> Send ThreadReference.Suspend command..."); 1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes CommandPacket packet = new CommandPacket( 1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ThreadReferenceCommandSet.CommandSetID, 1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ThreadReferenceCommandSet.SuspendCommand); 1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes packet.setNextValueAsThreadID(threadID); 1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); 1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! checkReplyPacketWithoutFail(reply, "ThreadReference.Suspend command") ) { 1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes suspendCommandFailed = true; 1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> Send ThreadReference.Status command..."); 1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes packet = new CommandPacket( 1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ThreadReferenceCommandSet.CommandSetID, 1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ThreadReferenceCommandSet.StatusCommand); 1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes packet.setNextValueAsReferenceTypeID(threadID); 1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reply = debuggeeWrapper.vmMirror.performCommand(packet); 1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! checkReplyPacketWithoutFail(reply, "ThreadReference.Status command") ) { 1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes statusCommandFailed = true; 1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int threadStatus = reply.getNextValueAsInt(); 1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int suspendStatus = reply.getNextValueAsInt(); 1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> threadStatus = " + threadStatus + "(" 1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + JDWPConstants.ThreadStatus.getName(threadStatus) + ")"); 1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> suspendStatus = " + suspendStatus + "(" 1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + JDWPConstants.SuspendStatus.getName(suspendStatus) + ")"); 1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (suspendStatus 1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes != JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED) { 1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## FAILURE: Unexpected suspendStatus for thread = " + threadName); 1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Expected suspendStatus = " 1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED 1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + "(" + JDWPConstants.SuspendStatus.getName 1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes (JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED) +")"); 1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes suspendStatusFailed = true; 1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // resuming the thread 1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int resumeErr = debuggeeWrapper.vmMirror.resumeThread(threadID).getErrorCode(); 1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (resumeErr != JDWPConstants.Error.NONE) { 1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## FAILURE: Can NOT resume thread = " + threadName); 1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Received ERROR while resume thread = " + resumeErr 1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes + "(" + JDWPConstants.Error.getName(resumeErr) +")"); 1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes resumeThreadFailed = true; 1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String errorMessage = ""; 1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( suspendCommandFailed ) { 1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes errorMessage = "## Error found out while ThreadReference.Suspend command performing!\n"; 1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( statusCommandFailed ) { 1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes errorMessage = errorMessage + "## Error found out while ThreadReference.Status command performing!\n"; 1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( suspendStatusFailed ) { 1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes errorMessage = errorMessage + "## Unexpected suspendStatus found out!\n"; 1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( resumeThreadFailed ) { 1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes errorMessage = errorMessage + "## Error found out while resuming thread!\n"; 1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean testedThreadNotFound = false; 1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int i = 0; i < testedThreadsNumber; i++) { 1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( testedThreadsIDs[i] == 0 ) { 1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## FAILURE: Tested thread is not found out among debuggee threads!"); 1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Thread name = " + testedThreadsNames[i]); 1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testedThreadNotFound = true; 1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( testedThreadNotFound ) { 1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes errorMessage = errorMessage + "## Some of tested threads are not found!\n"; 1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! errorMessage.equals("") ) { 2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes printErrorAndFail("\ntestSuspend001 FAILED:\n" + errorMessage); 2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n==> testSuspend001 - OK!"); 2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 207