15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements. See the NOTICE file distributed with 45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership. 55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with 75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License. You may obtain a copy of the License at 85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Unless required by applicable law or agreed to in writing, software 125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * See the License for the specific language governing permissions and 165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * limitations under the License. 175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Aleksander V. Budniy 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 06.04.2005 255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.Events; 275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException; 295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.EventPacket; 305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; 315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent; 325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.exceptions.TimeoutException; 345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP Unit test for CLASS_UNLOAD event. 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class ClassUnloadTest extends JDWPEventTestCase { 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public static final String TESTED_CLASS_NAME = 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "org.apache.harmony.jpda.tests.jdwp.Events.ClassUnloadTestedClass"; 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public static final String TESTED_CLASS_SIGNATURE = 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "L" + TESTED_CLASS_NAME.replace('.', '/') + ";"; 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 47e1833aa2673d4f975ad35e7a39317feeea922fe1Sebastien Hertz @Override 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected String getDebuggeeClassName() { 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return ClassUnloadDebuggee.class.getName(); 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This testcase is for CLASS_UNLOAD event. 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public void testClassUnloadEvent() { 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> testClassUnloadEvent started"); 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ReplyPacket reply = null; 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int foundClasses = 0; 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // commented out because it may leave JNI references to the tested class, 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // which will prevent it from garbage collecting and unloading 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // check that tested class is loaded before unloading it 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Find tested class by signature: " + TESTED_CLASS_SIGNATURE); 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reply = debuggeeWrapper.vmMirror.getClassBySignature(TESTED_CLASS_SIGNATURE); 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes foundClasses = reply.getNextValueAsInt(); 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Found clases: " + foundClasses); 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (foundClasses <= 0) { 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes fail("Tested class was not found: count=" + foundClasses); 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes*/ 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Set request for ClasUnload event: " + TESTED_CLASS_NAME); 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reply = debuggeeWrapper.vmMirror.setClassUnload(TESTED_CLASS_NAME); 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes checkReplyPacket(reply, "Set CLASS_UNLOAD event"); 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int requestID = reply.getNextValueAsInt(); 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Created requestID for ClassUnload event: " + requestID); 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Release debuggee"); 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Wait for class unload event"); 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes EventPacket event = null; 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes event = debuggeeWrapper.vmMirror.receiveEvent(settings.getTimeout()); 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Event received"); 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (TimeoutException e) { 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> ClassUnload event was not received (class might be not really unloaded)"); 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (Exception e) { 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Exception during receiving ClassUnload event: " + e); 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException(e); 965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Clear request for ClassUnload event"); 995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reply = debuggeeWrapper.vmMirror.clearEvent(JDWPConstants.EventKind.CLASS_UNLOAD, requestID); 1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Try to find tested class by signature: " + TESTED_CLASS_SIGNATURE); 1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes reply = debuggeeWrapper.vmMirror.getClassBySignature(TESTED_CLASS_SIGNATURE); 1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes foundClasses = reply.getNextValueAsInt(); 1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Found clases: " + foundClasses); 1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Wait for class status message from debuggee"); 1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String status = synchronizer.receiveMessage(); 1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Debuggee reported class status: " + status); 1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (event != null) { 1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // check event data 1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event); 1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes assertEquals("Invalid number of events,", 1, parsedEvents.length); 1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes assertEquals("Invalid event kind,", JDWPConstants.EventKind.CLASS_UNLOAD 1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes , parsedEvents[0].getEventKind() 1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes , JDWPConstants.EventKind.getName(JDWPConstants.EventKind.CLASS_UNLOAD) 1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes , JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind())); 1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes assertEquals("Invalid event request,", requestID 1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes , parsedEvents[0].getRequestID()); 1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // check that unloaded class was not found after event 1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (foundClasses > 0) { 1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes fail("Tested class was found after ClasUnload event: count=" + foundClasses); 1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Resume debuggee on event"); 1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes debuggeeWrapper.resume(); 1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } else { 1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // check if tested class not found without event 1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (foundClasses <= 0) { 1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes fail("No ClassUnload event, but tested class not found: count=" + foundClasses); 1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // check if debuggee reported tested class unloaded without event 1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ("UNLOADED".equals(status)) { 1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes fail("No ClassUnload event, but tested class was unloaded"); 1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Release debuggee"); 1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> testClassUnloadEvent ended"); 1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 146