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 Anton V. Karnachuk 21 */ 22 23 /** 24 * Created on 24.02.2005 25 */ 26 package org.apache.harmony.jpda.tests.jdwp.StackFrame; 27 28 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket; 29 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands; 30 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; 31 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 32 import org.apache.harmony.jpda.tests.framework.jdwp.TaggedObject; 33 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 34 35 36 /** 37 * JDWP Unit test for StackFrame.ThisObject command. 38 */ 39 public class ThisObjectTest extends JDWPStackFrameTestCase { 40 41 public static String[] KNOWN_METHOD_NAMES = { 42 "nestledMethod1", 43 "nestledMethod2", 44 "nestledMethod3", 45 }; 46 47 /** 48 * This testcase exercises StackFrame.ThisObject command. 49 * <BR>The test starts StackTraceDebuggee and 50 * checks if StackFrame.ThisObject command returns correct data for each stack frame 51 * of main thread in debuggee, taking into account calls to known methods. 52 */ testThisObjectTest001()53 public void testThisObjectTest001() { 54 logWriter.println("==> ThisObjectTestTest001 started"); 55 //boolean success = true; 56 57 // select main thread 58 String mainThreadName = synchronizer.receiveMessage(); 59 logWriter.println("==> Searching for main thread by name: " + mainThreadName); 60 long mainThread = debuggeeWrapper.vmMirror.getThreadID(mainThreadName); 61 logWriter.println("==> Found main thread: " + mainThread); 62 63 // release on run() 64 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 65 66 // pass nestledMethod1() 67 synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); 68 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 69 70 // pass nestledMethod2() 71 synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); 72 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 73 74 // enter nestledMethod3() 75 synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); 76 77 if ( mainThread == -1 ) { 78 logWriter.println("## FAILURE: main thread is not found!"); 79 //assert True(false); 80 fail("main thread is not found!"); 81 } 82 83 // suspend thread 84 logWriter.println("==> Suspending main thread"); 85 jdwpSuspendThread(mainThread); 86 87 logWriter.println("==> Getting frames count"); 88 int frameCount = jdwpGetFrameCount(mainThread); 89 logWriter.println("==> frames count = " + frameCount); 90 91 logWriter.println("==> Getting frames"); 92 FrameInfo[] frameIDs = jdwpGetFrames(mainThread, 0, frameCount); 93 logWriter.println("==> frames count = " + frameIDs.length); 94 assertEquals("Invalid number of frames,", frameCount, frameIDs.length); 95 //assertTrue(frameIDs.length == frameCount); 96 97 for (int i = 0; i < frameCount; i++) { 98 logWriter.println("\n==> frame #" + i); 99 100 long frameID = frameIDs[i].frameID; 101 logWriter.println("==> frameID=" + frameID); 102 if (frameID == 0) { 103 logWriter.println("## FAILURE: ThreadReference.Frames returned NULL FrameID for frame #" + i); 104 //success = false; 105 fail("ThreadReference.Frames returned NULL FrameID for frame #" + i); 106 continue; 107 } 108 109 // logWriter.println(" location=" + frameIDs[i].location); 110 111 String methodName = debuggeeWrapper.vmMirror.getMethodName(frameIDs[i].location.classID, frameIDs[i].location.methodID); 112 logWriter.println("==> method name=" + methodName); 113 114 String methodSig = debuggeeWrapper.vmMirror.getMethodSignature(frameIDs[i].location.classID, frameIDs[i].location.methodID); 115 logWriter.println("==> method signature=" + methodSig); 116 117 String classSig = debuggeeWrapper.vmMirror.getClassSignature(frameIDs[i].location.classID); 118 logWriter.println("==> class signature=" + classSig); 119 120 // get ThisObject 121 logWriter.println("==> Send StackFrame::ThisObject command..."); 122 CommandPacket packet = new CommandPacket( 123 JDWPCommands.StackFrameCommandSet.CommandSetID, 124 JDWPCommands.StackFrameCommandSet.ThisObjectCommand); 125 packet.setNextValueAsThreadID(mainThread); 126 packet.setNextValueAsLong(frameIDs[i].getFrameID()); 127 128 ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); 129 long knownMethodsThisObject = 0; 130 if (reply.getErrorCode() == JDWPConstants.Error.NONE) { 131 TaggedObject thisObject = reply.getNextValueAsTaggedObject(); 132 logWriter.println("==> thisObject:"); 133 logWriter.println("==> tag=" + thisObject.tag + "(" 134 + JDWPConstants.Tag.getName(thisObject.tag) + ")"); 135 logWriter.println("==> id=" + thisObject.objectID); 136 if (thisObject.objectID != 0) { 137 long classID = getObjectReferenceType(thisObject.objectID); 138 logWriter.println("==> class=" + debuggeeWrapper.vmMirror.getClassSignature(classID)); 139 } 140 141 for (int j = 0; j < KNOWN_METHOD_NAMES.length; j++) { 142 if (KNOWN_METHOD_NAMES[j].equals(methodName)) { 143 logWriter.println("==> frame for known method: " + KNOWN_METHOD_NAMES[j]); 144 if (thisObject.objectID == 0) { 145 logWriter.println 146 ("## FAILURE: StackFrame.ThisObject returned NULL ObjectID for known method: " + methodName); 147 //success = false; 148 fail("StackFrame.ThisObject returned NULL ObjectID for known method: " + methodName); 149 } else { 150 if ( knownMethodsThisObject != 0 ) { 151 if ( knownMethodsThisObject != thisObject.objectID ) { 152 logWriter.println 153 ("## FAILURE: Returned unexpected ObjectID for known method: " + methodName); 154 logWriter.println 155 ("## Expected ObjectID: " + knownMethodsThisObject); 156 //success = false; 157 fail("Returned unexpected ObjectID for known method: " + methodName); 158 } 159 } else { 160 knownMethodsThisObject = thisObject.objectID; 161 } 162 } 163 if (thisObject.tag != JDWPConstants.Tag.OBJECT_TAG) { 164 logWriter.println 165 ("## FAILURE: StackFrame.ThisObject returned not OBJECT_TAG for known method: " + methodName); 166 //success = false; 167 fail("StackFrame.ThisObject returned not OBJECT_TAG for known method: " + methodName); 168 } 169 } 170 } 171 172 String mainMethod = "main"; 173 if (mainMethod.equals(methodName)) { 174 logWriter.println("==> frame for method: " + mainMethod); 175 if (thisObject.objectID != 0) { 176 logWriter.println 177 ("## FAILURE: Returned unexpected ObjectID for method: " + mainMethod); 178 logWriter.println 179 ("## Expected ObjectID: " + 0); 180 //success = false; 181 fail("Returned unexpected ObjectID for method: " + mainMethod); 182 } 183 if (thisObject.tag != JDWPConstants.Tag.OBJECT_TAG) { 184 logWriter.println 185 ("## FAILURE: StackFrame.ThisObject returned not OBJECT_TAG for method: " + mainMethod); 186 //success = false; 187 fail("StackFrame.ThisObject returned not OBJECT_TAG for method: " + mainMethod); 188 } 189 } 190 191 assertAllDataRead(reply); 192 193 } else { 194 logWriter.println 195 ("## FAILURE: StackFrame::ThisObject command returns unexpected ERROR = " 196 + reply.getErrorCode() 197 + "(" + JDWPConstants.Error.getName(reply.getErrorCode()) + ")"); 198 logWriter.println("## Expected ERROR = " + JDWPConstants.Error.NONE 199 + "(" + JDWPConstants.Error.getName(JDWPConstants.Error.NONE) + ")"); 200 //success = false; 201 fail("StackFrame::ThisObject command returns unexpected ERROR = " + reply.getErrorCode() 202 + "(" + JDWPConstants.Error.getName(reply.getErrorCode()) + ")" 203 + ", Expected ERROR = " + JDWPConstants.Error.NONE 204 + "(" + JDWPConstants.Error.getName(JDWPConstants.Error.NONE) + ")"); 205 } 206 } 207 208 // resume thread 209 logWriter.println("==> Resuming main thread"); 210 jdwpResumeThread(mainThread); 211 212 // release nestledMethod3() 213 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 214 215 //assertTrue(success); 216 logWriter.println("==> ThisObjectTestTest001 finished"); 217 } 218 } 219