summaryrefslogtreecommitdiff
path: root/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/ReferenceType/ClassObjectTest.java
blob: cfa0178bd3154846b340f67801db72ba6a7b2161 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * @author Anatoly F. Bondarenko
 */

/**
 * Created on 24.02.2005
 */
package org.apache.harmony.jpda.tests.jdwp.ReferenceType;

import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;


/**
 * JDWP Unit test for ReferenceType.ClassObject command.
 */
public class ClassObjectTest extends JDWPSyncTestCase {

    static final int testStatusPassed = 0;
    static final int testStatusFailed = -1;
    static final String thisCommandName = "ReferenceType.ClassObject command";
    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/ClassObjectDebuggee;";

    @Override
    protected String getDebuggeeClassName() {
        return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.ClassObjectDebuggee";
    }

    /**
     * This testcase exercises ReferenceType.ClassObject command.
     * <BR>The test starts ClassObjectDebuggee class, requests referenceTypeId
     * for this class by VirtualMachine.ClassesBySignature command, then
     * performs ReferenceType.ClassObject command and checks that returned
     * class object is object of reference type 'java/lang/Class'.
     */
    public void testClassObject001() {
        String thisTestName = "testClassObject001";
        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
        //int testStatus = testStatusPassed;
        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

        long refTypeID = getClassIDBySignature(debuggeeSignature);

        logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
        logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID);

        String debuggeeExtraClassSignature
            = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/ClassObjectDebuggee_ExtraClass;";

        long debuggeeExtraClassRefTypeID = getClassIDBySignature(debuggeeExtraClassSignature);

        logWriter.println("=> referenceTypeID for Debuggee extra class = " + debuggeeExtraClassRefTypeID);
        logWriter.println("=> CHECK: send " + thisCommandName + " and check reply...");

        CommandPacket checkedCommand = new CommandPacket(
                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
                JDWPCommands.ReferenceTypeCommandSet.ClassObjectCommand);
        checkedCommand.setNextValueAsReferenceTypeID(refTypeID);

        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
        checkedCommand = null;
        checkReplyPacket(checkedReply, thisCommandName);

        long classObjectID = checkedReply.getNextValueAsObjectID();
        logWriter.println("=> Returned class ObjectID = " + classObjectID);
        logWriter.println("=> Get reference type for returned class Object...");

        CommandPacket referenceTypeCommand = new CommandPacket(
                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
                JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
        referenceTypeCommand.setNextValueAsObjectID(classObjectID);

        ReplyPacket referenceTypeReply = debuggeeWrapper.vmMirror.performCommand(referenceTypeCommand);
        referenceTypeCommand = null;

        checkReplyPacket(referenceTypeReply, "ObjectReference::ReferenceType command");

        referenceTypeReply.getNextValueAsByte();
        // refTypeTag of class - is NOT used here

        long refTypeIDOfClassObject = referenceTypeReply.getNextValueAsReferenceTypeID();
        referenceTypeReply = null;

        logWriter.println("=> ReferenceTypeID of ClassObject = " + refTypeIDOfClassObject);
        logWriter.println("=> Get signature for reference type of ClassObject...");

        CommandPacket signatureCommand = new CommandPacket(
                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
        signatureCommand.setNextValueAsReferenceTypeID(refTypeIDOfClassObject);

        ReplyPacket signatureReply = debuggeeWrapper.vmMirror.performCommand(signatureCommand);
        signatureCommand = null;
        checkReplyPacket(signatureReply, "ReferenceType::Signature command");

        String returnedSignature = signatureReply.getNextValueAsString();
        signatureReply = null;
        logWriter.println("=> Signature of reference type of ClassObject = " + returnedSignature);

        String expectedSignature = "Ljava/lang/Class;";
        assertString("Invalid signature of reference type of ClassObject,", expectedSignature, returnedSignature);
        logWriter.println("=> CHECK: PASSED: expected signature is returned");

        assertAllDataRead(checkedReply);

        CommandPacket classLoaderCommand = new CommandPacket(
                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
                JDWPCommands.ReferenceTypeCommandSet.ClassLoaderCommand);
        classLoaderCommand.setNextValueAsReferenceTypeID(refTypeID);

        ReplyPacket classLoaderReply = debuggeeWrapper.vmMirror.performCommand(classLoaderCommand);
        classLoaderCommand = null;
        checkReplyPacket(classLoaderReply, "ReferenceType::ClassLoader command");

        long classLoaderID = classLoaderReply.getNextValueAsObjectID();
        logWriter.println("=> ClassLoaderID of debuggee = " + classLoaderID);
        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH");
    }
}