Path: blob/master/test/hotspot/jtreg/vmTestbase/nsk/jdwp/EventRequest/Set/set002.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.EventRequest.Set;2425import java.io.*;2627import nsk.share.*;28import nsk.share.jpda.*;29import nsk.share.jdwp.*;3031/**32* Test for JDWP command: EventRequest.Set.33*34* See set002.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 command is tested in the method testCommand().39*40* @see #runIt()41* @see #waitForTestedEvent()42*/43public class set002 {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.EventRequest.Set";52static final String TEST_CLASS_NAME = PACKAGE_NAME + "." + "set002";53static final String DEBUGEE_CLASS_NAME = TEST_CLASS_NAME + "a";5455// tested JDWP command constants56static final String JDWP_COMMAND_NAME = "EventRequest.Set";57static final int JDWP_COMMAND_ID = JDWP.Command.EventRequest.Set;58static final byte TESTED_EVENT_KIND = JDWP.EventKind.VM_START;59static final byte TESTED_EVENT_SUSPEND_POLICY = JDWP.SuspendPolicy.ALL;6061// usual scaffold objects62ArgumentHandler argumentHandler = null;63Log log = null;64Binder binder = null;65Debugee debugee = null;66Transport transport = null;67int waitTime = 0; // minutes68long timeout = 0; // milliseconds69boolean dead = false;70boolean success = true;7172int eventRequestID = 0;7374// -------------------------------------------------------------------7576/**77* Start test from command line.78*/79public static void main(String argv[]) {80System.exit(run(argv,System.out) + JCK_STATUS_BASE);81}8283/**84* Start test from JCK-compilant environment.85*/86public static int run(String argv[], PrintStream out) {87return new set002().runIt(argv, out);88}8990// -------------------------------------------------------------------9192/**93* Perform test execution.94*/95public int runIt(String argv[], PrintStream out) {9697// make log for debugger messages98argumentHandler = new ArgumentHandler(argv);99log = new Log(out, argumentHandler);100waitTime = argumentHandler.getWaitTime();101timeout = waitTime * 60 * 1000;102103// execute test and display results104try {105log.display("\n>>> Starting debugee \n");106107// launch debuggee108binder = new Binder(argumentHandler, log);109log.display("Launching debugee");110debugee = binder.bindToDebugee(DEBUGEE_CLASS_NAME);111transport = debugee.getTransport();112log.display(" ... debugee launched");113log.display("");114115// set timeout for debuggee responces116log.display("Setting timeout for debuggee responces: " + waitTime + " minute(s)");117transport.setReadTimeout(timeout);118log.display(" ... timeout set");119120// wait for debuggee started121log.display("Waiting for VM_INIT event");122debugee.waitForVMInit();123log.display(" ... VM_INIT event received");124125// query debugee for VM-dependent ID sizes126log.display("Querying for IDSizes");127debugee.queryForIDSizes();128log.display(" ... size of VM-dependent types adjusted");129130// test JDWP command131log.display("\n>>> Testing JDWP command \n");132testCommand();133134log.display("Resumindg debuggee");135debugee.resume();136log.display(" ... debuggee resumed");137138// wait for tested VM_START or VM_DEATH event139log.display("\n>>> Testing JDWP event \n");140waitForTestedEvent();141142if (!dead) {143// clear tested request for VM_START event144log.display("\n>>> Clearing request for tested event \n");145clearTestedRequest();146147// finish debuggee after testing148log.display("\n>>> Finishing debuggee \n");149150// resume debuggee151log.display("Resuming debuggee");152debugee.resume();153log.display(" ... debuggee resumed");154155// wait for debuggee exited156log.display("Waiting for VM_DEATH event");157debugee.waitForVMDeath();158dead = true;159log.display(" ... VM_DEATH event received");160}161162} catch (Failure e) {163log.complain("TEST FAILED: " + e.getMessage());164success = false;165} catch (Exception e) {166e.printStackTrace(out);167log.complain("Caught unexpected exception while running the test:\n\t" + e);168success = false;169} finally {170// quit debugee171log.display("\n>>> Finishing test \n");172quitDebugee();173}174175// check test results176if (!success) {177log.complain("TEST FAILED");178return FAILED;179}180181out.println("TEST PASSED");182return PASSED;183184}185186/**187* Test JDWP command.188*/189void testCommand() {190// create command packet and fill requred out data191log.display("Create command packet: " + JDWP_COMMAND_NAME);192CommandPacket command = new CommandPacket(JDWP_COMMAND_ID);193log.display(" event: " + TESTED_EVENT_KIND);194command.addByte(TESTED_EVENT_KIND);195log.display(" suspendPolicy: " + TESTED_EVENT_SUSPEND_POLICY);196command.addByte(TESTED_EVENT_SUSPEND_POLICY);197log.display(" modifiers: " + 0);198command.addInt(0);199command.setLength();200log.display(" ... command packet created");201202// send command packet to debugee203try {204log.display("Sending command packet:\n" + command);205transport.write(command);206log.display(" ... command packet sent");207} catch (IOException e) {208log.complain("Unable to send command packet:\n\t" + e);209success = false;210return;211}212log.display("");213214// receive reply packet from debugee215ReplyPacket reply = new ReplyPacket();216try {217log.display("Waiting for reply packet");218transport.read(reply);219log.display(" ... reply packet received:\n" + reply);220} catch (IOException e) {221log.complain("Unable to read reply packet:\n\t" + e);222success = false;223return;224}225log.display("");226227// check reply packet header228try{229log.display("Checking header of reply packet");230reply.checkHeader(command.getPacketID());231log.display(" ... packet header is correct");232} catch (BoundException e) {233log.complain("Wrong header of reply packet for tested command:\n\t"234+ e.getMessage());235success = false;236return;237}238239// start parsing reply packet data240log.display("Parsing reply packet data:");241reply.resetPosition();242243{244// extract requestID245try {246eventRequestID = reply.getInt();247log.display(" requestID: " + eventRequestID);248} catch (BoundException e) {249log.complain("Unable to extract requestID from request reply packet:\n\t"250+ e.getMessage());251success = false;252}253254// check requestID255if (eventRequestID == 0) {256log.complain("Unexpected null requestID returned: " + eventRequestID);257success = false;258}259260log.display(" ... packet data is parsed");261}262263// check for extra data in reply packet264if (!reply.isParsed()) {265log.complain("Extra trailing bytes found in reply packet at: "266+ reply.offsetString());267success = false;268}269}270271/**272* Clear request for tested VM_START event.273*/274void clearTestedRequest() {275Failure failure = new Failure("Error occured while clearing request for tested event");276277// create command packet and fill requred out data278log.display("Create command packet: " + "EventRequest.Clear");279CommandPacket command = new CommandPacket(JDWP.Command.EventRequest.Clear);280log.display(" event: " + TESTED_EVENT_KIND);281command.addByte(TESTED_EVENT_KIND);282log.display(" requestID: " + eventRequestID);283command.addInt(eventRequestID);284log.display(" ... command packet composed");285286// send command packet to debugee287try {288log.display("Sending command packet:\n" + command);289transport.write(command);290log.display(" ... command packet sent");291} catch (IOException e) {292log.complain("Unable to send command packet:\n\t" + e);293success = false;294throw failure;295}296297ReplyPacket reply = new ReplyPacket();298299// receive reply packet from debugee300try {301log.display("Waiting for reply packet");302transport.read(reply);303log.display(" ... packet received:\n" + reply);304} catch (IOException e) {305log.complain("Unable to read reply packet:\n\t" + e);306success = false;307throw failure;308}309310// check reply packet header311try{312log.display("Checking header of reply packet");313reply.checkHeader(command.getPacketID());314log.display(" .. packet header is correct");315} catch (BoundException e) {316log.complain("Bad header of reply packet:\n\t" + e.getMessage());317success = false;318throw failure;319}320321// start parsing reply packet data322log.display("Parsing reply packet:");323reply.resetPosition();324325log.display(" no data");326327// check for extra data in reply packet328if (!reply.isParsed()) {329log.complain("Extra trailing bytes found in request reply packet at: "330+ reply.offsetString());331success = false;332}333334log.display(" ... reply packet parsed");335}336337/**338* Wait for tested CLASS_UNLOAD event.339*/340void waitForTestedEvent() {341342EventPacket eventPacket = null;343344// receive reply packet from debugee345try {346log.display("Waiting for event packet (for " + timeout + "ms timeout)");347eventPacket = debugee.getEventPacket(timeout);348log.display(" ... event packet received:\n" + eventPacket);349} catch (IOException e) {350log.complain("Unable to read tested event packet:\n\t" + e);351success = false;352return;353}354355// check reply packet header356try{357log.display("Checking header of event packet");358eventPacket.checkHeader();359log.display(" ... packet header is correct");360} catch (BoundException e) {361log.complain("Bad header of tested event packet:\n\t"362+ e.getMessage());363success = false;364return;365}366367// start parsing reply packet data368log.display("Parsing event packet:");369eventPacket.resetPosition();370371// get suspendPolicy value372byte suspendPolicy = 0;373try {374suspendPolicy = eventPacket.getByte();375log.display(" suspendPolicy: " + suspendPolicy);376} catch (BoundException e) {377log.complain("Unable to get suspendPolicy value from tested event packet:\n\t"378+ e.getMessage());379success = false;380return;381}382383// get events count384int events = 0;385try {386events = eventPacket.getInt();387log.display(" events: " + events);388} catch (BoundException e) {389log.complain("Unable to get events count from tested event packet:\n\t"390+ e.getMessage());391success = false;392return;393}394395// check events count396if (events < 0) {397log.complain("Negative value of events number in tested event packet: " +398events + " (expected: " + 1 + ")");399success = false;400} else if (events != 1) {401log.complain("Invalid number of events in tested event packet: " +402events + " (expected: " + 1 + ")");403success = false;404}405406// extract each event407for (int i = 0; i < events; i++) {408log.display(" event #" + i + ":");409410// get eventKind411byte eventKind = 0;412try {413eventKind = eventPacket.getByte();414log.display(" eventKind: " + eventKind);415} catch (BoundException e) {416log.complain("Unable to get eventKind of event #" + i + " from tested event packet:\n\t"417+ e.getMessage());418success = false;419return;420}421422// check if VM_DEATH event423if (eventKind == JDWP.EventKind.VM_DEATH) {424log.display("Got VM_DEATH event while waiting for tested event");425dead = true;426log.display("No VM_START event occured so treat test as PASSED");427return;428}429430// check eventKind431if (eventKind != JDWP.EventKind.VM_START) {432log.complain("Unexpected eventKind of event " + i + " in tested event packet: " +433eventKind + " (expected: " + JDWP.EventKind.VM_DEATH + ")");434success = false;435return;436}437438if (eventKind == JDWP.EventKind.VM_START) {439log.complain("Unexpected VM_START event " + i + " in tested event packet: " +440eventKind + " (expected: " + JDWP.EventKind.VM_DEATH + ")");441success = false;442return;443}444// check suspendPolicy value445if (suspendPolicy != TESTED_EVENT_SUSPEND_POLICY) {446log.complain("Unexpected SuspendPolicy in tested event packet: " +447suspendPolicy + " (expected: " + TESTED_EVENT_SUSPEND_POLICY + ")");448success = false;449}450451// get requestID452int requestID = 0;453try {454requestID = eventPacket.getInt();455log.display(" requestID: " + requestID);456} catch (BoundException e) {457log.complain("Unable to get requestID of event #" + i + " from tested event packet:\n\t"458+ e.getMessage());459success = false;460return;461}462463// check requestID464if (requestID != eventRequestID) {465log.complain("Unexpected requestID of event " + i + " in tested event packet: " +466requestID + " (expected: " + eventRequestID + ")");467success = false;468}469470// get threadID471long threadID = 0;472try {473threadID = eventPacket.getObjectID();474log.display(" threadID: " + threadID);475} catch (BoundException e) {476log.complain("Unable to get threadID of event #" + i + " from tested event packet:\n\t"477+ e.getMessage());478success = false;479return;480}481482// check threadID483if (threadID == 0) {484log.complain("Unexpected threadID of event " + i + " in tested event packet: " +485requestID + " (expected: not 0)");486success = false;487}488489}490491// check for extra data in event packet492if (!eventPacket.isParsed()) {493log.complain("Extra trailing bytes found in event packet at: "494+ eventPacket.offsetString());495success = false;496}497498log.display(" ... event packet parsed");499}500501/**502* Disconnect debuggee and wait for it exited.503*/504void quitDebugee() {505if (debugee == null)506return;507508// disconnect debugee if not dead509if (!dead) {510try {511log.display("Disconnecting debuggee");512debugee.dispose();513log.display(" ... debuggee disconnected");514} catch (Failure e) {515log.display("Failed to finally disconnect debuggee:\n\t"516+ e.getMessage());517}518}519520// wait for debugee exited521log.display("Waiting for debuggee exit");522int code = debugee.waitFor();523log.display(" ... debuggee exited with exit code: " + code);524525// analize debugee exit status code526if (code != JCK_STATUS_BASE + PASSED) {527log.complain("Debuggee FAILED with exit code: " + code);528success = false;529}530}531532}533534535