Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/BREAKPOINT/breakpoint001.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.Event.BREAKPOINT;2425import java.io.*;2627import nsk.share.*;28import nsk.share.jpda.*;29import nsk.share.jdwp.*;3031/**32* Test for JDWP event: BREAKPOINT.33*34* See breakpoint001.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* JDWP event is tested in the method waitForTestedEvent().39*40* @see #runIt()41* @see #waitForTestedEvent()42*/43public class breakpoint001 {4445// exit status constants46static final int JCK_STATUS_BASE = 95;47static final int PASSED = 0;48static final int FAILED = 2;4950// package and classes names constants51static final String PACKAGE_NAME = "nsk.jdwp.Event.BREAKPOINT";52static final String TEST_CLASS_NAME = PACKAGE_NAME + "." + "breakpoint001";53static final String DEBUGEE_CLASS_NAME = TEST_CLASS_NAME + "a";5455// tested JDWP event constants56static final byte TESTED_EVENT_KIND = JDWP.EventKind.BREAKPOINT;57static final byte TESTED_EVENT_SUSPEND_POLICY = JDWP.SuspendPolicy.ALL;5859// name and signature of the tested class60static final String TESTED_CLASS_NAME = DEBUGEE_CLASS_NAME + "$" + "TestedClass";61static final String TESTED_CLASS_SIGNATURE = "L" + TESTED_CLASS_NAME.replace('.', '/') + ";";62static final String TESTED_THREAD_NAME = "TestedThread";6364// name of field and method of tested class65static final String THREAD_FIELD_NAME = "thread";66static final String TESTED_METHOD_NAME = "run";67static final int BREAKPOINT_LINE = breakpoint001a.BREAKPOINT_LINE;6869// usual scaffold objects70ArgumentHandler argumentHandler = null;71Log log = null;72Binder binder = null;73Debugee debugee = null;74Transport transport = null;75int waitTime = 0; // minutes76long timeout = 0; // milliseconds77boolean dead = false;78boolean success = true;7980// obtained data81long testedClassID = 0;82long testedThreadID = 0;83long testedMethodID = 0;84JDWP.Location testedLocation = null;85int eventRequestID = 0;8687// -------------------------------------------------------------------8889/**90* Start test from command line.91*/92public static void main(String argv[]) {93System.exit(run(argv,System.out) + JCK_STATUS_BASE);94}9596/**97* Start test from JCK-compilant environment.98*/99public static int run(String argv[], PrintStream out) {100return new breakpoint001().runIt(argv, out);101}102103// -------------------------------------------------------------------104105/**106* Perform test execution.107*/108public int runIt(String argv[], PrintStream out) {109110// make log for debugger messages111argumentHandler = new ArgumentHandler(argv);112log = new Log(out, argumentHandler);113waitTime = argumentHandler.getWaitTime();114timeout = waitTime * 60 * 1000;115116// execute test and display results117try {118log.display("\n>>> Starting debugee \n");119120// launch debuggee121binder = new Binder(argumentHandler, log);122log.display("Launching debugee");123debugee = binder.bindToDebugee(DEBUGEE_CLASS_NAME);124transport = debugee.getTransport();125log.display(" ... debugee launched");126log.display("");127128// set timeout for debuggee responces129log.display("Setting timeout for debuggee responces: " + waitTime + " minute(s)");130transport.setReadTimeout(timeout);131log.display(" ... timeout set");132133// wait for debuggee started134log.display("Waiting for VM_INIT event");135debugee.waitForVMInit();136log.display(" ... VM_INIT event received");137138// query debugee for VM-dependent ID sizes139log.display("Querying for IDSizes");140debugee.queryForIDSizes();141log.display(" ... size of VM-dependent types adjusted");142143// get debuggee prepared for testing144log.display("\n>>> Getting prepared for testing \n");145prepareForTest();146147// test JDWP event148log.display("\n>>> Testing JDWP event \n");149150// request tested event151log.display("Making request for BREAKPOINT event at: "152+ TESTED_METHOD_NAME + ":" + BREAKPOINT_LINE);153requestTestedEvent();154log.display(" ... got requestID: " + eventRequestID);155log.display("");156157// resume debuggee158log.display("Resumindg debuggee");159debugee.resume();160log.display(" ... debuggee resumed");161log.display("");162163// wait for tested BREAKPOINT event164log.display("Waiting for BREAKPOINT event received");165waitForTestedEvent();166log.display(" ... event received");167log.display("");168169// check if event is for expected thread170if (success) {171log.display("Checking thread of BREAKPOINT event");172checkThread();173log.display("");174}175176177// clear tested request for BREAKPOINT event178log.display("Clearing request for tested event");179clearTestedRequest();180log.display(" ... request removed");181182// finish debuggee after testing183log.display("\n>>> Finishing debuggee \n");184185// resume debuggee186log.display("Resuming debuggee");187debugee.resume();188log.display(" ... debuggee resumed");189190// wait for debuggee exited191log.display("Waiting for VM_DEATH event");192debugee.waitForVMDeath();193dead = true;194log.display(" ... VM_DEATH event received");195196} catch (Failure e) {197log.complain("TEST FAILED: " + e.getMessage());198success = false;199} catch (Exception e) {200e.printStackTrace(out);201log.complain("Caught unexpected exception while running the test:\n\t" + e);202success = false;203} finally {204// quit debugee205log.display("\n>>> Finishing test \n");206quitDebugee();207}208209// check test results210if (!success) {211log.complain("TEST FAILED");212return FAILED;213}214215out.println("TEST PASSED");216return PASSED;217218}219220/**221* Get debuggee prepared for testing and obtain required data.222*/223void prepareForTest() {224// wait for tested class loaded225log.display("Waiting for tested class loaded");226testedClassID = debugee.waitForClassLoaded(TESTED_CLASS_NAME, JDWP.SuspendPolicy.ALL);227log.display(" ... got classID: " + testedClassID);228log.display("");229230// get methodID for tested method231log.display("Getting tested methodID by name: " + TESTED_METHOD_NAME);232testedMethodID = debugee.getMethodID(testedClassID, TESTED_METHOD_NAME, true);233log.display(" ... got methodID: " + testedMethodID);234235// get codeIndex for breakpoint line236log.display("Getting codeIndex for breakpoint line: " + BREAKPOINT_LINE);237long codeIndex = debugee.getCodeIndex(testedClassID, testedMethodID, BREAKPOINT_LINE);238log.display(" ... got index: " + codeIndex);239240// create location for breakpoint241log.display("Creating location for breakpoint request");242testedLocation = new JDWP.Location(JDWP.TypeTag.CLASS, testedClassID,243testedMethodID, codeIndex);244log.display(" ... got location: " + testedLocation);245}246247/**248* Make request for tested BREAKPOINT event.249*/250void requestTestedEvent() {251Failure failure = new Failure("Error occured while makind request for tested event");252253// create command packet and fill requred out data254log.display("Create command packet: " + "EventRequest.Set");255CommandPacket command = new CommandPacket(JDWP.Command.EventRequest.Set);256log.display(" eventKind: " + TESTED_EVENT_KIND);257command.addByte(TESTED_EVENT_KIND);258log.display(" eventPolicy: " + TESTED_EVENT_SUSPEND_POLICY);259command.addByte(TESTED_EVENT_SUSPEND_POLICY);260log.display(" modifiers: " + 1);261command.addInt(1);262log.display(" modKind: " + JDWP.EventModifierKind.LOCATION_ONLY);263command.addByte(JDWP.EventModifierKind.LOCATION_ONLY);264log.display(" location: " + testedLocation);265command.addLocation(testedLocation);266command.setLength();267log.display(" ... command packet composed");268log.display("");269270// send command packet to debugee271try {272log.display("Sending command packet:\n" + command);273transport.write(command);274log.display(" ... command packet sent");275} catch (IOException e) {276log.complain("Unable to send command packet:\n\t" + e);277success = false;278throw failure;279}280log.display("");281282// receive reply packet from debugee283ReplyPacket reply = new ReplyPacket();284try {285log.display("Waiting for reply packet");286transport.read(reply);287log.display(" ... packet received:\n" + reply);288} catch (IOException e) {289log.complain("Unable to read reply packet:\n\t" + e);290success = false;291throw failure;292}293log.display("");294295// check reply packet header296try{297log.display("Checking header of reply packet");298reply.checkHeader(command.getPacketID());299log.display(" .. packet header is correct");300} catch (BoundException e) {301log.complain("Bad header of reply packet:\n\t" + e.getMessage());302success = false;303throw failure;304}305306// start parsing reply packet data307log.display("Parsing reply packet:");308reply.resetPosition();309310// extract requestID311int requestID = 0;312try {313requestID = reply.getInt();314log.display(" requestID: " + requestID);315} catch (BoundException e) {316log.complain("Unable to extract requestID from request reply packet:\n\t"317+ e.getMessage());318success = false;319throw failure;320}321322// check requestID323if (requestID == 0) {324log.complain("Unexpected null requestID returned: " + requestID);325success = false;326throw failure;327}328329eventRequestID = requestID;330331// check for extra data in reply packet332if (!reply.isParsed()) {333log.complain("Extra trailing bytes found in request reply packet at: "334+ reply.offsetString());335success = false;336}337338log.display(" ... reply packet parsed");339}340341/**342* Clear request for tested BREAKPOINT event.343*/344void clearTestedRequest() {345Failure failure = new Failure("Error occured while clearing request for tested event");346347// create command packet and fill requred out data348log.display("Create command packet: " + "EventRequest.Clear");349CommandPacket command = new CommandPacket(JDWP.Command.EventRequest.Clear);350log.display(" event: " + TESTED_EVENT_KIND);351command.addByte(TESTED_EVENT_KIND);352log.display(" requestID: " + eventRequestID);353command.addInt(eventRequestID);354log.display(" ... command packet composed");355log.display("");356357// send command packet to debugee358try {359log.display("Sending command packet:\n" + command);360transport.write(command);361log.display(" ... command packet sent");362} catch (IOException e) {363log.complain("Unable to send command packet:\n\t" + e);364success = false;365throw failure;366}367log.display("");368369ReplyPacket reply = new ReplyPacket();370371// receive reply packet from debugee372try {373log.display("Waiting for reply packet");374transport.read(reply);375log.display(" ... packet received:\n" + reply);376} catch (IOException e) {377log.complain("Unable to read reply packet:\n\t" + e);378success = false;379throw failure;380}381382// check reply packet header383try{384log.display("Checking header of reply packet");385reply.checkHeader(command.getPacketID());386log.display(" .. packet header is correct");387} catch (BoundException e) {388log.complain("Bad header of reply packet:\n\t" + e.getMessage());389success = false;390throw failure;391}392393// start parsing reply packet data394log.display("Parsing reply packet:");395reply.resetPosition();396397log.display(" no data");398399// check for extra data in reply packet400if (!reply.isParsed()) {401log.complain("Extra trailing bytes found in request reply packet at: "402+ reply.offsetString());403success = false;404}405406log.display(" ... reply packet parsed");407}408409/**410* Wait for tested BREAKPOINT event.411*/412void waitForTestedEvent() {413414EventPacket eventPacket = null;415416// receive reply packet from debugee417try {418log.display("Waiting for event packet");419eventPacket = debugee.getEventPacket(timeout);420log.display(" ... event packet received:\n" + eventPacket);421} catch (IOException e) {422log.complain("Unable to read tested event packet:\n\t" + e);423success = false;424return;425}426log.display("");427428// check reply packet header429try{430log.display("Checking header of event packet");431eventPacket.checkHeader();432log.display(" ... packet header is correct");433} catch (BoundException e) {434log.complain("Bad header of tested event packet:\n\t"435+ e.getMessage());436success = false;437return;438}439440// start parsing reply packet data441log.display("Parsing event packet:");442eventPacket.resetPosition();443444// get suspendPolicy value445byte suspendPolicy = 0;446try {447suspendPolicy = eventPacket.getByte();448log.display(" suspendPolicy: " + suspendPolicy);449} catch (BoundException e) {450log.complain("Unable to get suspendPolicy value from tested event packet:\n\t"451+ e.getMessage());452success = false;453return;454}455456// check suspendPolicy value457if (suspendPolicy != TESTED_EVENT_SUSPEND_POLICY) {458log.complain("Unexpected SuspendPolicy in tested event packet: " +459suspendPolicy + " (expected: " + TESTED_EVENT_SUSPEND_POLICY + ")");460success = false;461}462463// get events count464int events = 0;465try {466events = eventPacket.getInt();467log.display(" events: " + events);468} catch (BoundException e) {469log.complain("Unable to get events count from tested event packet:\n\t"470+ e.getMessage());471success = false;472return;473}474475// check events count476if (events < 0) {477log.complain("Negative value of events number in tested event packet: " +478events + " (expected: " + 1 + ")");479success = false;480} else if (events != 1) {481log.complain("Invalid number of events in tested event packet: " +482events + " (expected: " + 1 + ")");483success = false;484}485486// extract each event487long eventThreadID = 0;488for (int i = 0; i < events; i++) {489log.display(" event #" + i + ":");490491// get eventKind492byte eventKind = 0;493try {494eventKind = eventPacket.getByte();495log.display(" eventKind: " + eventKind);496} catch (BoundException e) {497log.complain("Unable to get eventKind of event #" + i + " from tested event packet:\n\t"498+ e.getMessage());499success = false;500return;501}502503// check eventKind504if (eventKind == JDWP.EventKind.VM_DEATH) {505log.complain("Unexpected VM_DEATH event received: " +506eventKind + " (expected: " + JDWP.EventKind.BREAKPOINT + ")");507dead = true;508success = false;509return;510} else if (eventKind != JDWP.EventKind.BREAKPOINT) {511log.complain("Unexpected eventKind of event " + i + " in tested event packet: " +512eventKind + " (expected: " + JDWP.EventKind.BREAKPOINT + ")");513success = false;514return;515}516517// get requestID518int requestID = 0;519try {520requestID = eventPacket.getInt();521log.display(" requestID: " + requestID);522} catch (BoundException e) {523log.complain("Unable to get requestID of event #" + i + " from tested event packet:\n\t"524+ e.getMessage());525success = false;526return;527}528529// check requestID530if (requestID != eventRequestID) {531log.complain("Unexpected requestID of event " + i + " in tested event packet: " +532requestID + " (expected: " + eventRequestID + ")");533success = false;534}535536// get threadID537long threadID = 0;538try {539threadID = eventPacket.getObjectID();540log.display(" threadID: " + threadID);541} catch (BoundException e) {542log.complain("Unable to get threadID of event #" + i + " from tested event packet:\n\t"543+ e.getMessage());544success = false;545return;546}547548// save threadID for further checking549testedThreadID = threadID;550551// get location552JDWP.Location location = null;553try {554location = eventPacket.getLocation();555log.display(" location: " + location);556} catch (BoundException e) {557log.complain("Unable to get location of event #" + i + " from tested event packet:\n\t"558+ e.getMessage());559success = false;560return;561}562563// check location564if (location.getTag() != testedLocation.getTag()) {565log.complain("Unexpected class tag of location of event " + i566+ " in tested event packet: " + location.getTag()567+ " (expected: " + testedLocation.getTag() + ")");568success = false;569}570if (location.getClassID() != testedLocation.getClassID()) {571log.complain("Unexpected classID of location of event " + i572+ " in tested event packet: " + location.getClassID()573+ " (expected: " + testedLocation.getClassID() + ")");574success = false;575}576if (location.getMethodID() != testedLocation.getMethodID()) {577log.complain("Unexpected methodID of location of event " + i578+ " in tested event packet: " + location.getMethodID()579+ " (expected: " + testedLocation.getMethodID() + ")");580success = false;581}582if (location.getIndex() != testedLocation.getIndex()) {583log.complain("Unexpected codeIndex of location of event " + i584+ " in tested event packet: " + location.getIndex()585+ " (expected: " + testedLocation.getIndex() + ")");586success = false;587}588}589590// check for extra data in event packet591if (!eventPacket.isParsed()) {592log.complain("Extra trailing bytes found in event packet at: "593+ eventPacket.offsetString());594success = false;595}596597log.display(" ... event packet parsed");598}599600/**601* Check if threadID received by BREAKPOINT event is as expected one.602*/603void checkThread() {604// get thread value from static field of tested class605log.display("Getting thread value from static field: " + THREAD_FIELD_NAME);606JDWP.Value value = debugee.getStaticFieldValue(testedClassID, THREAD_FIELD_NAME,607JDWP.Tag.THREAD);608long threadID = ((Long)value.getValue()).longValue();609log.display(" ... got threadID: " + testedThreadID);610611// check threadID612if (threadID != testedThreadID) {613log.complain("Unexpected threadID of BREAKPOINT event received: " +614testedThreadID + " (expected: " + threadID + ")");615success = false;616} else {617log.display("Received threadID is as expected");618}619}620621/**622* Disconnect debuggee and wait for it exited.623*/624void quitDebugee() {625if (debugee == null)626return;627628// disconnect debugee629if (!dead) {630try {631log.display("Disconnecting debuggee");632debugee.dispose();633log.display(" ... debuggee disconnected");634} catch (Failure e) {635log.display("Failed to finally disconnect debuggee:\n\t"636+ e.getMessage());637}638}639640// wait for debugee exited641log.display("Waiting for debuggee exit");642int code = debugee.waitFor();643log.display(" ... debuggee exited with exit code: " + code);644645// analize debugee exit status code646if (code != JCK_STATUS_BASE + PASSED) {647log.complain("Debuggee FAILED with exit code: " + code);648success = false;649}650}651652}653654655