Home | History | Annotate | Download | only in Events
      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 06.10.2006
     25  */
     26 package org.apache.harmony.jpda.tests.jdwp.Events;
     27 
     28 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
     29 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
     30 import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
     31 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
     32 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
     33 import org.apache.harmony.jpda.tests.framework.jdwp.Location;
     34 import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
     35 
     36 /**
     37  * CombinedEventsTestCase class provides auxiliary methods
     38  * for JDWP unit tests for Co-located events.
     39  */
     40 public abstract class CombinedEventsTestCase extends JDWPSyncTestCase {
     41 
     42     static Object waitTimeObject = new Object();
     43     static protected void waitMlsecsTime(long mlsecsTime) {
     44         synchronized(waitTimeObject) {
     45             try {
     46                 waitTimeObject.wait(mlsecsTime);
     47             } catch (Throwable throwable) {
     48                  // ignore
     49             }
     50         }
     51     }
     52 
     53     void printMethodLineTable(long classID, String className /* may be null */, String methodName) {
     54         long methodID = debuggeeWrapper.vmMirror.getMethodID(classID, methodName);
     55         if ( methodID == -1 ) {
     56             logWriter.println
     57             ("## printMethodLineTable(): Can NOT get methodID for classID = "
     58                     + classID + "; Method name = " + methodName);
     59             return;
     60         }
     61 
     62         CommandPacket packet = new CommandPacket(
     63                 JDWPCommands.MethodCommandSet.CommandSetID,
     64                 JDWPCommands.MethodCommandSet.LineTableCommand);
     65         packet.setNextValueAsClassID(classID);
     66         packet.setNextValueAsMethodID(methodID);
     67         ReplyPacket lineTableReply = debuggeeWrapper.vmMirror.performCommand(packet);
     68         if ( ! checkReplyPacketWithoutFail(lineTableReply,  "printMethodLineTable(): Method.LineTable command") ) {
     69             return;
     70         }
     71         if ( className == null ) {
     72             logWriter.println("=== Line Table for method: " + methodName + " ===");
     73         } else {
     74             logWriter.println("=== Line Table for method: " + methodName + " of class: "
     75                     + className + " ===");
     76         }
     77         long methodStartCodeIndex = lineTableReply.getNextValueAsLong();
     78         logWriter.println("==> Method Start Code Index = " + methodStartCodeIndex);
     79         long methodEndCodeIndex = lineTableReply.getNextValueAsLong();
     80         logWriter.println("==> Method End Code Index = " + methodEndCodeIndex);
     81 
     82         int linesNumber = lineTableReply.getNextValueAsInt();
     83         logWriter.println("==> Number of lines = " + linesNumber);
     84         for (int i=0; i < linesNumber; i++) {
     85             long lineCodeIndex = lineTableReply.getNextValueAsLong();
     86             int lineNumber = lineTableReply.getNextValueAsInt();
     87             logWriter.println("====> Line Number " + lineNumber + " : Initial code index = " + lineCodeIndex);
     88         }
     89         logWriter.println("=== End of Line Table " + methodName + " ===");
     90     }
     91 
     92     long getMethodStartCodeIndex(long classID, String methodName) {
     93         long methodID = debuggeeWrapper.vmMirror.getMethodID(classID, methodName);
     94         if ( methodID == -1 ) {
     95             logWriter.println
     96             ("## getMethodStartCodeIndex(): Can NOT get methodID for classID = "
     97                     + classID + "; Method name = " + methodName);
     98             return -1;
     99         }
    100 
    101         CommandPacket packet = new CommandPacket(
    102                 JDWPCommands.MethodCommandSet.CommandSetID,
    103                 JDWPCommands.MethodCommandSet.LineTableCommand);
    104         packet.setNextValueAsClassID(classID);
    105         packet.setNextValueAsMethodID(methodID);
    106         ReplyPacket lineTableReply = debuggeeWrapper.vmMirror.performCommand(packet);
    107         if ( ! checkReplyPacketWithoutFail
    108                 (lineTableReply,  "getMethodStartCodeIndex(): Method.LineTable command") ) {
    109             return -1;
    110         }
    111         long methodStartCodeIndex = lineTableReply.getNextValueAsLong();
    112         return methodStartCodeIndex;
    113     }
    114 
    115     @SuppressWarnings("unused")
    116     long getMethodEndCodeIndex(long classID, String methodName) {
    117         long methodID = debuggeeWrapper.vmMirror.getMethodID(classID, methodName);
    118         if ( methodID == -1 ) {
    119             logWriter.println
    120             ("## getMethodEndCodeIndex(): Can NOT get methodID for classID = "
    121                     + classID + "; Method name = " + methodName);
    122             return -1;
    123         }
    124 
    125         CommandPacket packet = new CommandPacket(
    126                 JDWPCommands.MethodCommandSet.CommandSetID,
    127                 JDWPCommands.MethodCommandSet.LineTableCommand);
    128         packet.setNextValueAsClassID(classID);
    129         packet.setNextValueAsMethodID(methodID);
    130         ReplyPacket lineTableReply = debuggeeWrapper.vmMirror.performCommand(packet);
    131         if ( ! checkReplyPacketWithoutFail
    132                 (lineTableReply,  "getMethodEndCodeIndex(): Method.LineTable command") ) {
    133             return -1;
    134         }
    135         long methodStartCodeIndex = lineTableReply.getNextValueAsLong();
    136         long methodEndCodeIndex = lineTableReply.getNextValueAsLong();
    137         return methodEndCodeIndex;
    138     }
    139 
    140     protected Location getMethodEntryLocation(long classID, String methodName) {
    141         long methodID = debuggeeWrapper.vmMirror.getMethodID(classID, methodName);
    142         if ( methodID == -1 ) {
    143             logWriter.println
    144             ("## getClassMethodEntryLocation(): Can NOT get methodID for classID = "
    145                     + classID + "; Method name = " + methodName);
    146             return null;
    147         }
    148 
    149         CommandPacket packet = new CommandPacket(
    150                 JDWPCommands.MethodCommandSet.CommandSetID,
    151                 JDWPCommands.MethodCommandSet.LineTableCommand);
    152         packet.setNextValueAsClassID(classID);
    153         packet.setNextValueAsMethodID(methodID);
    154         ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
    155         if ( ! checkReplyPacketWithoutFail
    156                 (reply,  "getMethodEntryLocation(): Method.LineTable command") ) {
    157             return null;
    158         }
    159         long methodStartCodeIndex = reply.getNextValueAsLong();
    160         Location location = new Location();
    161         location.tag = JDWPConstants.TypeTag.CLASS;
    162         location.classID =  classID;
    163         location.methodID = methodID;
    164         location.index = methodStartCodeIndex;
    165         return location;
    166     }
    167 
    168     @SuppressWarnings("unused")
    169     protected Location getMethodEndLocation(long classID, String methodName) {
    170         long methodID = debuggeeWrapper.vmMirror.getMethodID(classID, methodName);
    171         if ( methodID == -1 ) {
    172             logWriter.println
    173             ("## getClassMethodEndLocation(): Can NOT get methodID for classID = "
    174                     + classID + "; Method name = " + methodName);
    175             return null;
    176         }
    177 
    178         CommandPacket packet = new CommandPacket(
    179                 JDWPCommands.MethodCommandSet.CommandSetID,
    180                 JDWPCommands.MethodCommandSet.LineTableCommand);
    181         packet.setNextValueAsClassID(classID);
    182         packet.setNextValueAsMethodID(methodID);
    183         ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
    184         if ( ! checkReplyPacketWithoutFail
    185                 (reply,  "getMethodEndLocation(): Method.LineTable command") ) {
    186             return null;
    187         }
    188         long methodStartCodeIndex = reply.getNextValueAsLong();
    189         long methodEndCodeIndex = reply.getNextValueAsLong();
    190         Location location = new Location();
    191         location.tag = JDWPConstants.TypeTag.CLASS;
    192         location.classID =  classID;
    193         location.methodID = methodID;
    194         location.index = methodEndCodeIndex;
    195         return location;
    196     }
    197 
    198     protected boolean checkEventsLocation(ParsedEvent[] parsedEvents, Location expectedLocation) {
    199         boolean success = true;
    200         for (int i = 0; i < parsedEvents.length; i++) {
    201             byte eventKind = parsedEvents[i].getEventKind();
    202             long eventThreadID = 0;
    203             Location eventLocation = null;
    204             switch ( eventKind ) {
    205             case JDWPConstants.EventKind.METHOD_ENTRY:
    206                 eventLocation = ((ParsedEvent.Event_METHOD_ENTRY)parsedEvents[i]).getLocation();
    207                 eventThreadID = ((ParsedEvent.EventThread)parsedEvents[i]).getThreadID();
    208                 break;
    209             case JDWPConstants.EventKind.SINGLE_STEP:
    210                 eventLocation = ((ParsedEvent.Event_SINGLE_STEP)parsedEvents[i]).getLocation();
    211                 eventThreadID = ((ParsedEvent.EventThread)parsedEvents[i]).getThreadID();
    212                 break;
    213             case JDWPConstants.EventKind.BREAKPOINT:
    214                 eventLocation = ((ParsedEvent.Event_BREAKPOINT)parsedEvents[i]).getLocation();
    215                 eventThreadID = ((ParsedEvent.EventThread)parsedEvents[i]).getThreadID();
    216                 break;
    217             case JDWPConstants.EventKind.METHOD_EXIT:
    218                 eventLocation = ((ParsedEvent.Event_METHOD_EXIT)parsedEvents[i]).getLocation();
    219                 eventThreadID = ((ParsedEvent.EventThread)parsedEvents[i]).getThreadID();
    220                 break;
    221             default:
    222                 logWriter.println("");
    223                 logWriter.println("=> Chcek location for event "
    224                     + ": Event kind = " + eventKind + "("
    225                     + JDWPConstants.EventKind.getName(eventKind) +")");
    226                 logWriter.println("=> WARNING: This event is not suitable to check location!");
    227                 continue;
    228             }
    229             logWriter.println("");
    230             logWriter.println("=> Chcek location for event "
    231                 + ": Event kind = " + eventKind + "("
    232                 + JDWPConstants.EventKind.getName(eventKind) +"); eventThreadID = "
    233                 + eventThreadID);
    234             long eventClassID = eventLocation.classID;
    235             logWriter.println("=> ClassID in event = " + eventClassID);
    236             if ( expectedLocation != null ) {
    237                 if ( expectedLocation.classID != eventClassID ) {
    238                     logWriter.println("## FAILURE: Unexpected ClassID in event!");
    239                     logWriter.println("##          Expected ClassID  = " + expectedLocation.classID );
    240                     success = false;
    241                 } else {
    242                     logWriter.println("=> OK - it is expected ClassID");
    243                 }
    244             }
    245             long eventMethodID = eventLocation.methodID;
    246             logWriter.println("=> MethodID in event = " + eventMethodID);
    247             if ( expectedLocation != null ) {
    248                 if ( expectedLocation.methodID != eventMethodID ) {
    249                     logWriter.println("## FAILURE: Unexpected MethodID in event!");
    250                     logWriter.println("##          Expected MethodID = " + expectedLocation.methodID);
    251                     success = false;
    252                 } else {
    253                     logWriter.println("=> OK - it is expected MethodID");
    254                 }
    255             }
    256             long eventCodeIndex = eventLocation.index;
    257             logWriter.println("=> CodeIndex in event = " + eventCodeIndex);
    258             if ( expectedLocation != null ) {
    259                 if ( expectedLocation.index != eventCodeIndex ) {
    260                     logWriter.println("## FAILURE: Unexpected CodeIndex in event!");
    261                     logWriter.println("##          Expected CodeIndex = "
    262                         + expectedLocation.index);
    263                     success = false;
    264                 } else {
    265                     logWriter.println("=> OK - it is expected CodeIndex)");
    266                 }
    267             }
    268         }
    269         logWriter.println("");
    270         if ( expectedLocation != null ) {
    271             if ( ! success ) {
    272                 String failureMessage = "## FAILURE: Unexpected events' locations are found out!";
    273                 logWriter.println(failureMessage);
    274             } else {
    275                 logWriter.println("=> OK - all checked events have expected location!");
    276             }
    277         }
    278         return success;
    279     }
    280 
    281  }
    282