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 11.03.2005
25 */
26package org.apache.harmony.jpda.tests.jdwp.ObjectReference;
27
28import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
29import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
30import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
31import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
32import org.apache.harmony.jpda.tests.framework.jdwp.Value;
33import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
34import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
35
36
37/**
38 * JDWP Unit test for ObjectReference.GetValues command for static fields.
39 */
40public class GetValues002Test extends JDWPSyncTestCase {
41
42    static final String thisCommandName = "ObjectReference::GetValues command";
43    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/GetValues002Debuggee;";
44
45    @Override
46    protected String getDebuggeeClassName() {
47        return "org.apache.harmony.jpda.tests.jdwp.ObjectReference.GetValues002Debuggee";
48    }
49
50    /**
51     * This test exercises ObjectReference.GetValues command for static fields.
52     * <BR>The test starts GetValues002Debuggee class, gets objectID
53     * as value of static field of this class which (field) represents checked object.
54     * Then for this objectID test executes ObjectReference.GetValues command for special
55     * set of fieldIDs and checks that command returns expected jdwpTags for all checked
56     * fields and expected values for primitive fields.
57     */
58    public void testGetValues002() {
59        String thisTestName = "testGetValues002";
60        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
61        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
62
63        long refTypeID = getClassIDBySignature(debuggeeSignature);
64
65        logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
66        logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID);
67
68        String checkedFieldNames[] = {
69                "getValues002DebuggeeField",
70
71                "staticLongField",
72                "staticIntField",
73                "staticStringField",
74                "staticObjectField",
75                "staticBooleanField",
76                "staticByteField",
77                "staticCharField",
78                "staticShortField",
79                "staticFloatField",
80                "staticDoubleField",
81                "staticArrayField",
82                };
83        long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames);
84        int checkedFieldsNumber = checkedFieldNames.length;
85
86        logWriter.println
87        ("=> Send ReferenceType::GetValues command and and get ObjectID to check...");
88
89        CommandPacket getValuesCommand = new CommandPacket(
90                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
91                JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand);
92        getValuesCommand.setNextValueAsReferenceTypeID(refTypeID);
93        getValuesCommand.setNextValueAsInt(1);
94        getValuesCommand.setNextValueAsFieldID(checkedFieldIDs[0]);
95
96        ReplyPacket getValuesReply = debuggeeWrapper.vmMirror.performCommand(getValuesCommand);
97        getValuesCommand = null;
98        checkReplyPacket(getValuesReply, "ReferenceType::GetValues command");
99
100        int returnedValuesNumber = getValuesReply.getNextValueAsInt();
101        logWriter.println("=> Returned values number = " + returnedValuesNumber);
102        assertEquals("Invalid number of values,", 1, returnedValuesNumber);
103
104        Value checkedObjectFieldValue = getValuesReply.getNextValueAsValue();
105        byte checkedObjectFieldTag = checkedObjectFieldValue.getTag();
106        logWriter.println("=> Returned field value tag for checked object= " + checkedObjectFieldTag
107            + "(" + JDWPConstants.Tag.getName(checkedObjectFieldTag) + ")");
108        assertEquals("Invalid value tag for checked object,", JDWPConstants.Tag.OBJECT_TAG, checkedObjectFieldTag
109                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
110                , JDWPConstants.Tag.getName(checkedObjectFieldTag));
111
112        long checkedObjectID = checkedObjectFieldValue.getLongValue();
113        logWriter.println("=> Returned checked ObjectID = " + checkedObjectID);
114        logWriter.println("=> CHECK: send " + thisCommandName + " for this ObjectID and check reply...");
115
116        CommandPacket checkedCommand = new CommandPacket(
117                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
118                JDWPCommands.ObjectReferenceCommandSet.GetValuesCommand);
119        checkedCommand.setNextValueAsObjectID(checkedObjectID);
120        checkedCommand.setNextValueAsInt(checkedFieldsNumber-1);
121        int fieldIndex = 1; // !!!
122        for (; fieldIndex < checkedFieldsNumber; fieldIndex++) {
123            checkedCommand.setNextValueAsFieldID(checkedFieldIDs[fieldIndex]);
124        }
125
126        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
127        checkedCommand = null;
128        checkReplyPacket(checkedReply, thisCommandName);
129
130        returnedValuesNumber = checkedReply.getNextValueAsInt();
131        logWriter.println("=> Returned values number = " + returnedValuesNumber);
132        assertEquals("Invalid number of values,", checkedFieldsNumber - 1, returnedValuesNumber);
133
134        byte expectedFieldTags[] = {
135                0, // dummy
136                JDWPConstants.Tag.LONG_TAG,
137                JDWPConstants.Tag.INT_TAG,
138                JDWPConstants.Tag.STRING_TAG,
139                JDWPConstants.Tag.OBJECT_TAG,
140                JDWPConstants.Tag.BOOLEAN_TAG,
141                JDWPConstants.Tag.BYTE_TAG,
142                JDWPConstants.Tag.CHAR_TAG,
143                JDWPConstants.Tag.SHORT_TAG,
144                JDWPConstants.Tag.FLOAT_TAG,
145                JDWPConstants.Tag.DOUBLE_TAG,
146                JDWPConstants.Tag.ARRAY_TAG,
147        };
148
149        logWriter.println("=> CHECK for returned values...");
150        fieldIndex = 1; // !!!
151        for (; fieldIndex < checkedFieldsNumber; fieldIndex++) {
152            Value fieldValue = checkedReply.getNextValueAsValue();
153            byte fieldTag = fieldValue.getTag();
154            logWriter.println
155            ("\n=> Check for returned value for field: " + checkedFieldNames[fieldIndex] + " ...");
156            logWriter.println("=> Returned value tag = " + fieldTag
157                + "(" + JDWPConstants.Tag.getName(fieldTag) + ")");
158
159            assertEquals("Invalid value tag is returned,", expectedFieldTags[fieldIndex], fieldTag
160                    , JDWPConstants.Tag.getName(expectedFieldTags[fieldIndex])
161                    , JDWPConstants.Tag.getName(fieldTag));
162
163            switch ( fieldTag ) {
164            case JDWPConstants.Tag.INT_TAG:
165                int intValue = fieldValue.getIntValue();
166                logWriter.println("=> Int value = " + intValue);
167                int expectedIntValue = 99;
168                assertEquals("Invalid int value,", expectedIntValue, intValue);
169                break;
170            case JDWPConstants.Tag.LONG_TAG:
171                long longValue = fieldValue.getLongValue();
172                logWriter.println("=> Long value = " + longValue);
173                long expectedLongValue = 2147483647;
174                assertEquals("Invalid long value,", expectedLongValue, longValue);
175                break;
176            case JDWPConstants.Tag.STRING_TAG:
177                long stringIDValue = fieldValue.getLongValue();
178                logWriter.println("=> StringID value = " + stringIDValue);
179                break;
180            case JDWPConstants.Tag.OBJECT_TAG:
181                long objectIDValue = fieldValue.getLongValue();
182                logWriter.println("=> ObjectID value = " + objectIDValue);
183                break;
184            case JDWPConstants.Tag.BOOLEAN_TAG:
185                boolean booleanValue = fieldValue.getBooleanValue();
186                logWriter.println("=> Boolean value = " + booleanValue);
187                boolean expectedBooleanValue = true;
188                assertEquals("Invalid boolean value,", expectedBooleanValue, booleanValue);
189                break;
190            case JDWPConstants.Tag.BYTE_TAG:
191                byte byteValue = fieldValue.getByteValue();
192                logWriter.println("=> Byte value = " + byteValue);
193                byte expectedByteValue = 1;
194                assertEquals("Invalid byte value,", expectedByteValue, byteValue);
195                break;
196            case JDWPConstants.Tag.CHAR_TAG:
197                char charValue = fieldValue.getCharValue();
198                logWriter.println("=> Char value = " + (int)charValue);
199                char expectedCharValue = 97;
200                assertEquals("Invalid char value,", expectedCharValue, charValue);
201                break;
202            case JDWPConstants.Tag.SHORT_TAG:
203                short shortValue = fieldValue.getShortValue();
204                logWriter.println("=> Short value = " + shortValue);
205                short expectedShortValue = 2;
206                assertEquals("Invalid short value,", expectedShortValue, shortValue);
207                break;
208            case JDWPConstants.Tag.FLOAT_TAG:
209                float floatValue = fieldValue.getFloatValue();
210                logWriter.println("=> Float value = " + floatValue);
211                float expectedFloatValue = 2;
212                assertEquals("Invalid float value,", expectedFloatValue, floatValue, 0);
213                break;
214            case JDWPConstants.Tag.DOUBLE_TAG:
215                double doubleValue = fieldValue.getDoubleValue();
216                logWriter.println("=> Double value = " + doubleValue);
217                double expectedDoubleValue = 3.1;
218                assertEquals("Invalid double value,", expectedDoubleValue, doubleValue, 0);
219                break;
220            case JDWPConstants.Tag.ARRAY_TAG:
221                long arrayIDValue = fieldValue.getLongValue();
222                logWriter.println("=> ArrayID value = " + arrayIDValue);
223                break;
224            }
225        }
226
227        assertAllDataRead(checkedReply);
228
229        logWriter.println
230        ("=> CHECK PASSED: All expected field values are got and have expected attributes");
231
232        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
233        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH");
234    }
235}
236