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 Aleksander V. Budniy 21 22 /** 23 * Created on 15.08.2005 24 */ 25 package org.apache.harmony.jpda.tests.jdwp.StackFrame; 26 27 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket; 28 import org.apache.harmony.jpda.tests.framework.jdwp.Frame; 29 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands; 30 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands.StackFrameCommandSet; 31 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; 32 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 33 import org.apache.harmony.jpda.tests.framework.jdwp.Value; 34 35 import java.util.Arrays; 36 37 /** 38 * JDWP Unit test for StackFrame.SetValues command. 39 */ 40 public class SetValuesTest extends JDWPStackTraceBaseTest { 41 /** 42 * This testcase exercises StackFrame.SetValues command. 43 * <BR>The test starts StackTraceDebuggee, sets breakpoint at the beginning of 44 * the tested method - 'nestledMethod3' and stops at the breakpoint. 45 * <BR> Then the test performs Method.VariableTable command and checks 46 * returned VariableTable. 47 * <BR> Next, the test performs StackFrame.SetValues command and checks 48 * result of this command with help of StackFrame.GetValues command - 49 * returned values of variables should be equal to values which were set. 50 * 51 */ 52 public void testSetValues001() { 53 // Sets and checks local variables of tested method 54 examineGetValues(); 55 } 56 57 /** 58 * This testcase exercises StackFrame.SetValues command. 59 * <BR>The test starts StackTraceDebuggee and waits for it to reach the 60 * tested method - 'nestledMethod3'. 61 * <BR> Then it performs StackFrame.SetValues command with an invalid 62 * thread ID and checks the command returns error INVALID_OBJECT. 63 */ 64 public void testSetValues002_InvalidObjectError() { 65 long invalidThreadID = -1; 66 logWriter.println("Send StackFrame.SetValues with invalid thread " + invalidThreadID); 67 CommandPacket packet = new CommandPacket(StackFrameCommandSet.CommandSetID, 68 StackFrameCommandSet.SetValuesCommand); 69 packet.setNextValueAsThreadID(invalidThreadID); 70 packet.setNextValueAsFrameID(0); 71 packet.setNextValueAsInt(0); 72 ReplyPacket replyPacket = debuggeeWrapper.vmMirror.performCommand(packet); 73 checkReplyPacket(replyPacket, "StackFrame.SetValues", 74 JDWPConstants.Error.INVALID_OBJECT); 75 } 76 77 /** 78 * This testcase exercises StackFrame.SetValues command. 79 * <BR>The test starts StackTraceDebuggee and waits for it to reach the 80 * tested method - 'nestledMethod3'. 81 * <BR> Then it performs StackFrame.SetValues command to a non-suspended 82 * thread and checks the command returns error THREAD_NOT_SUSPENDED. 83 */ 84 public void testSetValues003_ThreadNotSuspendedError() { 85 long threadID = getThreadID(); 86 87 CommandPacket packet = new CommandPacket(StackFrameCommandSet.CommandSetID, 88 StackFrameCommandSet.SetValuesCommand); 89 packet.setNextValueAsThreadID(threadID); 90 packet.setNextValueAsFrameID(0); 91 packet.setNextValueAsInt(0); 92 ReplyPacket replyPacket = debuggeeWrapper.vmMirror.performCommand(packet); 93 checkReplyPacket(replyPacket, "StackFrame.SetValues", 94 JDWPConstants.Error.THREAD_NOT_SUSPENDED); 95 } 96 97 /** 98 * This testcase exercises StackFrame.SetValues command. 99 * <BR>The test starts StackTraceDebuggee and waits for it to reach the 100 * tested method - 'nestledMethod3'. 101 * <BR> Then it performs StackFrame.SetValues command to an invalid 102 * frame ID and checks the command returns error INVALID_FRAMEID. 103 */ 104 public void testSetValues004_InvalidFrameIDError() { 105 long threadID = getThreadID(); 106 107 // suspend thread 108 jdwpSuspendThread(threadID); 109 110 long invalidFrameID = -1; 111 logWriter.println("Send StackFrame.SetValues with invalid frameID " + invalidFrameID); 112 CommandPacket packet = new CommandPacket(StackFrameCommandSet.CommandSetID, 113 StackFrameCommandSet.SetValuesCommand); 114 packet.setNextValueAsThreadID(threadID); 115 packet.setNextValueAsFrameID(invalidFrameID); 116 packet.setNextValueAsInt(0); 117 ReplyPacket replyPacket = debuggeeWrapper.vmMirror.performCommand(packet); 118 checkReplyPacket(replyPacket, "StackFrame.SetValues", 119 JDWPConstants.Error.INVALID_FRAMEID); 120 } 121 122 /** 123 * This testcase exercises StackFrame.SetValues command. 124 * <BR>The test starts StackTraceDebuggee and waits for it to reach the 125 * tested method - 'nestledMethod3'. 126 * <BR> Then it performs StackFrame.SetValues command to an invalid 127 * slot ID and checks the command returns error INVALID_SLOT. 128 */ 129 public void testSetValues005_InvalidSlotError() { 130 //sets and checks local variables of tested method 131 132 long threadID = getThreadID(); 133 134 // suspend thread 135 jdwpSuspendThread(threadID); 136 137 FrameInfo frameInfo = findFrameInfo(threadID); 138 139 //getting Variable Table 140 logWriter.println(""); 141 logWriter.println("=> Getting Variable Table..."); 142 long refTypeID = getClassIDBySignature(getDebuggeeClassSignature()); 143 logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); 144 logWriter.println("=> referenceTypeID for Debuggee class = " 145 + refTypeID); 146 varInfos = jdwpGetVariableTable(refTypeID, frameInfo.location.methodID); 147 if (GetValuesTest.checkVarTable(logWriter, varInfos, varTags, varSignatures, varNames)) { 148 logWriter.println("=> Variable table check passed."); 149 } else { 150 printErrorAndFail("Variable table check failed."); 151 } 152 153 int invalidSlotId = -1; 154 logWriter.println("Send StackFrame.SetValues with invalid slot " + invalidSlotId); 155 CommandPacket packet = new CommandPacket(StackFrameCommandSet.CommandSetID, 156 StackFrameCommandSet.SetValuesCommand); 157 packet.setNextValueAsThreadID(threadID); 158 packet.setNextValueAsFrameID(frameInfo.frameID); 159 packet.setNextValueAsInt(1); 160 packet.setNextValueAsInt(invalidSlotId); 161 packet.setNextValueAsByte(JDWPConstants.Tag.OBJECT_TAG); 162 packet.setNextValueAsObjectID(0 /* null */); 163 ReplyPacket replyPacket = debuggeeWrapper.vmMirror.performCommand(packet); 164 checkReplyPacket(replyPacket, "StackFrame.SetValues", 165 JDWPConstants.Error.INVALID_SLOT); 166 } 167 168 private void examineGetValues() { 169 long refTypeID = getClassIDBySignature(getDebuggeeClassSignature()); 170 logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); 171 logWriter.println("=> referenceTypeID for Debuggee class = " 172 + refTypeID); 173 long threadID = debuggeeWrapper.vmMirror.getThreadID(testedThreadName); 174 175 logWriter.println("=> testedThreadID = " + threadID); 176 if (threadID == -1) { 177 printErrorAndFail("testedThread is not found!"); 178 } 179 180 // suspend thread 181 jdwpSuspendThread(threadID); 182 183 // find frame for the tested method 184 FrameInfo frameInfo = findFrameInfo(threadID); 185 186 //getting Variable Table 187 logWriter.println(""); 188 logWriter.println("=> Getting Variable Table..."); 189 varInfos = jdwpGetVariableTable(refTypeID, frameInfo.location.methodID); 190 if (checkVarTable(logWriter, varInfos, varTags, varSignatures, varNames)) { 191 logWriter.println("=> Variable table check passed."); 192 } else { 193 printErrorAndFail("Variable table check failed."); 194 } 195 196 //prepare and perform SetValues command 197 logWriter.println(""); 198 logWriter.println("==> Send StackFrame::SetValues command..."); 199 CommandPacket packet = new CommandPacket( 200 JDWPCommands.StackFrameCommandSet.CommandSetID, 201 JDWPCommands.StackFrameCommandSet.SetValuesCommand); 202 packet.setNextValueAsThreadID(threadID); 203 packet.setNextValueAsFrameID(frameInfo.frameID); 204 205 packet.setNextValueAsInt(varTags.length-2); 206 packet.setNextValueAsInt(varInfoByName("boolLocalVariable").getSlot()); 207 packet.setNextValueAsValue(Value.createBoolean(false)); 208 packet.setNextValueAsInt(varInfoByName("intLocalVariable").getSlot()); 209 packet.setNextValueAsValue(Value.createInt(12345)); 210 211 ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); 212 checkReplyPacket(reply, "StackFrame::SetValues command"); 213 214 //prepare and perform GetValues command 215 logWriter.println(""); 216 logWriter.println("=> Send StackFrame::GetValues command..."); 217 packet = new CommandPacket( 218 JDWPCommands.StackFrameCommandSet.CommandSetID, 219 JDWPCommands.StackFrameCommandSet.GetValuesCommand); 220 packet.setNextValueAsThreadID(threadID); 221 packet.setNextValueAsFrameID(frameInfo.frameID); 222 223 logWriter.println("=> Thread: " + threadID); 224 logWriter.println("=> Frame: " + frameInfo.frameID); 225 packet.setNextValueAsInt(varTags.length); 226 for (int i = 0; i < varTags.length; i++) { 227 logWriter.println(""); 228 logWriter.println("=> For variable #"+i+" " + varInfos[i].getName() + ":"); 229 packet.setNextValueAsInt(varInfos[i].getSlot()); 230 logWriter.println("=> Slot = "+varInfos[i].getSlot()); 231 byte tag = varTags[Arrays.asList(varNames).indexOf(varInfos[i].getName())]; 232 packet.setNextValueAsByte(tag); 233 logWriter.println("=> Tag = "+JDWPConstants.Tag.getName(tag)); 234 logWriter.println(""); 235 } 236 237 //check reply for errors 238 reply = debuggeeWrapper.vmMirror.performCommand(packet); 239 checkReplyPacket(reply, "StackFrame::GetValues command"); 240 241 //check number of retrieved values 242 int numberOfValues = reply.getNextValueAsInt(); 243 logWriter.println("=> Number of values = " + numberOfValues); 244 if (numberOfValues != varTags.length) { 245 logWriter.println("##FAILURE: unexpected number of values: " 246 + numberOfValues + " instead of "+varTags.length); 247 assertTrue(false); 248 } 249 250 boolean success = true; 251 //print and check values of variables 252 logWriter.println("=> Values of variables: "); 253 254 for (int i = 0; i < numberOfValues; ++i ) { 255 Value val = reply.getNextValueAsValue(); 256 switch (val.getTag()) { 257 case JDWPConstants.Tag.BOOLEAN_TAG: { 258 logWriter.println("=>Tag is correct"); 259 boolean boolValue = val.getBooleanValue(); 260 if (!boolValue) { 261 logWriter.println("=> "+varInfos[1].getName() + " = " + boolValue); 262 logWriter.println(""); 263 } else { 264 logWriter 265 .printError("Unexpected value of boolean variable: " 266 + boolValue + " instead of: false"); 267 logWriter.printError(""); 268 success = false; 269 } 270 break; 271 } 272 273 case JDWPConstants.Tag.INT_TAG: { 274 logWriter.println("=>Tag is correct"); 275 int intValue = val.getIntValue(); 276 if (intValue == 12345) { 277 logWriter.println("=> "+varInfos[2].getName() + " = " + intValue); 278 logWriter.println(""); 279 } else { 280 logWriter 281 .printError("Unexpected value of int variable: " 282 + intValue + " instead of: 12345"); 283 logWriter.printError(""); 284 success = false; 285 } 286 break; 287 } 288 289 case JDWPConstants.Tag.STRING_TAG: { 290 logWriter.println("=>Tag is correct"); 291 long strLocalVariableID = val.getLongValue(); 292 String strLocalVariable = getStringValue(strLocalVariableID); 293 if (strLocalVariable.equals("test string")) { 294 logWriter.println("=> "+varInfos[2].getName() + " = " 295 + strLocalVariable); 296 logWriter.println(""); 297 } else { 298 logWriter 299 .printError("Unexpected value of string variable: " 300 + strLocalVariable 301 + " instead of: " 302 + "test string"); 303 logWriter.printError(""); 304 success = false; 305 } 306 break; 307 } 308 309 case JDWPConstants.Tag.OBJECT_TAG: { 310 logWriter.println("=> Tag is correct"); 311 logWriter.println(""); 312 break; 313 } 314 default: 315 logWriter.printError("Unexpected tag of variable: " 316 + JDWPConstants.Tag.getName(val.getTag())); 317 logWriter.printError(""); 318 success = false; 319 break; 320 } // switch 321 } // for 322 323 assertTrue(logWriter.getErrorMessage(), success); 324 } 325 326 private Frame.Variable varInfoByName(String name) { 327 for (int i = 0; i < varInfos.length; ++i) { 328 if (varInfos[i].getName().equals(name)) { 329 return varInfos[i]; 330 } 331 } 332 return null; 333 } 334 } 335