summaryrefslogtreecommitdiff
path: root/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ThreadGroupReference/ChildrenTest.java
blob: 964115a6e3fdf9e8cae1c47ada784680981e1d35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * @author Vitaly A. Provodin
 */

/**
 * Created on 25.02.2005
 */
package org.apache.harmony.jpda.tests.jdwp.ThreadGroupReference;

import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
import org.apache.harmony.jpda.tests.jdwp.share.JDWPTestConstants;
import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;


/**
 * JDWP Unit test for ThreadGroupReference.Children command.
 */
public class ChildrenTest extends JDWPSyncTestCase {


    @Override
    protected String getDebuggeeClassName() {
        return "org.apache.harmony.jpda.tests.jdwp.ThreadGroupReference.ChildrenDebuggee";
    }

    /**
     * This testcase exercises ThreadGroupReference.Children command.
     * <BR>At first the test starts ChildrenDebuggee.
     * <BR> Then the test with help of the ThreadGroupReference.Children command checks
     * that the group 'PARENT_GROUP' has one child thread - 'TESTED_THREAD'
     * and one child group - 'CHILD_GROUP'.
     *
     */
    public void testChildren001() {
        logWriter.println("==> ChildrenTest.testChildren001 START...");
        logWriter.println("==> Wait for SGNL_READY...");
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        // getting ID of the tested thread
        logWriter.println("==> Get testedThreadID...");
        CommandPacket packet;
        long threadID = debuggeeWrapper.vmMirror.getThreadID(NameDebuggee.TESTED_THREAD);
        logWriter.println("==> testedThreadID = " + threadID);

        long groupID;
        String groupName;

        // getting the thread group ID
        logWriter.println("==> Send ThreadReference.ThreadGroup command for testedThreadID...");
        packet = new CommandPacket(
                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
                JDWPCommands.ThreadReferenceCommandSet.ThreadGroupCommand);
        packet.setNextValueAsThreadID(threadID);
        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
        checkReplyPacket(reply, "ThreadReference.ThreadGroup command");

        groupID = reply.getNextValueAsThreadGroupID();
        logWriter.println("==> groupID = " + groupID);

        logWriter.println("==> Send ThreadGroupReference.Children command...");
        packet = new CommandPacket(
                JDWPCommands.ThreadGroupReferenceCommandSet.CommandSetID,
                JDWPCommands.ThreadGroupReferenceCommandSet.ChildrenCommand);
        packet.setNextValueAsThreadID(groupID);
        reply = debuggeeWrapper.vmMirror.performCommand(packet);
        checkReplyPacket(reply, "ThreadGroupReference.Children command");

        logWriter.println("\n==> Children of the group: \""
                + debuggeeWrapper.vmMirror.getThreadGroupName(groupID)
                + "\": ");

        int childThreads = reply.getNextValueAsInt();
        if (childThreads != 1) {
            logWriter.println("## FAILURE: Unexpected number of child threads = " + childThreads);
            logWriter.println("## Expected number of child threads = 1");
            assertEquals("Invalid number of child threads,", 1, childThreads);
        }
        long childThreadID = reply.getNextValueAsThreadID();
        String threadName = debuggeeWrapper.vmMirror.getThreadName(childThreadID);
        logWriter.println
        ("==> thread: threadID = " + childThreadID + "; threadName = " + threadName);

        if (threadID != childThreadID) {
            logWriter.println("## FAILURE: Unexpected ID of child thread = " + childThreadID);
            logWriter.println("## Expected ID of child thread = " + threadID);
            assertEquals("Invalid ID of child thread,", threadID, childThreadID);
        }
        if (!threadName.equals(NameDebuggee.TESTED_THREAD)) {
            logWriter.println("## FAILURE: unexpected thread name, it is expected: "
                    + NameDebuggee.TESTED_THREAD);
            assertString("Invalid thread name,", NameDebuggee.TESTED_THREAD, threadName);
        }

        int childGroups = reply.getNextValueAsInt();
        if (childGroups != 1) {
            logWriter.println("## FAILURE: Unexpected number of child groups " + childGroups);
            logWriter.println("## Expected number = 1");
            assertEquals("Invalid number of child groups,", 1, childGroups);
        }

        groupID = reply.getNextValueAsThreadGroupID();
        groupName = debuggeeWrapper.vmMirror.getThreadGroupName(groupID);

        logWriter.println("\n==> group: groupID = " + groupID + "; groupName = " + groupName);

        assertString("Invalid group name,", NameDebuggee.CHILD_GROUP, groupName);

        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
    }

    /**
     * This testcase exercises ThreadGroupReference.Children command.
     * <BR>At first the test starts NameDebuggee.
     * <BR> Then the test with help of the ThreadGroupReference.Children command
     * checks that INVALID_OBJECT error is returned for the null object id.
     *
     */
    public void testChildren_NullObject() {
        logWriter.println("wait for SGNL_READY");
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        checkCommandError(JDWPTestConstants.NULL_OBJECT_ID,
                          JDWPConstants.Error.INVALID_OBJECT);

        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
    }

    /**
     * This testcase exercises ThreadGroupReference.Children command.
     * <BR>At first the test starts NameDebuggee.
     * <BR> Then the test with help of the ThreadGroupReference.Children command
     * checks that INVALID_OBJECT error is returned for an invalid object id.
     *
     */
    public void testChildren_InvalidObject() {
        logWriter.println("wait for SGNL_READY");
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        checkCommandError(JDWPTestConstants.INVALID_OBJECT_ID,
                          JDWPConstants.Error.INVALID_OBJECT);

        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
    }

    /**
     * This testcase exercises ThreadGroupReference.Children command.
     * <BR>At first the test starts NameDebuggee.
     * <BR> Then the test with help of the ThreadGroupReference.Children command
     * checks that INVALID_THREAD_GROUP error is returned for an object that is
     * not a java.lang.ThreadGroup.
     *
     */
    public void testChildren_InvalidThreadGroup() {
        logWriter.println("wait for SGNL_READY");
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        long threadID = debuggeeWrapper.vmMirror.getThreadID(NameDebuggee.TESTED_THREAD);

        checkCommandError(threadID, JDWPConstants.Error.INVALID_THREAD_GROUP);

        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
    }

    private void checkCommandError(long groupID, int expectedError) {
        logWriter.println("Send ThreadGroupReference.Children command with id " + groupID);

        CommandPacket packet = new CommandPacket(
                JDWPCommands.ThreadGroupReferenceCommandSet.CommandSetID,
                JDWPCommands.ThreadGroupReferenceCommandSet.ChildrenCommand);
        packet.setNextValueAsThreadGroupID(groupID);
        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);

        checkReplyPacket(reply, "ThreadGroupReference::Name command",
                         expectedError);
    }

}