IsCollectedTest.java revision 37b95e332fe4d776e33e64f0fa1980fb4f7a83e0
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *
15 *  See the License for the specific language governing permissions and
16 *  limitations under the License.
17 */
18
19/**
20 * @author Anatoly F. Bondarenko
21 */
22
23/**
24 * Created on 05.03.2005
25 */
26package org.apache.harmony.jpda.tests.jdwp.ObjectReference;
27
28import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
29import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
30import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
31import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
32import org.apache.harmony.jpda.tests.framework.jdwp.Value;
33import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
34import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
35
36
37/**
38 * JDWP Unit test for ObjectReference.IsCollected command.
39 */
40public class IsCollectedTest extends JDWPSyncTestCase {
41
42    static final String thisCommandName = "ObjectReference.IsCollected command";
43
44    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/IsCollectedDebuggee;";
45
46    protected String getDebuggeeClassName() {
47        return "org.apache.harmony.jpda.tests.jdwp.ObjectReference.IsCollectedDebuggee";
48    }
49
50    /**
51     * This test exercises ObjectReference.IsCollected command.
52     * <BR>The test starts IsCollectedDebuggee class, gets two
53     * objectIDs as value of static fields of this class which (fields)
54     * represent two checked objects. Then for the first objectID test executes
55     * ObjectReference.DisableCollection command. After that Debuggee tries to
56     * unload checked objects. Then the test executes
57     * ObjectReference.IsCollected commands for both checked objects and checks
58     * replies.
59     */
60    public void testIsCollected001() {
61        String thisTestName = "testIsCollected001";
62        logWriter.println("==> " + thisTestName + " for " + thisCommandName
63                + ": START...");
64        String failMessage = "";
65        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
66        finalSyncMessage = "TO_FINISH";
67
68        long refTypeID = getClassIDBySignature(debuggeeSignature);
69
70        logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
71        logWriter.println("=> referenceTypeID for Debuggee class = "
72                + refTypeID);
73
74        String checkedFieldNames[] = { "checkedObject_01", "checkedObject_02", };
75        long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames);
76        long checkedField_01ID = checkedFieldIDs[0];
77        long checkedField_02ID = checkedFieldIDs[1];
78
79        logWriter
80                .println("=> Send ReferenceType::GetValues command for received fieldIDs and get ObjectIDs to check...");
81
82        CommandPacket getValuesCommand = new CommandPacket(
83                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
84                JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand);
85        getValuesCommand.setNextValueAsReferenceTypeID(refTypeID);
86        getValuesCommand.setNextValueAsInt(2);
87        getValuesCommand.setNextValueAsFieldID(checkedField_01ID);
88        getValuesCommand.setNextValueAsFieldID(checkedField_02ID);
89
90        ReplyPacket getValuesReply = debuggeeWrapper.vmMirror
91                .performCommand(getValuesCommand);
92        getValuesCommand = null;
93        checkReplyPacket(getValuesReply, "ReferenceType::GetValues command");
94
95        int returnedValuesNumber = getValuesReply.getNextValueAsInt();
96        logWriter
97                .println("=> Returned values number = " + returnedValuesNumber);
98        assertEquals("Invalid number of values,", 2, returnedValuesNumber);
99
100        Value checkedObjectFieldValue = getValuesReply.getNextValueAsValue();
101        byte checkedObjectFieldTag = checkedObjectFieldValue.getTag();
102        logWriter.println("=> Returned field value tag for checkedObject_01 = "
103                + checkedObjectFieldTag + "("
104                + JDWPConstants.Tag.getName(checkedObjectFieldTag) + ")");
105        assertEquals("Invalid value tag for checkedObject_01",
106                JDWPConstants.Tag.OBJECT_TAG, checkedObjectFieldTag,
107                JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG),
108                JDWPConstants.Tag.getName(checkedObjectFieldTag));
109
110        long checkedObject_01ID = checkedObjectFieldValue.getLongValue();
111        logWriter.println("=> Returned ObjectID for checkedObject_01 = "
112                + checkedObject_01ID);
113
114        checkedObjectFieldValue = getValuesReply.getNextValueAsValue();
115        checkedObjectFieldTag = checkedObjectFieldValue.getTag();
116        logWriter.println("=> Returned field value tag for checkedObject_02 = "
117                + checkedObjectFieldTag + "("
118                + JDWPConstants.Tag.getName(checkedObjectFieldTag) + ")");
119        assertEquals("Invalid value tag for checkedObject_02",
120                JDWPConstants.Tag.OBJECT_TAG, checkedObjectFieldTag,
121                JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG),
122                JDWPConstants.Tag.getName(checkedObjectFieldTag));
123
124        long checkedObject_02ID = checkedObjectFieldValue.getLongValue();
125        logWriter.println("=> Returned ObjectID for checkedObject_02 = "
126                + checkedObject_02ID);
127
128        logWriter
129                .println("\n=> Send ObjectReference::DisableCollection command for checkedObject_01...");
130
131        CommandPacket disableCollectionCommand = new CommandPacket(
132                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
133                JDWPCommands.ObjectReferenceCommandSet.DisableCollectionCommand);
134        disableCollectionCommand.setNextValueAsObjectID(checkedObject_01ID);
135
136        ReplyPacket disableCollectionReply = debuggeeWrapper.vmMirror
137                .performCommand(disableCollectionCommand);
138        disableCollectionCommand = null;
139        checkReplyPacket(disableCollectionReply,
140                "ObjectReference::DisableCollection command");
141
142        logWriter
143                .println("=> Send to Debuggee signal to continue and try to unload checked objects...");
144        finalSyncMessage = null;
145        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
146        String messageFromDebuggee = synchronizer.receiveMessage();
147        logWriter.println("\n=> Received message from Debuggee = \""
148                + messageFromDebuggee + "\"");
149
150        logWriter.println("\n=> Send " + thisCommandName
151                + " for checkedObject_01 and check reply...");
152
153        CommandPacket checkedCommand = new CommandPacket(
154                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
155                JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand);
156        checkedCommand.setNextValueAsObjectID(checkedObject_01ID);
157
158        ReplyPacket checkedReply = debuggeeWrapper.vmMirror
159                .performCommand(checkedCommand);
160        checkedCommand = null;
161        checkReplyPacket(checkedReply, thisCommandName);
162
163        boolean checkedObject_01_IsCollected = checkedReply
164                .getNextValueAsBoolean();
165        logWriter.println("=> IsCollected for checkedObject_01 = "
166                + checkedObject_01_IsCollected);
167
168        if (messageFromDebuggee.indexOf("checkedObject_01 is UNLOADed;") != -1) {
169            if (!checkedObject_01_IsCollected) {
170                logWriter
171                        .println("## FAILURE: Unexpected result for checkedObject_01 of "
172                                + thisCommandName + ":");
173                logWriter
174                        .println("## checkedObject_01 is UNLOADed so IsCollected must be 'true'");
175                failMessage = failMessage +
176                    "Unexpected result for checkedObject_01 of "
177                    + thisCommandName + "\n";
178            }
179        } else {
180            if (checkedObject_01_IsCollected) {
181                logWriter
182                        .println("## FAILURE: Unexpected result for checkedObject_01 of "
183                                + thisCommandName + ":");
184                logWriter
185                        .println("## checkedObject_01 is NOT UNLOADed so IsCollected must be 'false'");
186                failMessage = failMessage +
187                    "Unexpected result for checkedObject_01 of "
188                    + thisCommandName + "\n";
189            }
190        }
191
192        logWriter.println("=> PASSED for checkedObject_01");
193
194        logWriter.println("\n=> Send " + thisCommandName
195                + " for checkedObject_02 and check reply...");
196
197        checkedCommand = new CommandPacket(
198                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
199                JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand);
200        checkedCommand.setNextValueAsObjectID(checkedObject_02ID);
201
202        checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
203        checkedCommand = null;
204        checkReplyPacket(checkedReply, thisCommandName);
205
206        boolean checkedObject_02_IsCollected = checkedReply
207                .getNextValueAsBoolean();
208        logWriter.println("=> IsCollected for checkedObject_02 = "
209                + checkedObject_02_IsCollected);
210
211        if (messageFromDebuggee.indexOf("checkedObject_02 is UNLOADed;") != -1) {
212            if (!checkedObject_02_IsCollected) {
213                logWriter
214                        .println("## FAILURE: Unexpected result for checkedObject_02 of "
215                                + thisCommandName + ":");
216                logWriter
217                        .println("## checkedObject_02 is UNLOADed so IsCollected must be 'true'");
218                failMessage = failMessage +
219                    "Unexpected result for checkedObject_02 of "
220                    + thisCommandName + "\n";
221            }
222        } else {
223            if (checkedObject_02_IsCollected) {
224                logWriter
225                        .println("## FAILURE: Unexpected result for checkedObject_02 of "
226                                + thisCommandName + ":");
227                logWriter
228                        .println("## checkedObject_02 is NOT UNLOADed so IsCollected must be 'false'");
229                failMessage = failMessage +
230                    "Unexpected result for checkedObject_02 of "
231                    + thisCommandName + "\n";
232            }
233        }
234
235        logWriter.println("=> PASSED for checkedObject_02");
236        logWriter.println("=> Send to Debuggee signal to funish ...");
237        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
238        logWriter.println("==> " + thisTestName + " for " + thisCommandName
239                + ": FINISH");
240
241        if (failMessage.length() > 0) {
242            fail(failMessage);
243        }
244
245        assertAllDataRead(checkedReply);
246    }
247
248    /**
249     * This testcase exercises ObjectReference.IsCollected command.
250     * <BR>The test starts IsCollectedDebuggee class. Then attempts to know
251     * if an invalid objectID is collected and checks INVALID_OBJECT is
252     * returned.
253     */
254    public void testIsCollected002() {
255        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
256
257        long invalidObjectID = 0xdead;
258
259        CommandPacket command = new CommandPacket(
260                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
261                JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand);
262        command.setNextValueAsObjectID(invalidObjectID);
263
264        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
265        checkReplyPacket(reply, thisCommandName, JDWPConstants.Error.INVALID_OBJECT);
266
267        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
268    }
269
270    /**
271     * This testcase exercises ObjectReference.IsCollected command.
272     * <BR>The test starts IsCollectedDebuggee class. Then attempts to know
273     * if "null" object (id=0) is collected and checks INVALID_OBJECT is
274     * returned.
275     */
276    public void testIsCollected003() {
277        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
278
279        long invalidObjectID = 0xdead;
280
281        CommandPacket command = new CommandPacket(
282                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
283                JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand);
284        command.setNextValueAsObjectID(invalidObjectID);
285
286        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
287        checkReplyPacket(reply, thisCommandName, JDWPConstants.Error.INVALID_OBJECT);
288
289        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
290    }
291}
292