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>&nbsp;&nbsp; - suspends thread by ThreadReference.Suspend command;
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - 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