Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdi/ClassPrepareEvent/thread/thread001.java
41161 views
/*1* Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223package nsk.jdi.ClassPrepareEvent.thread;2425import com.sun.jdi.*;26import com.sun.jdi.event.*;27import com.sun.jdi.request.*;2829import java.io.*;30import java.util.Iterator;3132import nsk.share.*;33import nsk.share.jpda.*;34import nsk.share.jdi.*;353637// This class is the debugger in the test3839public class thread001 {40static final int PASSED = 0;41static final int FAILED = 2;42static final int JCK_STATUS_BASE = 95;4344static final int TIMEOUT_DELTA = 1000; // milliseconds4546static final String COMMAND_READY = "ready";47static final String COMMAND_QUIT = "quit";48static final String COMMAND_RUN = "run";49static final String COMMAND_DONE = "done";50static final String COMMAND_ERROR = "error";5152static final String PACKAGE_NAME = "nsk.jdi.ClassPrepareEvent.thread";53static final String DEBUGEE_NAME = PACKAGE_NAME + ".thread001a";5455static private Debugee debuggee;56static private VirtualMachine vm;57static private IOPipe pipe;58static private Log log;59static private ArgumentHandler argHandler;6061static private ClassPrepareRequest checkedRequest;62static private ThreadReference eventThread;6364static private String checkedThreads[][] = {65{"main", "thread001a", "0"},66{"main", "InnerThread", "0"},67{"innerThread", "OuterThread", "0"},68{"innerThread", "ClassForInnerThread", "0"},69{"outerThread", "ClassForOuterThread", "0"}70};7172static private int threadStatus;7374static private volatile boolean testFailed, eventsReceived, threadsStarted;75static private int eventTimeout;7677public static void main (String args[]) {78System.exit(run(args, System.out) + JCK_STATUS_BASE);79}8081public static int run(final String args[], final PrintStream out) {82String command;8384testFailed = false;85eventsReceived = false;86threadsStarted = false;8788argHandler = new ArgumentHandler(args);89log = new Log(out, argHandler);90eventTimeout = argHandler.getWaitTime() * 60 * 1000; // milliseconds9192// launch debugee93Binder binder = new Binder(argHandler, log);94log.display("Connecting to debuggee");95debuggee = binder.bindToDebugee(DEBUGEE_NAME);96debuggee.redirectStderr(log, "refType001a >");97pipe = debuggee.createIOPipe();98vm = debuggee.VM();99100// create request and wait for expected events101try {102103// create request for ClassPrepareEvent104log.display("Creating request for ClassPrepareEvent");105EventRequestManager erManager = debuggee.VM().eventRequestManager();106if ((checkedRequest = erManager.createClassPrepareRequest()) == null) {107throw new Failure("TEST FAILED: unable to create ClassPrepareRequest");108}109log.display("ClassPrepareRequest is created");110111checkedRequest.setSuspendPolicy(EventRequest.SUSPEND_ALL);112// checkedRequest.enable();113114switch (checkedRequest.suspendPolicy()) {115case EventRequest.SUSPEND_NONE:116log.display("Suspend policy is SUSPEND_NONE");117break;118case EventRequest.SUSPEND_ALL:119log.display("Suspend policy is SUSPEND_ALL");120break;121case EventRequest.SUSPEND_EVENT_THREAD:122log.display("Suspend policy is SUSPEND_EVENT_THREAD");123break;124default:125throw new Failure("TEST BUG: Unknown suspend policy: " + checkedRequest.suspendPolicy());126}127128// define separate thread to handle received events129class EventHandler extends Thread {130131public void run() {132133// handle events until all threads started and all expected events received134while (!(threadsStarted && eventsReceived)) {135EventSet eventSet = null;136try {137eventSet = vm.eventQueue().remove(TIMEOUT_DELTA);138} catch (InterruptedException e) {139throw new Failure("Unexpected InterruptedException while receiving events: " + e);140}141142if (eventSet == null) {143continue;144}145146// handle each event147EventIterator eventIterator = eventSet.eventIterator();148while (eventIterator.hasNext()) {149Event event = eventIterator.nextEvent();150// log.display("\nEvent received:\n " + event);151152// handle ClassPrepareEvent153if (event instanceof ClassPrepareEvent) {154ClassPrepareEvent castedEvent = (ClassPrepareEvent)event;155log.display("\nClassPrepareEvent received:\n " + event);156157EventRequest eventRequest = castedEvent.request();158if (!(checkedRequest.equals(eventRequest))) {159log.complain("FAILURE 1: eventRequest is not equal to checked request");160testFailed = true;161}162163VirtualMachine eventMachine = castedEvent.virtualMachine();164if (!(vm.equals(eventMachine))) {165log.complain("FAILURE 2: eventVirtualMachine is not equal to checked vm");166testFailed = true;167}168169// test method ClassPrepareEvent.thread()170eventThread = castedEvent.thread();171String threadName = eventThread.name();172if (eventThread == null) {173log.complain("FAILURE 3: ClassPrepareEvent.thread() returns null");174testFailed = true;175} else if ((threadName == null) || (threadName.equals(""))) {176log.complain("FAILURE 4: thread reference has invalid empty name");177testFailed = true;178}179180ReferenceType refType = castedEvent.referenceType();181if (refType == null) {182log.complain("FAILURE 5: ClassPrepareEvent.referenceType() returns null");183testFailed = true;184} else {185186String className = refType.name();187if ( className.startsWith(PACKAGE_NAME)) {188189log.display("Class " + className + " prepared in thread " + threadName);190191// Check that thread is in VirtualMachine.allThreads() list192boolean found = false;193Iterator threadsList = vm.allThreads().iterator();194while (!found && threadsList.hasNext()) {195found = eventThread.equals((ThreadReference)threadsList.next());196}197if (!found) {198log.complain("FAILURE 6: " + threadName + " is not in debuggee's allThreads() list");199testFailed = true;200}201202// Check that all expected debuggee's thread create ClassPrepareEvent only once203for (int i = 0; i < checkedThreads.length; i++) {204if (threadName.equals(checkedThreads[i][0]) && className.endsWith(checkedThreads[i][1])) {205if (checkedThreads[i][2] == "0") {206checkedThreads[i][2] = "1";207} else {208log.complain("FAILURE 7: ClassPrepareEvent for " + threadName + " is received more that once");209testFailed = true;210}211}212}213214// check that thread is correctly suspended215if (checkedRequest.suspendPolicy() == EventRequest.SUSPEND_ALL ||216checkedRequest.suspendPolicy() == EventRequest.SUSPEND_EVENT_THREAD) {217218if (eventThread.isSuspended()) {219log.display("Thread " + threadName + " is correctly suspended");220} else {221log.complain("FAILURE 7: Thread " + threadName + " is not suspended");222testFailed = true;223}224}225226// Check that all expected ClassPrepareEvent are received227eventsReceived = true;228for (int i = 0; i < checkedThreads.length; i++) {229if (checkedThreads[i][2] == "0") {230eventsReceived = false;231}232}233}234}235}236237// ignore each oter event238239} // event handled240241// log.display("Resuming event set");242eventSet.resume();243244} // event set handled245246log.display("eventHandler completed");247248} // for run()249250} // for EventHandler251252EventHandler eventHandler = new EventHandler();253log.display("Starting eventHandler");254eventHandler.start();255256// enable event request and resume debugee257log.display("Enabling ClassPrepareEvent request");258checkedRequest.enable();259260log.display("Resuming debuggee");261debuggee.resume();262263// wait for debugee started264log.display("Waiting for command: " + COMMAND_READY);265command = pipe.readln();266if (!command.equals(COMMAND_READY)) {267throw new Failure("TEST BUG: unexpected debuggee's command: " + command);268}269270// force debugee to start another thread271log.display("Sending a command: " + COMMAND_RUN);272pipe.println(COMMAND_RUN);273274// wait for debugee started requested thread275log.display("Waiting for command: " + COMMAND_DONE);276command = pipe.readln();277if (!command.equals(COMMAND_DONE)) {278log.complain("TEST BUG: unexpected debuggee's command: " + command);279testFailed = true;280}281282// notify EventHandler that all threads started283threadsStarted = true;284285// wait for all expected events received or timeout exceeds286try {287eventHandler.join(eventTimeout);288if (eventHandler.isAlive()) {289log.complain("FAILURE 20: Timeout for waiting event was exceeded");290eventHandler.interrupt();291testFailed = true;292}293} catch (InterruptedException e) {294log.complain("TEST INCOMPLETE: InterruptedException caught while waiting for eventHandler's death");295testFailed = true;296}297298// check that all expected debuggee's threads created ClassPrepareEvent299for (int i = 0; i < checkedThreads.length; i++) {300if (checkedThreads[i][2].equals("0")) {301log.complain("FAILURE 9: ClassPrepareEvent for " + checkedThreads[i][1] +302" in thread " + checkedThreads[i][0] + " is not received");303testFailed = true;304}305}306307} catch (Failure e) {308log.complain("TEST FAILURE: " + e.getMessage());309testFailed = true;310} catch (Exception e) {311log.complain("Unexpected exception: " + e);312e.printStackTrace(out);313testFailed = true;314} finally {315316317// disable event requests to prevent appearance of further events318if (checkedRequest != null && checkedRequest.isEnabled()) {319log.display("Disabling StepEvent request");320checkedRequest.disable();321}322323// force debugee to exit324log.display("Sending command: " + COMMAND_QUIT);325pipe.println(COMMAND_QUIT);326327// wait for debuggee exits and analize its exit code328log.display("Waiting for debuggee terminating");329int debuggeeStatus = debuggee.endDebugee();330if (debuggeeStatus == PASSED + JCK_STATUS_BASE) {331log.display("Debuggee PASSED with exit code: " + debuggeeStatus);332} else {333log.complain("Debuggee FAILED with exit code: " + debuggeeStatus);334testFailed = true;335}336}337338// check test results339if (testFailed) {340log.complain("TEST FAILED");341return FAILED;342}343344log.display("TEST PASSED");345return PASSED;346}347}348349350