/* * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package nsk.jdi.ArrayReference.setValue; import nsk.share.*; import nsk.share.jpda.*; import nsk.share.jdi.*; import com.sun.jdi.*; import java.io.*; import java.util.*; public class setvalue003 { // exit code when test failed public final static int TEST_FAILED = 2; // exit code when test passed public final static int TEST_PASSED = 0; // shift of exit code public final static int JCK_STATUS_BASE = 95; // parameters arrays to call com.sum.jdi.ArrayReference.setValue(int, Value) private static long[] INDEX_PARAM = { Integer.MAX_VALUE + 1, -1, 0, Integer.MAX_VALUE }; private final static String BYTE_VALUES_FIELD = "BYTE_VALUE_PARAM"; private final static String CHAR_VALUES_FIELD = "CHAR_VALUE_PARAM"; private final static String DBL_VALUES_FIELD = "DBL_VALUE_PARAM"; private final static String FLT_VALUES_FIELD = "FLT_VALUE_PARAM"; private final static String INT_VALUES_FIELD = "INT_VALUE_PARAM"; private final static String LNG_VALUES_FIELD = "LNG_VALUE_PARAM"; private final static String SHORT_VALUES_FIELD= "SHORT_VALUE_PARAM"; private final static String prefix = "nsk.jdi.ArrayReference.setValue."; private final static String className = "setvalue003"; private final static String debuggerName = prefix + className; private final static String debugeeName = debuggerName + "a"; private final static String objectToCheck = "testedObj"; private int exitStatus; private Log log; private Debugee debugee; private IOPipe pipe; private ReferenceType refType; public static void main(String argv[]) { System.exit(JCK_STATUS_BASE + run(argv, System.out)); } public static int run(String argv[], PrintStream out) { setvalue003 tstObj = new setvalue003(); if ( tstObj.prepareDebugee(argv, out) ) { tstObj.execTest(); tstObj.disposeOfDebugee(); } if ( tstObj.exitStatus == TEST_FAILED ) tstObj.complain("run:: TEST FAILED"); else tstObj.display("run:: TEST PASSED"); return tstObj.exitStatus; } private boolean prepareDebugee(String argv[], PrintStream out) { ArgumentHandler argHandler = new ArgumentHandler(argv); log = new Log(out, argHandler); Binder binder = new Binder(argHandler, log); display("prepareDebugee:: binder created."); debugee = binder.bindToDebugee(debugeeName); log.display("prepareDebugee:: binded to debugee."); pipe = debugee.createIOPipe(); log.display("prepareDebugee:: pipe created."); debugee.redirectStderr(out); debugee.resume(); String line = pipe.readln(); if ( line == null ) { complain("prepareDebugee:: UNEXPECTED debugee's signal - null"); return false; } if ( !line.equals("ready") ) { complain("prepareDebugee:: UNEXPECTED debugee's signal - " + line); return false; } display("prepareDebugee:: debugee's \"ready\" signal received."); return true; } private boolean disposeOfDebugee() { pipe.println("quit"); debugee.waitFor(); int status = debugee.getStatus(); if ( status != JCK_STATUS_BASE ) { complain("disposeOfDebugee:: UNEXPECTED Debugee's exit " + "status (not " + JCK_STATUS_BASE + ") - " + status); return false; } display("disposeOfDebugee:: expected Debugee's exit " + "status - " + status); return true; } private void display(String msg) { if ( log != null ) log.display("debugger> " + msg); } private void complain(String msg) { if ( log != null ) log.complain("debugger FAILURE> " + msg); } private boolean execTest() { exitStatus = TEST_FAILED; refType = debugee.classByName(debugeeName); if ( refType == null ) { complain("eventHandler:: Class '" + debugeeName + "' not found."); return false; } Field field = refType.fieldByName(objectToCheck); if ( field == null ) { complain("eventHandler:: Field '" + objectToCheck + "' not found."); return false; } Value objectValue = refType.getValue(field); if ( objectValue == null ) { complain("eventHandler:: Field '" + objectToCheck + "' not initialized."); return false; } return checkObjectFields(objectValue); } public boolean checkObjectFields(Value objectValue) { List fieldList; if ( ! (objectValue instanceof ObjectReference) ) return false; fieldList = ((ClassType )objectValue.type()).allFields(); // Check all array fields from debugee display("checkObjectFields:: Tests starts >>>"); boolean res = true; for (int i = 0; i < fieldList.size(); i++) { res = checkFieldValue((ObjectReference )objectValue, (Field )fieldList.get(i)) && res; } exitStatus = res ? TEST_PASSED : TEST_FAILED; return res; } private boolean checkFieldValue(ObjectReference object, Field field) { Value fieldValue; ArrayReference arrayRef; String fieldName = field.name(); log.display(""); display("<" + fieldName + "> field is being checked."); try { fieldValue = object.getValue(field); } catch (IllegalArgumentException e) { complain("checkFieldValue:: can not get value for field " + fieldName); complain("checkFieldValue:: " + e); return false; } display("***" + fieldName + " = " + fieldValue); // Tested object doesn't have non-initialized fields! if ( fieldValue == null ) { complain("unexpected field value <" + fieldValue + ">"); return false; } display("*** type of " + fieldName + " = " + fieldValue.type()); // Checking up of value type. // Tested object doesn't have other fields than be ArrayType if ( ! (fieldValue.type() instanceof ArrayType) ) { display("type of value is not ArrayType."); return false; } boolean res = true; Type itemType; try { itemType = ((ArrayType )fieldValue.type()).componentType(); } catch(Exception e) { complain("Unexpected " + e.getClass().getName() ); return false; } // getting value to set from debugee with defined type Field fieldOfValues = null; if ( itemType instanceof ByteType ) { fieldOfValues = refType.fieldByName(BYTE_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + BYTE_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof CharType ) { fieldOfValues = refType.fieldByName(CHAR_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + CHAR_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof DoubleType ) { fieldOfValues = refType.fieldByName(DBL_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + DBL_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof FloatType ) { fieldOfValues = refType.fieldByName(FLT_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + FLT_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof IntegerType ) { fieldOfValues = refType.fieldByName(INT_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + INT_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof LongType ) { fieldOfValues = refType.fieldByName(LNG_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + LNG_VALUES_FIELD + "' not found."); return false; } } else if ( itemType instanceof ShortType ) { fieldOfValues = refType.fieldByName(SHORT_VALUES_FIELD); if ( fieldOfValues == null ) { complain("Field '" + SHORT_VALUES_FIELD + "' not found."); return false; } } ArrayReference values = (ArrayReference )refType.getValue(fieldOfValues); // Checking up of test cases. for ( int i = 0; i < INDEX_PARAM.length; i++ ) { for ( int j = 0; j < values.length(); j++ ) { res = checkValueUpdating(fieldName, (ArrayReference )fieldValue, INDEX_PARAM[i], values.getValue(j)) && res; } } return res; } private boolean checkValueUpdating(String name, ArrayReference arrayRef, long index, Value value) { Value itemValue; List list; String il2Str = "for index=" + index + " value=" + value; int arrayLength = arrayRef.length(); try { arrayRef.setValue((int )index, value); Value v1 = arrayRef.getValue((int )index); if ( !value.equals(v1) ) { complain("not correct value " + v1 + " " + il2Str); return false; } if ( index < 0 || index >= arrayLength ) { complain("IndexOutOfBoundsException is expected " + il2Str); return false; } else { display("Value " + v1 + " is set " + il2Str); } } catch (IndexOutOfBoundsException e) { // checking specification conditions if ( index < 0 || index >= arrayLength ) { display("expected IndexOutOfBoundsException " + il2Str); } else { complain("unexpected IndexOutOfBoundsException " + il2Str); return false; } } catch (Exception e) { complain("Unexpected exception: " + e + " " + il2Str); return false; } return true; } }