Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdwp/Event/EXCEPTION/exception001.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.EXCEPTION;2425import java.io.*;2627import nsk.share.*;28import nsk.share.jpda.*;29import nsk.share.jdwp.*;3031/**32* Test for JDWP event: EXCEPTION.33*34* See exception001.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 exception001 {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.EXCEPTION";52static final String TEST_CLASS_NAME = PACKAGE_NAME + "." + "exception001";53static final String DEBUGEE_CLASS_NAME = TEST_CLASS_NAME + "a";5455// tested JDWP event constants56static final byte TESTED_EVENT_KIND = JDWP.EventKind.EXCEPTION;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 + "$" + "TestedThreadClass";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 EXCEPTION_FIELD_NAME = "exception";66static final String BREAKPOINT_METHOD_NAME = "run";67static final String THROW_METHOD_NAME = "methodForThrow";68static final String CATCH_METHOD_NAME = "methodForCatch";69static final int BREAKPOINT_LINE = exception001a.BREAKPOINT_LINE;70static final int EXCEPTION_THROW_LINE = exception001a.EXCEPTION_THROW_LINE;71static final int EXCEPTION_CATCH_LINE = exception001a.EXCEPTION_CATCH_LINE;7273// usual scaffold objects74ArgumentHandler argumentHandler = null;75Log log = null;76Binder binder = null;77Debugee debugee = null;78Transport transport = null;79int waitTime = 0; // minutes80long timeout = 0; // milliseconds81boolean dead = false;82boolean success = true;8384// obtained data85long testedClassID = 0;86long testedThreadID = 0;87long catchMethodID = 0;88long throwMethodID = 0;89JDWP.Location throwLocation = null;90JDWP.Location catchLocation = null;91long exceptionObjectID = 0;92int eventRequestID = 0;9394// -------------------------------------------------------------------9596/**97* Start test from command line.98*/99public static void main(String argv[]) {100System.exit(run(argv,System.out) + JCK_STATUS_BASE);101}102103/**104* Start test from JCK-compilant environment.105*/106public static int run(String argv[], PrintStream out) {107return new exception001().runIt(argv, out);108}109110// -------------------------------------------------------------------111112/**113* Perform test execution.114*/115public int runIt(String argv[], PrintStream out) {116117// make log for debugger messages118argumentHandler = new ArgumentHandler(argv);119log = new Log(out, argumentHandler);120waitTime = argumentHandler.getWaitTime();121timeout = waitTime * 60 * 1000;122123// execute test and display results124try {125log.display("\n>>> Starting debugee \n");126127// launch debuggee128binder = new Binder(argumentHandler, log);129log.display("Launching debugee");130debugee = binder.bindToDebugee(DEBUGEE_CLASS_NAME);131transport = debugee.getTransport();132log.display(" ... debugee launched");133log.display("");134135// set timeout for debuggee responces136log.display("Setting timeout for debuggee responces: " + waitTime + " minute(s)");137transport.setReadTimeout(timeout);138log.display(" ... timeout set");139140// wait for debuggee started141log.display("Waiting for VM_INIT event");142debugee.waitForVMInit();143log.display(" ... VM_INIT event received");144145// query debugee for VM-dependent ID sizes146log.display("Querying for IDSizes");147debugee.queryForIDSizes();148log.display(" ... size of VM-dependent types adjusted");149150// prepare debuggee151log.display("\n>>> Getting prepared for testing \n");152prepareForTest();153154// test JDWP event155log.display("\n>>> Testing JDWP event \n");156log.display("Making request for EXCEPTION event for class:\n\t"157+ TESTED_CLASS_NAME);158requestTestedEvent();159log.display(" ... got requestID: " + eventRequestID);160log.display("");161162// resume debuggee163log.display("Resumindg debuggee");164debugee.resume();165log.display(" ... debuggee resumed");166log.display("");167168// wait for tested EXCEPTION event169log.display("Waiting for EXCEPTION event received");170waitForTestedEvent();171log.display(" ... event received");172log.display("");173174// clear tested request for EXCEPTION event175log.display("Clearing request for tested event");176clearTestedRequest();177log.display(" ... request removed");178179// finish debuggee after testing180log.display("\n>>> Finishing debuggee \n");181182// resume debuggee183log.display("Resuming debuggee");184debugee.resume();185log.display(" ... debuggee resumed");186187// wait for debuggee exited188log.display("Waiting for VM_DEATH event");189debugee.waitForVMDeath();190dead = true;191log.display(" ... VM_DEATH event received");192193} catch (Failure e) {194log.complain("TEST FAILED: " + e.getMessage());195success = false;196} catch (Exception e) {197e.printStackTrace(out);198log.complain("Caught unexpected exception while running the test:\n\t" + e);199success = false;200} finally {201// quit debugee202log.display("\n>>> Finishing test \n");203quitDebugee();204}205206// check test results207if (!success) {208log.complain("TEST FAILED");209return FAILED;210}211212out.println("TEST PASSED");213return PASSED;214215}216217/**218* Get debuggee prepared for testing and obtain required data.219*/220void prepareForTest() {221// wait for tested class loaded222log.display("Waiting for tested class loaded");223testedClassID = debugee.waitForClassLoaded(TESTED_CLASS_NAME, JDWP.SuspendPolicy.ALL);224log.display(" ... got classID: " + testedClassID);225log.display("");226227// get methodID for the exception throw method228log.display("Getting methodID for exception throw method: " + THROW_METHOD_NAME);229throwMethodID = debugee.getMethodID(testedClassID, THROW_METHOD_NAME, true);230log.display(" ... got methodID: " + throwMethodID);231232// get codeIndex for exception throw line233log.display("Getting codeIndex for exception throw line: " + EXCEPTION_THROW_LINE);234long codeIndex = debugee.getCodeIndex(testedClassID, throwMethodID, EXCEPTION_THROW_LINE);235log.display(" ... got index: " + codeIndex);236237// create location for exception throw line238log.display("Creating location for exception throw");239throwLocation = new JDWP.Location(JDWP.TypeTag.CLASS, testedClassID,240throwMethodID, codeIndex);241log.display(" ... got location: " + throwLocation);242243// get methodID for the exception catch method244log.display("Getting methodID for exception catch method: " + CATCH_METHOD_NAME);245catchMethodID = debugee.getMethodID(testedClassID, CATCH_METHOD_NAME, true);246log.display(" ... got methodID: " + catchMethodID);247248// get codeIndex for exception catch line249log.display("Getting codeIndex for exception catch line: " + EXCEPTION_CATCH_LINE);250codeIndex = debugee.getCodeIndex(testedClassID, catchMethodID, EXCEPTION_CATCH_LINE);251log.display(" ... got index: " + codeIndex);252253// create location for exception catch line254log.display("Creating location for exception catch");255catchLocation = new JDWP.Location(JDWP.TypeTag.CLASS, testedClassID,256catchMethodID, codeIndex);257log.display(" ... got location: " + catchLocation);258log.display("");259260// wait for breakpoint reached261log.display("Waiting for breakpoint reached at: "262+ BREAKPOINT_METHOD_NAME + ":" + BREAKPOINT_LINE);263testedThreadID = debugee.waitForBreakpointReached(testedClassID,264BREAKPOINT_METHOD_NAME,265BREAKPOINT_LINE,266JDWP.SuspendPolicy.ALL);267log.display(" ... breakpoint reached with threadID: " + testedThreadID);268269// get excepion objectID value for static field270log.display("Getting exception objectID from static field: " + EXCEPTION_FIELD_NAME);271JDWP.Value value = debugee.getStaticFieldValue(testedClassID, EXCEPTION_FIELD_NAME, JDWP.Tag.OBJECT);272exceptionObjectID = ((Long)value.getValue()).longValue();273log.display(" ... got exception objectID: " + exceptionObjectID);274log.display("");275}276277/**278* Make request for tested EXCEPTION event.279*/280void requestTestedEvent() {281Failure failure = new Failure("Error occured while makind request for tested event");282283// create command packet and fill requred out data284log.display("Create command packet: " + "EventRequest.Set");285CommandPacket command = new CommandPacket(JDWP.Command.EventRequest.Set);286log.display(" eventKind: " + TESTED_EVENT_KIND);287command.addByte(TESTED_EVENT_KIND);288log.display(" eventPolicy: " + TESTED_EVENT_SUSPEND_POLICY);289command.addByte(TESTED_EVENT_SUSPEND_POLICY);290log.display(" modifiers: " + 1);291command.addInt(1);292log.display(" modKind: " + JDWP.EventModifierKind.CLASS_ONLY + " (CLASS_ONLY)");293command.addByte(JDWP.EventModifierKind.CLASS_ONLY);294log.display(" classID: " + testedClassID);295command.addReferenceTypeID(testedClassID);296command.setLength();297log.display(" ... command packet composed");298log.display("");299300// send command packet to debugee301try {302log.display("Sending command packet:\n" + command);303transport.write(command);304log.display(" ... command packet sent");305} catch (IOException e) {306log.complain("Unable to send command packet:\n\t" + e);307success = false;308throw failure;309}310log.display("");311312// receive reply packet from debugee313ReplyPacket reply = new ReplyPacket();314try {315log.display("Waiting for reply packet");316transport.read(reply);317log.display(" ... packet received:\n" + reply);318} catch (IOException e) {319log.complain("Unable to read reply packet:\n\t" + e);320success = false;321throw failure;322}323log.display("");324325// check reply packet header326try{327log.display("Checking header of reply packet");328reply.checkHeader(command.getPacketID());329log.display(" .. packet header is correct");330} catch (BoundException e) {331log.complain("Bad header of reply packet:\n\t" + e.getMessage());332success = false;333throw failure;334}335336// start parsing reply packet data337log.display("Parsing reply packet:");338reply.resetPosition();339340// extract requestID341int requestID = 0;342try {343requestID = reply.getInt();344log.display(" requestID: " + requestID);345} catch (BoundException e) {346log.complain("Unable to extract requestID from request reply packet:\n\t"347+ e.getMessage());348success = false;349throw failure;350}351352// check requestID353if (requestID == 0) {354log.complain("Unexpected null requestID returned: " + requestID);355success = false;356throw failure;357}358359eventRequestID = requestID;360361// check for extra data in reply packet362if (!reply.isParsed()) {363log.complain("Extra trailing bytes found in request reply packet at: "364+ reply.offsetString());365success = false;366}367368log.display(" ... reply packet parsed");369}370371/**372* Clear request for tested EXCEPTION event.373*/374void clearTestedRequest() {375Failure failure = new Failure("Error occured while clearing request for tested event");376377// create command packet and fill requred out data378log.display("Create command packet: " + "EventRequest.Clear");379CommandPacket command = new CommandPacket(JDWP.Command.EventRequest.Clear);380log.display(" event: " + TESTED_EVENT_KIND);381command.addByte(TESTED_EVENT_KIND);382log.display(" requestID: " + eventRequestID);383command.addInt(eventRequestID);384log.display(" ... command packet composed");385log.display("");386387// send command packet to debugee388try {389log.display("Sending command packet:\n" + command);390transport.write(command);391log.display(" ... command packet sent");392} catch (IOException e) {393log.complain("Unable to send command packet:\n\t" + e);394success = false;395throw failure;396}397log.display("");398399ReplyPacket reply = new ReplyPacket();400401// receive reply packet from debugee402try {403log.display("Waiting for reply packet");404transport.read(reply);405log.display(" ... packet received:\n" + reply);406} catch (IOException e) {407log.complain("Unable to read reply packet:\n\t" + e);408success = false;409throw failure;410}411412// check reply packet header413try{414log.display("Checking header of reply packet");415reply.checkHeader(command.getPacketID());416log.display(" .. packet header is correct");417} catch (BoundException e) {418log.complain("Bad header of reply packet:\n\t" + e.getMessage());419success = false;420throw failure;421}422423// start parsing reply packet data424log.display("Parsing reply packet:");425reply.resetPosition();426427log.display(" no data");428429// check for extra data in reply packet430if (!reply.isParsed()) {431log.complain("Extra trailing bytes found in request reply packet at: "432+ reply.offsetString());433success = false;434}435436log.display(" ... reply packet parsed");437}438439/**440* Wait for tested EXCEPTION event.441*/442void waitForTestedEvent() {443444// receive reply packet from debugee445EventPacket eventPacket = null;446try {447log.display("Waiting for event packet");448eventPacket = debugee.getEventPacket(timeout);449log.display(" ... event packet received:\n" + eventPacket);450} catch (IOException e) {451log.complain("Unable to read tested event packet:\n\t" + e);452success = false;453return;454}455log.display("");456457// check reply packet header458try{459log.display("Checking header of event packet");460eventPacket.checkHeader();461log.display(" ... packet header is correct");462} catch (BoundException e) {463log.complain("Bad header of tested event packet:\n\t"464+ e.getMessage());465success = false;466return;467}468469// start parsing reply packet data470log.display("Parsing event packet:");471eventPacket.resetPosition();472473// get suspendPolicy value474byte suspendPolicy = 0;475try {476suspendPolicy = eventPacket.getByte();477log.display(" suspendPolicy: " + suspendPolicy);478} catch (BoundException e) {479log.complain("Unable to get suspendPolicy value from tested event packet:\n\t"480+ e.getMessage());481success = false;482return;483}484485// check suspendPolicy value486if (suspendPolicy != TESTED_EVENT_SUSPEND_POLICY) {487log.complain("Unexpected SuspendPolicy in tested event packet: " +488suspendPolicy + " (expected: " + TESTED_EVENT_SUSPEND_POLICY + ")");489success = false;490}491492// get events count493int events = 0;494try {495events = eventPacket.getInt();496log.display(" events: " + events);497} catch (BoundException e) {498log.complain("Unable to get events count from tested event packet:\n\t"499+ e.getMessage());500success = false;501return;502}503504// check events count505if (events < 0) {506log.complain("Negative value of events number in tested event packet: " +507events + " (expected: " + 1 + ")");508success = false;509} else if (events != 1) {510log.complain("Invalid number of events in tested event packet: " +511events + " (expected: " + 1 + ")");512success = false;513}514515// extract each event516long eventThreadID = 0;517for (int i = 0; i < events; i++) {518log.display(" event #" + i + ":");519520// get eventKind521byte eventKind = 0;522try {523eventKind = eventPacket.getByte();524log.display(" eventKind: " + eventKind);525} catch (BoundException e) {526log.complain("Unable to get eventKind of event #" + i + " from tested event packet:\n\t"527+ e.getMessage());528success = false;529return;530}531532// check eventKind533if (eventKind == JDWP.EventKind.VM_DEATH) {534log.complain("Unexpected VM_DEATH event received: " +535eventKind + " (expected: " + JDWP.EventKind.EXCEPTION + ")");536dead = true;537success = false;538return;539} else if (eventKind != JDWP.EventKind.EXCEPTION) {540log.complain("Unexpected eventKind of event " + i + " in tested event packet: " +541eventKind + " (expected: " + JDWP.EventKind.EXCEPTION + ")");542success = false;543return;544}545546// get requestID547int requestID = 0;548try {549requestID = eventPacket.getInt();550log.display(" requestID: " + requestID);551} catch (BoundException e) {552log.complain("Unable to get requestID of event #" + i + " from tested event packet:\n\t"553+ e.getMessage());554success = false;555return;556}557558// check requestID559if (requestID != eventRequestID) {560log.complain("Unexpected requestID of event " + i + " in tested event packet: " +561requestID + " (expected: " + eventRequestID + ")");562success = false;563}564565// get threadID566long threadID = 0;567try {568threadID = eventPacket.getObjectID();569log.display(" threadID: " + threadID);570} catch (BoundException e) {571log.complain("Unable to get threadID of event #" + i + " from tested event packet:\n\t"572+ e.getMessage());573success = false;574return;575}576577// check threadID578if (threadID != testedThreadID) {579log.complain("Unexpected threadID of event " + i + " in tested event packet: " +580threadID + " (expected: " + testedThreadID + ")");581success = false;582}583584// get throw location585JDWP.Location location = null;586try {587location = eventPacket.getLocation();588log.display(" throw_location: " + location);589} catch (BoundException e) {590log.complain("Unable to get throw location of event #" + i + " from tested event packet:\n\t"591+ e.getMessage());592success = false;593return;594}595596// check location597checkLocation(location, throwLocation, i, EXCEPTION_THROW_LINE, "throw");598599// get exception tag600byte tag = 0;601try {602tag = eventPacket.getByte();603log.display(" exception_tag: " + tag);604} catch (BoundException e) {605log.complain("Unable to get exception tag of event #" + i + " from tested event packet:\n\t"606+ e.getMessage());607success = false;608return;609}610611// check tag612if (tag != JDWP.Tag.OBJECT) {613log.complain("Unexpected exception tag of event " + i + " in tested event packet: " +614tag + " (expected: " + JDWP.Tag.OBJECT + ")");615success = false;616}617618// get exception objectID619long objectID = 0;620try {621objectID = eventPacket.getObjectID();622log.display(" exception_objectID: " + objectID);623} catch (BoundException e) {624log.complain("Unable to get exception objectID of event #" + i + " from tested event packet:\n\t"625+ e.getMessage());626success = false;627return;628}629630// check threadID631if (objectID != exceptionObjectID) {632log.complain("Unexpected exception objectID of event " + i + " in tested event packet: " +633objectID + " (expected: " + exceptionObjectID + ")");634success = false;635}636637// get catch location638location = null;639try {640location = eventPacket.getLocation();641log.display(" catch_location: " + location);642} catch (BoundException e) {643log.complain("Unable to get catch location of event #" + i + " from tested event packet:\n\t"644+ e.getMessage());645success = false;646return;647}648649// check location650checkLocation(location, catchLocation, i, EXCEPTION_CATCH_LINE, "catch");651}652653// check for extra data in event packet654if (!eventPacket.isParsed()) {655log.complain("Extra trailing bytes found in event packet at: "656+ eventPacket.offsetString());657success = false;658}659660log.display(" ... event packet parsed");661}662663/**664* Check if given location is equal to the expected one.665*/666void checkLocation(JDWP.Location location, JDWP.Location expectedLocation,667int eventNumber, int expectedLine, String kind) {668if (location.getTag() != expectedLocation.getTag()) {669log.complain("Unexpected class tag of " + kind + " location of event "670+ eventNumber + " in tested event packet: " + location.getTag()671+ " (expected: " + expectedLocation.getTag() + ")");672success = false;673}674if (location.getClassID() != expectedLocation.getClassID()) {675log.complain("Unexpected classID of " + kind + " location of event "676+ eventNumber + " in tested event packet: " + location.getClassID()677+ " (expected: " + expectedLocation.getClassID() + ")");678success = false;679}680if (location.getMethodID() != expectedLocation.getMethodID()) {681log.complain("Unexpected methodID of " + kind + " location of event "682+ eventNumber + " in tested event packet: " + location.getMethodID()683+ " (expected: " + expectedLocation.getMethodID() + ")");684success = false;685}686if (location.getIndex() != expectedLocation.getIndex()) {687/*688log.complain("Unexpected codeIndex of " + kind + " location of event " + i689+ " in tested event packet: " + location.getIndex()690+ " (expected: " + expectedLocation.getIndex() + ")");691success = false;692*/693try {694// find approximate line number for location695int lineNumber = debugee.getLineNumber(location, true);696if (lineNumber != expectedLine) {697log.complain("Unexpected line number of " + kind + " location of event "698+ eventNumber + " in tested event packet: " + lineNumber699+ " (expected: " + expectedLine + ")");700success = false;701} else {702log.display("Unexpected codeIndex of " + kind + " location: " + location.getIndex()703+ " (expected: " + expectedLocation.getIndex() + ")");704log.display("Though line number of catch location is as expected: "705+ expectedLine);706}707} catch (Failure e) {708log.complain("Unable to get line number for " + kind + " location of event "709+ eventNumber + " in tested event packet:\n\t" + e.getMessage());710success = false;711}712}713}714715/**716* Disconnect debuggee and wait for it exited.717*/718void quitDebugee() {719if (debugee == null)720return;721722// disconnect debugee723if (!dead) {724try {725log.display("Disconnecting debuggee");726debugee.dispose();727log.display(" ... debuggee disconnected");728} catch (Failure e) {729log.display("Failed to finally disconnect debuggee:\n\t"730+ e.getMessage());731}732}733734// wait for debugee exited735log.display("Waiting for debuggee exit");736int code = debugee.waitFor();737log.display(" ... debuggee exited with exit code: " + code);738739// analize debugee exit status code740if (code != JCK_STATUS_BASE + PASSED) {741log.complain("Debuggee FAILED with exit code: " + code);742success = false;743}744}745746}747748749