packet.setNextValueAsThreadID(threadID);
packet.setNextValueAsLong(frameID);
packet.setNextValueAsInt(varTags.length-2);
packet.setNextValueAsInt(varInfos[1].getSlot());
packet.setNextValueAsValue(new Value(false));
packet.setNextValueAsInt(varInfos[2].getSlot());
packet.setNextValueAsValue(new Value((int)12345));
ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
checkReplyPacket(reply, "StackFrame::SetValues command");
//prepare and perform GetValues command
logWriter.println("");
logWriter.println("=> Send StackFrame::GetValues command...");
packet = new CommandPacket(
JDWPCommands.StackFrameCommandSet.CommandSetID,
JDWPCommands.StackFrameCommandSet.GetValuesCommand);
packet.setNextValueAsThreadID(threadID);
packet.setNextValueAsFrameID(frameID);
logWriter.println("=> Thread: " + threadID);
logWriter.println("=> Frame: " + frameID);
packet.setNextValueAsInt(varTags.length);
for (int i = 0; i < varTags.length; i++) {
logWriter.println("");
logWriter.println("=> For variable #"+i+":");
packet.setNextValueAsInt(varInfos[i].getSlot());
logWriter.println("=> Slot = "+varInfos[i].getSlot());
packet.setNextValueAsByte(varTags[i]);
logWriter.println("=> Tag = "+JDWPConstants.Tag.getName(varTags[i]));
logWriter.println("");
}
//check reply for errors
reply = debuggeeWrapper.vmMirror.performCommand(packet);
checkReplyPacket(reply, "StackFrame::GetValues command");
//check number of retrieved values
int numberOfValues = reply.getNextValueAsInt();
logWriter.println("=> Number of values = " + numberOfValues);
if (numberOfValues != varTags.length) {
logWriter.println("##FAILURE: unexpected number of values: "
+ numberOfValues + " instead of "+varTags.length);
assertTrue(false);
}
boolean success = true;
//print and check values of variables
logWriter.println("=> Values of variables: ");
Value val = reply.getNextValueAsValue();
if (val.getTag() == JDWPConstants.Tag.OBJECT_TAG) {
logWriter.println("=> Tag is correct");
logWriter.println("");
} else {
logWriter.printError("Unexpected tag of variable: "
+ JDWPConstants.Tag.getName(val.getTag()) + " instead of: CLASS_OBJECT_TAG");
logWriter.printError("");
success = false;
}
val = reply.getNextValueAsValue();
if (val.getTag() == JDWPConstants.Tag.BOOLEAN_TAG) {
logWriter.println("=>Tag is correct");
boolean boolValue = val.getBooleanValue();
if (!boolValue) {
logWriter.println("=> "+varInfos[1].getName() + " = " + boolValue);
logWriter.println("");
} else {
logWriter
.printError("Unexpected value of boolean variable: "
+ boolValue + " instead of: false");
logWriter.printError("");
success = false;
}
} else {
logWriter.printError("Unexpected tag of variable: "
+ JDWPConstants.Tag.getName(val.getTag()) + " instead of: boolean");
logWriter.printError("");
success = false;
}
val = reply.getNextValueAsValue();
if (val.getTag() == JDWPConstants.Tag.INT_TAG) {
logWriter.println("=>Tag is correct");
int intValue = val.getIntValue();
if (intValue == 12345) {
logWriter.println("=> "+varInfos[2].getName() + " = " + intValue);
logWriter.println("");
} else {
logWriter
.printError("Unexpected value of int variable: "
+ intValue + " instead of: 12345");
logWriter.printError("");
success = false;
}
} else {
logWriter.printError("Unexpected tag of variable: "
+ JDWPConstants.Tag.getName(val.getTag()) + " instead of: integer");
logWriter.printError("");
success = false;
}
val = reply.getNextValueAsValue();
if (val.getTag() == JDWPConstants.Tag.STRING_TAG) {
logWriter.println("=>Tag is correct");
long strLocalVariableID = val.getLongValue();
String strLocalVariable = getStringValue(strLocalVariableID);
if (strLocalVariable.equals("test string")) {
logWriter.println("=> "+varInfos[2].getName() + " = "
+ strLocalVariable);
logWriter.println("");
} else {
logWriter
.printError("Unexpected value of string variable: "
+ strLocalVariable
+ " instead of: "
+ "test string");
logWriter.printError("");
success = false;
}
} else {
logWriter.printError("Unexpected tag of variable: "
+ JDWPConstants.Tag.getName(val.getTag()) + " instead of: string");
logWriter.printError("");
success = false;
}
assertTrue(logWriter.getErrorMessage(), success);
}