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 18.02.2005 25 */ 26 package org.apache.harmony.jpda.tests.jdwp.ReferenceType; 27 28 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket; 29 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands; 30 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 31 import org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase; 32 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 33 34 35 /** 36 * JDWP Unit test for ReferenceType.Fields command. 37 */ 38 public class FieldsTest extends JDWPSyncTestCase { 39 40 static final int testStatusPassed = 0; 41 static final int testStatusFailed = -1; 42 static final String thisCommandName = "ReferenceType.Fields command"; 43 static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/FieldsDebuggee;"; 44 45 @Override 46 protected String getDebuggeeClassName() { 47 return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.FieldsDebuggee"; 48 } 49 50 /** 51 * This testcase exercises ReferenceType.Fields command. 52 * <BR>The test starts FieldsDebuggee class, requests referenceTypeId 53 * for this class by VirtualMachine.ClassesBySignature command, then 54 * performs ReferenceType.Fields command and checks that returned 55 * list of fields corresponds to expected list with expected attributes. 56 */ 57 public void testFields001() { 58 String thisTestName = "testFields001"; 59 logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); 60 int testStatus = testStatusPassed; 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 logWriter.println("=> CHECK: send " + thisCommandName + " and check reply..."); 68 69 CommandPacket fieldsCommand = new CommandPacket( 70 JDWPCommands.ReferenceTypeCommandSet.CommandSetID, 71 JDWPCommands.ReferenceTypeCommandSet.FieldsCommand); 72 fieldsCommand.setNextValueAsReferenceTypeID(refTypeID); 73 74 ReplyPacket fieldsReply = debuggeeWrapper.vmMirror.performCommand(fieldsCommand); 75 fieldsCommand = null; 76 checkReplyPacket(fieldsReply, thisCommandName); 77 78 int returnedFieldsNumber = fieldsReply.getNextValueAsInt(); 79 logWriter.println("=> Returned fields number = " + returnedFieldsNumber); 80 81 String fieldNames[] = { 82 "staticIntField", 83 "stringField", 84 "objectField" 85 }; 86 87 String fieldSignatures[] = { 88 "I", 89 "Ljava/lang/String;", 90 "Ljava/lang/Object;" 91 }; 92 93 int fieldModifiers[] = { 94 0x8, 95 0x0, 96 0x0 97 }; 98 99 boolean fieldFound[] = { 100 false, 101 false, 102 false 103 }; 104 int expectedFieldsNumber = fieldNames.length; 105 int fieldSyntheticFlag = 0xf0000000; 106 String failMessage = null; 107 108 logWriter.println("=> CHECK for all expected fields..."); 109 for (int i = 0; i < returnedFieldsNumber; i++) { 110 long returnedFieldID = fieldsReply.getNextValueAsFieldID(); 111 String returnedFieldName = fieldsReply.getNextValueAsString(); 112 String returnedFieldSignature = fieldsReply.getNextValueAsString(); 113 int returnedFieldModifiers = fieldsReply.getNextValueAsInt(); 114 logWriter.println("\n=> Field ID = " + returnedFieldID); 115 logWriter.println("=> Field name = " + returnedFieldName); 116 logWriter.println("=> Field signature = " + returnedFieldSignature); 117 logWriter.println("=> Field modifiers = 0x" + Integer.toHexString(returnedFieldModifiers)); 118 if ( (returnedFieldModifiers & fieldSyntheticFlag) == fieldSyntheticFlag ) { 119 continue; // do not check synthetic fields 120 } 121 int k = 0; 122 for (; k < expectedFieldsNumber; k++) { 123 if (!fieldNames[k].equals(returnedFieldName)) { 124 continue; 125 } 126 if (fieldFound[k]) { 127 logWriter.println("\n## FAILURE: The field is found repeatedly in the list"); 128 logWriter.println("## Field name = " + returnedFieldName); 129 testStatus = testStatusFailed; 130 failMessage = "The field is found repeatedly in the list: " + 131 returnedFieldName; 132 break; 133 } 134 fieldFound[k] = true; 135 if (!fieldSignatures[k].equals(returnedFieldSignature) ) { 136 logWriter.println("\n## FAILURE: Unexpected field signature is returned:"); 137 logWriter.println("## Field name = " + returnedFieldName); 138 logWriter.println("## Expected signature = " + fieldSignatures[k]); 139 logWriter.println("## Returned signature = " + returnedFieldSignature); 140 testStatus = testStatusFailed; 141 failMessage = "Unexpected signature is returned for field: " + 142 returnedFieldName + 143 ", expected: " + fieldSignatures[k] + 144 ", returned: " + returnedFieldSignature; 145 } 146 if (fieldModifiers[k] != returnedFieldModifiers) { 147 logWriter.println("\n## FAILURE: Unexpected field modifiers are returned:"); 148 logWriter.println("## Field name = " + returnedFieldName); 149 logWriter.println 150 ("## Expected modifiers = 0x" + Integer.toHexString(fieldModifiers[k])); 151 logWriter.println 152 ("## Returned modifiers = 0x" + Integer.toHexString(returnedFieldModifiers)); 153 testStatus = testStatusFailed; 154 failMessage = "Unexpected modifiers are returned for field: " + 155 returnedFieldName + 156 ", expected: 0x" + Integer.toHexString(fieldModifiers[k]) + 157 ", returned: 0x" + Integer.toHexString(returnedFieldModifiers); 158 } 159 break; 160 } 161 if (k == expectedFieldsNumber) { 162 // returned field is not found out in the list of expected fields 163 logWriter.println("\n## FAILURE: It is found out unexpected returned field:"); 164 logWriter.println("## Field name = " + returnedFieldName); 165 logWriter.println("## Field signature = " + returnedFieldSignature); 166 logWriter.println 167 ("## Field modifiers = 0x" + Integer.toHexString(returnedFieldModifiers)); 168 testStatus = testStatusFailed; 169 failMessage = 170 "Unexpected returned field: " + returnedFieldName + 171 ", signature = " + returnedFieldSignature + 172 ", modifiers = 0x" + Integer.toHexString(returnedFieldModifiers); 173 } 174 } 175 176 for (int k = 0; k < expectedFieldsNumber; k++) { 177 if (!fieldFound[k]) { 178 logWriter.println 179 ("\n## FAILURE: Expected field is NOT found out in the list of retuned fields:"); 180 logWriter.println("## Field name = " + fieldNames[k]); 181 testStatus = testStatusFailed; 182 failMessage = "Expected field is NOT found in the list of retuned fields: " + 183 fieldNames[k]; 184 } 185 } 186 187 if (testStatus == testStatusPassed) { 188 logWriter.println 189 ("=> CHECK PASSED: All expected fields are found out and have expected attributes"); 190 } 191 192 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 193 logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH"); 194 if (testStatus == testStatusFailed) { 195 fail(failMessage); 196 } 197 198 assertAllDataRead(fieldsReply); 199 } 200 } 201