Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdwp/VirtualMachine/ReleaseEvents/releaseevents002.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.jdwp.VirtualMachine.ReleaseEvents;2425import java.io.*;2627import nsk.share.*;28import nsk.share.jpda.*;29import nsk.share.jdwp.*;3031/**32* Test for JDWP command: VirtualMachine.ReleaseEvents.33*34* See releaseevents002.README for description of test execution.35*36* This class represents debugger part of the test.37* Test is executed by invoking method runIt().38*39* @see #runIt()40*/41public class releaseevents002 {4243// exit status constants44static final int JCK_STATUS_BASE = 95;45static final int PASSED = 0;46static final int FAILED = 2;4748// package and classes names constants49static final String PACKAGE_NAME = "nsk.jdwp.VirtualMachine.ReleaseEvents";50static final String TEST_CLASS_NAME = PACKAGE_NAME + "." + "releaseevents002";51static final String DEBUGEE_CLASS_NAME = TEST_CLASS_NAME + "a";5253// tested JDWP command constants54static final String JDWP_COMMAND_NAME = "VirtualMachine.ReleaseEvents";55static final int JDWP_COMMAND_ID = JDWP.Command.VirtualMachine.ReleaseEvents;56static final byte TESTED_EVENT_KIND = JDWP.EventKind.BREAKPOINT;57static final byte TESTED_EVENT_SUSPEND_POLICY = JDWP.SuspendPolicy.ALL;58static final byte TESTED_EVENT_MODIFIER = JDWP.EventModifierKind.LOCATION_ONLY;5960// name and signature of the tested class61static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME + "$" + "TestedClass";62static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";6364// name of field and method of tested class65static final String TESTED_METHOD_NAME = "run";66static final int BREAKPOINT_LINE = releaseevents002a.BREAKPOINT_LINE;6768// usual scaffold objects69ArgumentHandler argumentHandler = null;70Log log = null;71Binder binder = null;72Debugee debugee = null;73Transport transport = null;74int waitTime = 0; // minutes75long timeout = 0; // milliseconds76boolean dead = false;77boolean success = true;7879// obtained data80long testedClassID = 0;81long testedMethodID = 0;82int eventRequestID = 0;8384// -------------------------------------------------------------------8586/**87* Start test from command line.88*/89public static void main(String argv[]) {90System.exit(run(argv,System.out) + JCK_STATUS_BASE);91}9293/**94* Start test from JCK-compilant environment.95*/96public static int run(String argv[], PrintStream out) {97return new releaseevents002().runIt(argv, out);98}99100// -------------------------------------------------------------------101102/**103* Perform test execution.104*/105public int runIt(String argv[], PrintStream out) {106107// make log for debugger messages108argumentHandler = new ArgumentHandler(argv);109log = new Log(out, argumentHandler);110waitTime = argumentHandler.getWaitTime();111timeout = waitTime * 60 * 1000;112113// execute test and display results114try {115log.display("\n>>> Starting debugee \n");116117// launch debuggee118binder = new Binder(argumentHandler, log);119log.display("Launching debugee");120debugee = binder.bindToDebugee(DEBUGEE_CLASS_NAME);121transport = debugee.getTransport();122log.display(" ... debugee launched");123log.display("");124125// set timeout for debuggee responces126log.display("Setting timeout for debuggee responces: " + waitTime + " minute(s)");127transport.setReadTimeout(timeout);128log.display(" ... timeout set");129130// wait for debuggee started131log.display("Waiting for VM_INIT event");132debugee.waitForVMInit();133log.display(" ... VM_INIT event received");134135// query debugee for VM-dependent ID sizes136log.display("Querying for IDSizes");137debugee.queryForIDSizes();138log.display(" ... size of VM-dependent types adjusted");139140// get debuggee prepared for testing141log.display("\n>>> Get debuggee prepared for testing \n");142prepareForTest();143144// test JDWP command145log.display("\n>>> Testing JDWP command \n");146147// hold events148log.display("Holding events into debuggee");149holdEvents();150log.display(" ... events held");151152// resume debuggee153log.display("Resuming debuggee");154debugee.resume();155log.display(" ... debuggee resumed");156157// release events158log.display("Release events into debuggee");159releaseEvents();160log.display(" ... events released");161162// wait for BREAKPOINT event163log.display("Waiting for BREAKPOINT event");164waitForBreakpointEvent();165166} catch (Failure e) {167log.complain("TEST FAILED: " + e.getMessage());168success = false;169} catch (Exception e) {170e.printStackTrace(out);171log.complain("Caught unexpected exception while running the test:\n\t" + e);172success = false;173} finally {174// quit debugee175log.display("\n>>> Finishing test \n");176quitDebugee();177}178179// check test results180if (!success) {181log.complain("TEST FAILED");182return FAILED;183}184185out.println("TEST PASSED");186return PASSED;187188}189190/**191* Prepare debuggee for testing.192*/193void prepareForTest() {194// wait for tested class loaded195log.display("Waiting for tested class loaded");196testedClassID = debugee.waitForClassLoaded(TESTED_CLASS_NAME, JDWP.SuspendPolicy.ALL);197log.display(" ... got classID: " + testedClassID);198log.display("");199200// get methodID for breakpoint method201log.display("Getting breakpoint methodID by name: " + TESTED_METHOD_NAME);202testedMethodID = debugee.getMethodID(testedClassID, TESTED_METHOD_NAME, true);203log.display(" ... got methodID: " + testedMethodID);204205// make request for BREAKPOINT event206log.display("Making request for BREAKPOINT event at: "207+ TESTED_METHOD_NAME + ":" + BREAKPOINT_LINE);208eventRequestID = debugee.requestBreakpointEvent(JDWP.TypeTag.CLASS, testedClassID,209testedMethodID, BREAKPOINT_LINE,210JDWP.SuspendPolicy.ALL);211log.display(" ... got requestID: " + eventRequestID);212}213214/**215* Hold events into debuggee.216*/217void holdEvents() {218CommandPacket command = new CommandPacket(JDWP.Command.VirtualMachine.HoldEvents);219ReplyPacket reply = debugee.receiveReplyFor(command);220}221222/**223* Release events into debuggee.224*/225void releaseEvents() {226CommandPacket command = new CommandPacket(JDWP.Command.VirtualMachine.ReleaseEvents);227ReplyPacket reply = debugee.receiveReplyFor(command);228}229230/**231* Wait for requested BREAKPOINT event NOT occured.232*/233void waitForBreakpointEvent() {234235// receive event236EventPacket eventPacket = null;237try {238eventPacket = debugee.receiveEvent();239log.display("Event received after releasing events into debuggee");240} catch (Failure e) {241log.complain("No requested event received after releasing events into debuggee:\n\t"242+ e.getMessage());243success = false;244return;245}246247// start parsing reply packet data248log.display("Parsing event packet:");249eventPacket.resetPosition();250251// get suspendPolicy value252byte suspendPolicy = 0;253try {254suspendPolicy = eventPacket.getByte();255log.display(" suspendPolicy: " + suspendPolicy);256} catch (BoundException e) {257log.complain("Unable to get suspendPolicy value from received event packet:\n\t"258+ e.getMessage());259success = false;260return;261}262263// get events count264int events = 0;265try {266events = eventPacket.getInt();267log.display(" events: " + events);268} catch (BoundException e) {269log.complain("Unable to get events count from received event packet:\n\t"270+ e.getMessage());271success = false;272return;273}274275// check events count276if (events < 0) {277log.complain("Negative value of events number in received event packet: " +278events + " (expected: " + 1 + ")");279success = false;280} else if (events != 1) {281log.complain("Invalid number of events in received event packet: " +282events + " (expected: " + 1 + ")");283success = false;284}285286// extract each event287long eventThreadID = 0;288for (int i = 0; i < events; i++) {289log.display(" event #" + i + ":");290291// get eventKind292byte eventKind = 0;293try {294eventKind = eventPacket.getByte();295log.display(" eventKind: " + eventKind);296} catch (BoundException e) {297log.complain("Unable to get eventKind of event #" + i + " from received event packet:\n\t"298+ e.getMessage());299success = false;300return;301}302303// check eventKind304if (eventKind == JDWP.EventKind.VM_DEATH) {305log.display("Unexpected VM_DEATH event received intead of BREAKPOINT event");306success = false;307dead = true;308return;309} else if (eventKind == JDWP.EventKind.BREAKPOINT) {310log.display("Expected BREAKPOINT event received in event packet: " +311eventKind + " (expected: " + JDWP.EventKind.BREAKPOINT + ")");312} else {313log.complain("Unexpected eventKind of event " + i + " in event packet: " +314eventKind + " (expected: " + JDWP.EventKind.BREAKPOINT + ")");315success = false;316return;317}318319// get requestID320int requestID = 0;321try {322requestID = eventPacket.getInt();323log.display(" requestID: " + requestID);324} catch (BoundException e) {325log.complain("Unable to get requestID of event #" + i + " from BREAKPOINT event packet:\n\t"326+ e.getMessage());327success = false;328return;329}330331// check requestID332if (requestID != eventRequestID) {333log.complain("Unexpected requestID of event " + i + " in BREAKPOINT event packet: " +334requestID + " (expected: " + eventRequestID + ")");335success = false;336}337338// get threadID339long threadID = 0;340try {341threadID = eventPacket.getObjectID();342log.display(" threadID: " + threadID);343} catch (BoundException e) {344log.complain("Unable to get threadID of event #" + i + " from BREAKPOINT event packet:\n\t"345+ e.getMessage());346success = false;347return;348}349350// get location351JDWP.Location location = null;352try {353location = eventPacket.getLocation();354log.display(" location: " + location);355} catch (BoundException e) {356log.complain("Unable to get location of event #" + i + " from BREAKPOINT event packet:\n\t"357+ e.getMessage());358success = false;359return;360}361}362363// check for extra data in event packet364if (!eventPacket.isParsed()) {365log.complain("Extra trailing bytes found in event packet at: "366+ eventPacket.offsetString());367success = false;368}369370log.display(" ... event packet parsed");371}372373/**374* Disconnect debuggee and wait for it exited.375*/376void quitDebugee() {377if (debugee == null)378return;379380// disconnect debugee if not dead381if (!dead) {382try {383log.display("Disconnecting debuggee");384debugee.dispose();385log.display(" ... debuggee disconnected");386} catch (Failure e) {387log.display("Failed to finally disconnect debuggee:\n\t"388+ e.getMessage());389}390}391392// wait for debugee exited393log.display("Waiting for debuggee exit");394int code = debugee.waitFor();395log.display(" ... debuggee exited with exit code: " + code);396397// analize debugee exit status code398if (code != JCK_STATUS_BASE + PASSED) {399log.complain("Debuggee FAILED with exit code: " + code);400success = false;401}402}403404}405406407