Home | History | Annotate | Download | only in ClassObjectReference
      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 package org.apache.harmony.jpda.tests.jdwp.ClassObjectReference;
     20 
     21 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
     22 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
     23 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
     24 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
     25 import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
     26 
     27 /**
     28  * An abstract class for JDWP unit tests related to
     29  * ClassObjectReference.ReflectedType command.
     30  */
     31 abstract class AbstractReflectedTypeTestCase extends JDWPSyncTestCase {
     32     static class TypeSignatureAndTag {
     33         public TypeSignatureAndTag(String typeSignature, byte typeTag) {
     34             this.typeSignature = typeSignature;
     35             this.typeTag = typeTag;
     36         }
     37         String typeSignature;
     38         byte typeTag;
     39     }
     40 
     41     protected void runReflectedTypeTest(TypeSignatureAndTag[] array) {
     42         for (int i = 0; i < array.length; i++) {
     43             logWriter.println("\n==> Checked class: " + array[i].typeSignature);
     44 
     45             // Get referenceTypeID
     46             logWriter.println
     47             ("==> Send VirtualMachine::ClassesBySignature command for checked class...");
     48             CommandPacket packet = new CommandPacket(
     49                     JDWPCommands.VirtualMachineCommandSet.CommandSetID,
     50                     JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
     51             packet.setNextValueAsString(array[i].typeSignature);
     52             ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
     53             checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
     54 
     55             int classes = reply.getNextValueAsInt();
     56             logWriter.println("==> Number of returned classes = " + classes);
     57             //this class may be loaded only once
     58             byte refInitTypeTag = 0;
     59             long typeInitID = 0;
     60             int status = 0;
     61 
     62             for (int j = 0; j < classes; j++) {
     63                 refInitTypeTag = reply.getNextValueAsByte();
     64                 typeInitID = reply.getNextValueAsReferenceTypeID();
     65                 status = reply.getNextValueAsInt();
     66                 logWriter.println("==> refTypeId["+j+"] = " + typeInitID);
     67                 logWriter.println("==> refTypeTag["+j+"] = " + refInitTypeTag + "("
     68                         + JDWPConstants.TypeTag.getName(refInitTypeTag) + ")");
     69                 logWriter.println("==> classStatus["+j+"] = " + status + "("
     70                         + JDWPConstants.ClassStatus.getName(status) + ")");
     71 
     72                 String classSignature = debuggeeWrapper.vmMirror.getClassSignature(typeInitID);
     73                 logWriter.println("==> classSignature["+j+"] = " + classSignature);
     74 
     75                 packet = new CommandPacket(
     76                         JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
     77                         JDWPCommands.ReferenceTypeCommandSet.ClassLoaderCommand);
     78                 packet.setNextValueAsReferenceTypeID(typeInitID);
     79                 ReplyPacket reply2 = debuggeeWrapper.vmMirror.performCommand(packet);
     80                 checkReplyPacket(reply, "ReferenceType::ClassLoader command");
     81 
     82                 long classLoaderID = reply2.getNextValueAsObjectID();
     83                 logWriter.println("==> classLoaderID["+j+"] = " + classLoaderID);
     84 
     85                 if (classLoaderID != 0) {
     86                     String classLoaderSignature = getObjectSignature(classLoaderID);
     87                     logWriter.println("==> classLoaderSignature["+j+"] = " + classLoaderSignature);
     88                 } else {
     89                     logWriter.println("==> classLoader is system class loader");
     90                 }
     91             }
     92 
     93             assertEquals("VirtualMachine::ClassesBySignature returned invalid number of classes,",
     94                     1, classes);
     95             assertEquals("VirtualMachine::ClassesBySignature returned invalid TypeTag,",
     96                     array[i].typeTag, refInitTypeTag,
     97                     JDWPConstants.TypeTag.getName(array[i].typeTag),
     98                     JDWPConstants.TypeTag.getName(refInitTypeTag));
     99 
    100             // Get ClassObject
    101             logWriter.println
    102             ("==> Send ReferenceType::ClassObject command for checked class...");
    103             packet = new CommandPacket(
    104                     JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
    105                     JDWPCommands.ReferenceTypeCommandSet.ClassObjectCommand);
    106             packet.setNextValueAsReferenceTypeID(typeInitID);
    107             reply = debuggeeWrapper.vmMirror.performCommand(packet);
    108             checkReplyPacket(reply, "ReferenceType::ClassObject command");
    109 
    110             long classObject = reply.getNextValueAsClassObjectID();
    111             assertAllDataRead(reply);
    112             logWriter.println("==> classObjectID=" + classObject);
    113 
    114             // Get ReflectedType
    115             logWriter.println
    116             ("==> Send ClassObjectReference::ReflectedType command for classObjectID...");
    117             packet = new CommandPacket(
    118                     JDWPCommands.ClassObjectReferenceCommandSet.CommandSetID,
    119                     JDWPCommands.ClassObjectReferenceCommandSet.ReflectedTypeCommand);
    120             packet.setNextValueAsObjectID(classObject);
    121             reply = debuggeeWrapper.vmMirror.performCommand(packet);
    122             checkReplyPacket(reply, "ClassObjectReference::ReflectedType command");
    123 
    124             byte refTypeTag = reply.getNextValueAsByte();
    125             long typeID = reply.getNextValueAsReferenceTypeID();
    126             logWriter.println("==> reflectedTypeId = " + typeID);
    127             logWriter.println("==> reflectedTypeTag = " + refTypeTag
    128                     + "(" + JDWPConstants.TypeTag.getName(refTypeTag) + ")");
    129 
    130             assertEquals("ClassObjectReference::ReflectedType returned invalid reflected TypeTag,",
    131                     array[i].typeTag, refTypeTag,
    132                     JDWPConstants.TypeTag.getName(array[i].typeTag),
    133                     JDWPConstants.TypeTag.getName(refTypeTag));
    134             assertEquals("ClassObjectReference::ReflectedType returned invalid reflected typeID,",
    135                     typeInitID, typeID);
    136             assertAllDataRead(reply);
    137         }
    138     }
    139 }
    140