Home | History | Annotate | Download | only in StackFrame
      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