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
19package org.apache.harmony.jpda.tests.jdwp.ClassObjectReference;
20
21import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
22import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
23import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
24import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
25import 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 */
31abstract 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