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