test/hotspot/jtreg/vmTestbase/nsk/jdi/VoidValue/hashCode/hashcode001/hashcode001.java
changeset 50018 3ba0d8631f24
child 53869 34906de6c017
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jdi/VoidValue/hashCode/hashcode001/hashcode001.java	Sat May 05 09:24:29 2018 -0700
@@ -0,0 +1,609 @@
+/*
+ * Copyright (c) 2001, 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.
+ */
+
+
+/*
+ * @test
+ *
+ * @summary converted from VM Testbase nsk/jdi/VoidValue/hashCode/hashcode001.
+ * VM Testbase keywords: [quick, jpda, jdi]
+ * VM Testbase readme:
+ * DESCRIPTION:
+ *     The test for the implementation of an object of the type
+ *     VoidValue.
+ *     The test checks up that a result of the method
+ *     com.sun.jdi.VoidValue.hashCode()
+ *     complies with its spec:
+ *     public int hashCode()
+ *     Returns the hash code value for this VoidValue.
+ *     Returns: the hash code
+ *     Overrides: hashCode in class java.lang.Object
+ *     The test works as follows:
+ *     A debugger program - nsk.jdi.VoidValue.hashCode.hashcode001;
+ *     a debuggee program - nsk.jdi.VoidValue.hashCode.hashcode001a.
+ *     Using nsk.jdi.share classes,
+ *     the debugger gets the debuggee running on another JavaVM,
+ *     creates the object debuggee.VM,
+ *     establishes a pipe with the debuggee program, and then
+ *     send to the programm commands, to which the debuggee replies
+ *     via the pipe. Upon getting reply,
+ *     the debugger calls corresponding debuggee.VM methods to get
+ *     needed data and compares the data got to the data expected.
+ *     In case of mismatch the test produces the return value 97 and
+ *     a corresponding error message(s).
+ *     Otherwise, the test is passed and produces
+ *     the return value 95 and no message.
+ * COMMENTS:
+ *
+ * @library /vmTestbase
+ *          /test/lib
+ * @run driver jdk.test.lib.FileInstaller . .
+ * @build nsk.jdi.VoidValue.hashCode.hashcode001.hashcode001
+ *        nsk.jdi.VoidValue.hashCode.hashcode001.hashcode001a
+ * @run main/othervm PropertyResolvingWrapper
+ *      nsk.jdi.VoidValue.hashCode.hashcode001.hashcode001
+ *      -verbose
+ *      -arch=${os.family}-${os.simpleArch}
+ *      -waittime=5
+ *      -debugee.vmkind=java
+ *      -transport.address=dynamic
+ *      "-debugee.vmkeys=${test.vm.opts} ${test.java.opts}"
+ */
+
+package nsk.jdi.VoidValue.hashCode.hashcode001;
+
+import nsk.share.*;
+import nsk.share.jpda.*;
+import nsk.share.jdi.*;
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import com.sun.jdi.request.*;
+import java.util.*;
+import java.io.*;
+
+/**
+ * The test for the implementation of an object of the type     <BR>
+ * VoidValue.                                                   <BR>
+ *                                                              <BR>
+ * The test checks up that results of the method                <BR>
+ * <code>com.sun.jdi.VoidValue.hashCode()</code>                <BR>
+ * complies with its spec.                                      <BR>
+ * <BR>
+ * The cases for testing are as follows :               <BR>
+ *                                                      <BR>
+ * when a gebuggee is suspended at a breakpoint         <BR>
+ * set by a debugger,                                   <BR>
+ * the debugger invokes debuggee's methods:             <BR>
+ *    void vdValue1(); void vdValue1(); void vdValue2();<BR>
+ * to form the follwing objects:  Value returnvdValue1, <BR>
+ *    Value returnvdValue2, and Value returnvdValue3;   <BR>
+ *                                                      <BR>
+ * performs following casts:                            <BR>
+ *    VoidValue vdValue1 = (VoidValue) returnvdValue1;  <BR>
+ *    VoidValue vdValue2 = (VoidValue) returnvdValue2;  <BR>
+ *    VoidValue vdValue3 = (VoidValue) returnvdValue3;  <BR>
+ *                                                      <BR>
+ * and checks up that each of the following is true:    <BR>
+ *                                                      <BR>
+ *     vdValue1.hashCode() == vdValue2.hashCode()       <BR>
+ *     vdValue1.hashCode() == vdValue3.hashCode()       <BR>
+ * <BR>
+ */
+
+public class hashcode001 {
+
+    //----------------------------------------------------- templete section
+    static final int PASSED = 0;
+    static final int FAILED = 2;
+    static final int PASS_BASE = 95;
+
+    //----------------------------------------------------- templete parameters
+    static final String
+    sHeader1 = "\n==> nsk/jdi/VoidValue/hashCode/hashcode001",
+    sHeader2 = "--> debugger: ",
+    sHeader3 = "##> debugger: ";
+
+    //----------------------------------------------------- main method
+
+    public static void main (String argv[]) {
+        int result = run(argv, System.out);
+        System.exit(result + PASS_BASE);
+    }
+
+    public static int run (String argv[], PrintStream out) {
+        return new hashcode001().runThis(argv, out);
+    }
+
+     //--------------------------------------------------   log procedures
+
+    //private static boolean verbMode = false;
+
+    private static Log  logHandler;
+
+    private static void log1(String message) {
+        logHandler.display(sHeader1 + message);
+    }
+    private static void log2(String message) {
+        logHandler.display(sHeader2 + message);
+    }
+    private static void log3(String message) {
+        logHandler.complain(sHeader3 + message);
+    }
+
+    //  ************************************************    test parameters
+
+    private String debuggeeName =
+        "nsk.jdi.VoidValue.hashCode.hashcode001.hashcode001a";
+
+    private String testedClassName =
+        "nsk.jdi.VoidValue.hashCode.hashcode001.Threadhashcode001a";
+
+    //====================================================== test program
+    //------------------------------------------------------ common section
+    static ArgumentHandler      argsHandler;
+
+    static int waitTime;
+
+    static VirtualMachine      vm            = null;
+    static EventRequestManager eventRManager = null;
+    static EventQueue          eventQueue    = null;
+    static EventSet            eventSet      = null;
+
+    ReferenceType     testedclass  = null;
+    ThreadReference   thread2      = null;
+    ThreadReference   mainThread   = null;
+
+    static int  testExitCode = PASSED;
+
+    static final int returnCode0 = 0;
+    static final int returnCode1 = 1;
+    static final int returnCode2 = 2;
+    static final int returnCode3 = 3;
+    static final int returnCode4 = 4;
+
+    //------------------------------------------------------ methods
+
+    private int runThis (String argv[], PrintStream out) {
+
+        Debugee debuggee;
+
+        argsHandler     = new ArgumentHandler(argv);
+        logHandler      = new Log(out, argsHandler);
+        Binder binder   = new Binder(argsHandler, logHandler);
+
+        if (argsHandler.verbose()) {
+            debuggee = binder.bindToDebugee(debuggeeName + " -vbs");  // *** tp
+        } else {
+            debuggee = binder.bindToDebugee(debuggeeName);            // *** tp
+        }
+
+        waitTime = argsHandler.getWaitTime();
+
+
+        IOPipe pipe     = new IOPipe(debuggee);
+
+        debuggee.redirectStderr(out);
+        log2("setvalue003a debuggee launched");
+        debuggee.resume();
+
+        String line = pipe.readln();
+        if ((line == null) || !line.equals("ready")) {
+            log3("signal received is not 'ready' but: " + line);
+            return FAILED;
+        } else {
+            log2("'ready' recieved");
+        }
+
+        VirtualMachine vm = debuggee.VM();
+
+    //------------------------------------------------------  testing section
+        log1("      TESTING BEGINS");
+
+        for (int i = 0; ; i++) {
+            pipe.println("newcheck");
+            line = pipe.readln();
+
+            if (line.equals("checkend")) {
+                log2("     : returned string is 'checkend'");
+                break ;
+            } else if (!line.equals("checkready")) {
+                log3("ERROR: returned string is not 'checkready'");
+                testExitCode = FAILED;
+                break ;
+            }
+
+            log1("new check: #" + i);
+
+            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ variable part
+
+            int expresult = returnCode0;
+
+            eventRManager = vm.eventRequestManager();
+            eventQueue    = vm.eventQueue();
+
+            List            allThreads   = null;
+            ListIterator    listIterator = null;
+            List            classes      = null;
+
+            String threadName = "Thread2";
+
+            String breakpointMethod1 = "run";
+            String bpLine1          = "breakpointLineNumber1";
+
+            BreakpointRequest breakpRequest1 = null;
+
+
+            label0: {
+
+                log2("getting ThreadReference object");
+                try {
+                    allThreads  = vm.allThreads();
+                    classes     = vm.classesByName(testedClassName);
+                    testedclass = (ReferenceType) classes.get(0);
+                } catch ( Exception e) {
+                    log3("ERROR: Exception at very beginning !? : " + e);
+                    expresult = returnCode1;
+                    break label0;
+                }
+
+                listIterator = allThreads.listIterator();
+                for (;;) {
+                    try {
+                        thread2 = (ThreadReference) listIterator.next();
+                        if (thread2.name().equals(threadName))
+                            break ;
+                    } catch ( NoSuchElementException e ) {
+                        log3("ERROR: NoSuchElementException for listIterator.next()");
+                        log3("ERROR: NO THREAD2 ?????????!!!!!!!");
+                        expresult = returnCode1;
+                        break label0;
+                    }
+                }
+
+                log2("setting up breakpoint");
+
+                breakpRequest1 = settingBreakpoint(breakpointMethod1, bpLine1, "one");
+                if (breakpRequest1 == null) {
+                    expresult = returnCode1;
+                    break label0;
+                }
+            }
+
+            label1: {
+
+                if (expresult != returnCode0)
+                       break label1;
+
+                log2("     enabling breakpRequest1");
+                breakpRequest1.enable();
+
+                log2("       forcing the main thread to leave synchronized block");
+                pipe.println("continue");
+                line = pipe.readln();
+                if (!line.equals("docontinue")) {
+                    log3("ERROR: returned string is not 'docontinue'");
+                    expresult = returnCode4;
+                    break label1;
+                }
+
+                log2("      getting a breakpoint event");
+                expresult = breakpoint();
+                if (expresult != returnCode0)
+                    break label1;
+
+
+                Value returnvdValue1 = null;
+                Value returnvdValue2 = null;
+                Value returnvdValue3 = null;
+                List  invokeMethods  = null;
+                Method invokeMethod  = null;
+                List<Value> argumentList    = null;
+
+
+                invokeMethods  =  testedclass.methodsByName("vdValue1");
+                invokeMethod = (Method) invokeMethods.get(0);
+
+                argumentList = Collections.<Value>emptyList();
+
+                try {
+                    log2("      1st invoking hashcode001a.vdValue1();  no Exception expected");
+                    returnvdValue1 = thread2.invokeMethod(thread2,
+                                      invokeMethod, argumentList, 0);
+                    log2("      2nd invoking hashcode001a.vdValue1();  no Exception expected");
+                    returnvdValue2 = thread2.invokeMethod(thread2,
+                                     invokeMethod, argumentList, 0);
+                } catch ( Exception e ) {
+                     log3("ERROR: Exception: " + e);
+                     expresult = returnCode1;
+                     break label1;
+                }
+
+                        //  invoking hashcode001a.vdValue2()
+
+                invokeMethods = testedclass.methodsByName("vdValue2");
+                invokeMethod  = (Method) invokeMethods.get(0);
+
+                try {
+                    log2("      invoking hashcode001a.vdValue2();  no Exception expected");
+                    returnvdValue3 = thread2.invokeMethod(thread2,
+                                     invokeMethod, argumentList, 0);
+                } catch ( Exception e ) {
+                     log3("ERROR: Exception: " + e);
+                     expresult = returnCode1;
+                     break label1;
+                }
+
+
+                VoidValue vdValue1 = null;
+                VoidValue vdValue2 = null;
+                VoidValue vdValue3 = null;
+
+                try {
+                    log2("     checking up cast: vdValue1 = (VoidValue) returnvdValue1; no Exception expected");
+                    vdValue1 = (VoidValue) returnvdValue1;
+                } catch ( ClassCastException e ) {
+                    log3("ERROR : ClassCastException");
+                    expresult = returnCode1;
+                    break label1;
+                }
+
+                try {
+                    log2("     checking up cast: vdValue2 = (VoidValue) returnvdValue2; no Exception expected");
+                    vdValue2 = (VoidValue) returnvdValue2;
+                } catch ( ClassCastException e ) {
+                    log3("ERROR : ClassCastException");
+                    expresult = returnCode1;
+                    break label1;
+                }
+
+                try {
+                    log2("     checking up cast: vdValue3 = (VoidValue) returnvdValue3; no Exception expected");
+                    vdValue3 = (VoidValue) returnvdValue3;
+                } catch ( ClassCastException e ) {
+                    log3("ERROR : ClassCastException");
+                    expresult = returnCode1;
+                    break label1;
+                }
+
+                log2("     checking up: dValue1.hashCode() == vdValue2.hashCode()");
+                if (vdValue1.hashCode() != vdValue2.hashCode() ) {
+                    log3("ERROR: vdValue1.hashCode() != vdValue2.hashCode()");
+                    expresult = returnCode1;
+                }
+                log2("     checking up: dValue1.hashCode() == vdValue3.hashCode()");
+                if (vdValue1.hashCode() != vdValue3.hashCode() ) {
+                    log3("ERROR: vdValue1.hashCode() != vdValue3.hashCode()");
+                    expresult = returnCode1;
+                }
+            }
+            log2("      resuming the vm");
+            vm.resume();
+            //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+            log2("     the end of testing");
+            if (expresult != returnCode0)
+                testExitCode = FAILED;
+        }
+        log1("      TESTING ENDS");
+
+    //--------------------------------------------------   test summary section
+    //-------------------------------------------------    standard end section
+
+        pipe.println("quit");
+        log2("waiting for the debuggee to finish ...");
+        debuggee.waitFor();
+
+        int status = debuggee.getStatus();
+        if (status != PASSED + PASS_BASE) {
+            log3("debuggee returned UNEXPECTED exit status: " +
+                   status + " != PASS_BASE");
+            testExitCode = FAILED;
+        } else {
+            log2("debuggee returned expected exit status: " +
+                   status + " == PASS_BASE");
+        }
+
+        if (testExitCode != PASSED) {
+            System.out.println("TEST FAILED");
+        }
+        return testExitCode;
+    }
+
+
+
+   /*
+    * private BreakpointRequest settingBreakpoint(String, String, String)
+    *
+    * It sets up a breakpoint within a given method at given line number
+    * for the thread2 only.
+    * Third parameter is required for any case in future debugging, as if.
+    *
+    * Return codes:
+    *  = BreakpointRequest object  in case of success
+    *  = null   in case of an Exception thrown within the method
+    */
+
+    private BreakpointRequest settingBreakpoint ( String methodName,
+                                                  String bpLine,
+                                                  String property) {
+
+        log2("setting up a breakpoint: method: '" + methodName + "' line: " + bpLine );
+
+        List              alllineLocations = null;
+        Location          lineLocation     = null;
+        BreakpointRequest breakpRequest    = null;
+
+        try {
+            Method  method  = (Method) testedclass.methodsByName(methodName).get(0);
+
+            alllineLocations = method.allLineLocations();
+
+            int n =
+                ( (IntegerValue) testedclass.getValue(testedclass.fieldByName(bpLine) ) ).value();
+            if (n > alllineLocations.size()) {
+                log3("ERROR:  TEST_ERROR_IN_settingBreakpoint(): number is out of bound of method's lines");
+            } else {
+                lineLocation = (Location) alllineLocations.get(n);
+                try {
+                    breakpRequest = eventRManager.createBreakpointRequest(lineLocation);
+                    breakpRequest.putProperty("number", property);
+                    breakpRequest.addThreadFilter(thread2);
+                    breakpRequest.setSuspendPolicy( EventRequest.SUSPEND_EVENT_THREAD);
+                } catch ( Exception e1 ) {
+                    log3("ERROR: inner Exception within settingBreakpoint() : " + e1);
+                    breakpRequest    = null;
+                }
+            }
+        } catch ( Exception e2 ) {
+            log3("ERROR: ATTENTION:  outer Exception within settingBreakpoint() : " + e2);
+            breakpRequest    = null;
+        }
+
+        if (breakpRequest == null)
+            log2("      A BREAKPOINT HAS NOT BEEN SET UP");
+        else
+            log2("      a breakpoint has been set up");
+
+        return breakpRequest;
+    }
+
+
+    /*
+     * private int breakpoint ()
+     *
+     * It removes events from EventQueue until gets first BreakpointEvent.
+     * To get next EventSet value, it uses the method
+     *    EventQueue.remove(int timeout)
+     * The timeout argument passed to the method, is "waitTime*60000".
+     * Note: the value of waitTime is set up with
+     *       the method ArgumentHandler.getWaitTime() at the beginning of the test.
+     *
+     * Return codes:
+     *  = returnCode0 - success;
+     *  = returnCode2 - Exception when "eventSet = eventQueue.remove()" is executed
+     *  = returnCode3 - default case when loop of processing an event, that is,
+     *                  an unspecified event was taken from the EventQueue
+     */
+
+    private int breakpoint () {
+
+        int returnCode = returnCode0;
+
+        log2("       waiting for BreakpointEvent");
+
+        labelBP:
+            for (;;) {
+
+                log2("       new:  eventSet = eventQueue.remove();");
+                try {
+                    eventSet = eventQueue.remove(waitTime*60000);
+                    if (eventSet == null) {
+                        log3("ERROR:  timeout for waiting for a BreakpintEvent");
+                        returnCode = returnCode3;
+                        break labelBP;
+                    }
+                } catch ( Exception e ) {
+                    log3("ERROR: Exception for  eventSet = eventQueue.remove(); : " + e);
+                    returnCode = 1;
+                    break labelBP;
+                }
+
+                if (eventSet != null) {
+
+                    log2("     :  eventSet != null;  size == " + eventSet.size());
+
+                    EventIterator eIter = eventSet.eventIterator();
+                    Event         ev    = null;
+
+                    for (; eIter.hasNext(); ) {
+
+                        if (returnCode != returnCode0)
+                            break;
+
+                        ev = eIter.nextEvent();
+
+                    ll: for (int ifor =0;  ; ifor++) {
+
+                        try {
+                          switch (ifor) {
+
+                          case 0:  AccessWatchpointEvent awe = (AccessWatchpointEvent) ev;
+                                   log2("      AccessWatchpointEvent removed");
+                                   break ll;
+                          case 1:  BreakpointEvent be = (BreakpointEvent) ev;
+                                   log2("      BreakpointEvent removed");
+                                   break labelBP;
+                          case 2:  ClassPrepareEvent cpe = (ClassPrepareEvent) ev;
+                                   log2("      ClassPreparEvent removed");
+                                   break ll;
+                          case 3:  ClassUnloadEvent cue = (ClassUnloadEvent) ev;
+                                   log2("      ClassUnloadEvent removed");
+                                   break ll;
+                          case 4:  ExceptionEvent ee = (ExceptionEvent) ev;
+                                   log2("      ExceptionEvent removed");
+                                   break ll;
+                          case 5:  MethodEntryEvent mene = (MethodEntryEvent) ev;
+                                   log2("      MethodEntryEvent removed");
+                                   break ll;
+                          case 6:  MethodExitEvent mexe = (MethodExitEvent) ev;
+                                   log2("      MethodExiEvent removed");
+                                   break ll;
+                          case 7:  ModificationWatchpointEvent mwe = (ModificationWatchpointEvent) ev;
+                                   log2("      ModificationWatchpointEvent removed");
+                                   break ll;
+                          case 8:  StepEvent se = (StepEvent) ev;
+                                   log2("      StepEvent removed");
+                                   break ll;
+                          case 9:  ThreadDeathEvent tde = (ThreadDeathEvent) ev;
+                                   log2("      ThreadDeathEvent removed");
+                                   break ll;
+                          case 10: ThreadStartEvent tse = (ThreadStartEvent) ev;
+                                   log2("      ThreadStartEvent removed");
+                                   break ll;
+                          case 11: VMDeathEvent vmde = (VMDeathEvent) ev;
+                                   log2("      VMDeathEvent removed");
+                                   break ll;
+                          case 12: VMStartEvent vmse = (VMStartEvent) ev;
+                                   log2("      VMStartEvent removed");
+                                   break ll;
+                          case 13: WatchpointEvent we = (WatchpointEvent) ev;
+                                   log2("      WatchpointEvent removed");
+                                   break ll;
+
+                          default: log3("ERROR:  default case for casting event");
+                                   returnCode = returnCode3;
+                                   break ll;
+                          } // switch
+                        } catch ( ClassCastException e ) {
+                        }   // try
+                    }       // ll: for (int ifor =0;  ; ifor++)
+                }           // for (; ev.hasNext(); )
+            }
+        }
+        if (returnCode == returnCode0)
+            log2("     :  eventSet == null:  EventQueue is empty");
+
+        return returnCode;
+    }
+
+}