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 Ruslan A. Scherbakov
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 14.06.2006
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.Events;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.EventPacket;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.TaggedObject;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Value;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP Unit test for FIELD_MODIFICATION event.
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class FieldModification002Test extends JDWPEventTestCase {
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getDebuggeeClassName() {
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return FieldModification002Debuggee.class.getName();
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase is for FIELD_MODIFICATION event.
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>It FieldModification002Debuggee that modifies the value of its own fields
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * and verifies that requested FIELD_MODIFICATION events occur and
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * correct type tag is returned for each event.
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testFieldModifyEvent() {
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("FieldModification002Test started");
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //check capability, relevant for this test
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Check capability: canWatchFieldModification");
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.vmMirror.capabilities();
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean isCapability = debuggeeWrapper.vmMirror.targetVMCapabilities.canWatchFieldModification;
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (!isCapability) {
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("##WARNING: this VM doesn't possess capability: canWatchFieldModification");
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return;
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String classSignature = "L" + getDebuggeeClassName().replace('.', '/') + ";";
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testBoolField", JDWPConstants.Tag.BOOLEAN_TAG);
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testByteField", JDWPConstants.Tag.BYTE_TAG);
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testCharField", JDWPConstants.Tag.CHAR_TAG);
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testShortField", JDWPConstants.Tag.SHORT_TAG);
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testIntField", JDWPConstants.Tag.INT_TAG);
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testLongField", JDWPConstants.Tag.LONG_TAG);
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testFloatField", JDWPConstants.Tag.FLOAT_TAG);
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testDoubleField", JDWPConstants.Tag.DOUBLE_TAG);
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testObjectField", JDWPConstants.Tag.OBJECT_TAG);
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testThreadField", JDWPConstants.Tag.THREAD_TAG);
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testThreadGroupField", JDWPConstants.Tag.THREAD_GROUP_TAG);
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testClassField", JDWPConstants.Tag.CLASS_OBJECT_TAG);
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testClassLoaderField", JDWPConstants.Tag.CLASS_LOADER_TAG);
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testStringField", JDWPConstants.Tag.STRING_TAG);
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testIntArrayField", JDWPConstants.Tag.ARRAY_TAG);
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testStringArrayField", JDWPConstants.Tag.ARRAY_TAG);
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        hookFieldModification(classSignature, "testObjectArrayField", JDWPConstants.Tag.ARRAY_TAG);
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("FieldModification002Test done");
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets FIELD_MODIFICATION breakpoint,
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * synchrinizes debuggee,
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * expects field notification event,
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * verifies new value assigned to the field
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * and clears set breakpoint.
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature signature of class containing the given field
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName the name of field to break on modification
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expectedTag expected type tag of new values assigned to the field
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void hookFieldModification(String classSignature, String fieldName, byte expectedTag) {
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // set breakpoint
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Set hook for: " + fieldName);
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.setFieldModification(classSignature, JDWPConstants.TypeTag.CLASS, fieldName);
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "Set FIELD_MODIFICATION event");
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = reply.getNextValueAsInt();
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventPacket event = debuggeeWrapper.vmMirror.receiveEvent();
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // assert that event is the expected one
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid number of events,", 1, parsedEvents.length);
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid event kind,",
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.EventKind.FIELD_MODIFICATION,
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                parsedEvents[0].getEventKind(),
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.EventKind.getName(JDWPConstants.EventKind.FIELD_MODIFICATION),
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()));
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value value =
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ((ParsedEvent.Event_FIELD_MODIFICATION)parsedEvents[0]).getValueToBe();
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte tag = value.getTag();
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid value tag,",
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                expectedTag,
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                tag,
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.Tag.getName(expectedTag),
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.Tag.getName(tag));
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject modifiedField =
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ((ParsedEvent.Event_FIELD_MODIFICATION)parsedEvents[0]).getObject();
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // assert that exception class is the expected one
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = getObjectReferenceType(modifiedField.objectID);
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String returnedExceptionSignature = getClassSignature(typeID);
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertString("Invalid class signature,",
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                classSignature, returnedExceptionSignature);
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Field: " + fieldName +
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                ", tag of new value: " + value +
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                ", tag: " + (char)tag+ " - OK");
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // clear breakpoint
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        clearEvent(JDWPConstants.EventKind.FIELD_MODIFICATION, requestID, false);
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // and resume target VM
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        resumeDebuggee();
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
149