143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz/*
243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * Licensed to the Apache Software Foundation (ASF) under one or more
343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * contributor license agreements.  See the NOTICE file distributed with
443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * this work for additional information regarding copyright ownership.
543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * The ASF licenses this file to You under the Apache License, Version 2.0
643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * (the "License"); you may not use this file except in compliance with
743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * the License.  You may obtain a copy of the License at
843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *
943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *     http://www.apache.org/licenses/LICENSE-2.0
1043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *
1143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *  Unless required by applicable law or agreed to in writing, software
1243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *  distributed under the License is distributed on an "AS IS" BASIS,
1343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *
1543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *  See the License for the specific language governing permissions and
1643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz *  limitations under the License.
1743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz */
1843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
1943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzpackage org.apache.harmony.jpda.tests.jdwp.Events;
2043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
2143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
2243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
2343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
2443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.VmMirror;
2543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
2643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
2743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport java.util.HashSet;
2843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzimport java.util.Set;
2943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
3043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz/**
3143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz * JDWP Unit test for multiple BREAKPOINT events.
3243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz */
3343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertzpublic class BreakpointMultipleTest extends JDWPEventTestCase {
3443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    protected String getDebuggeeClassName() {
3543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        return BreakpointDebuggee.class.getName();
3643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    }
3743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
3843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    /**
3943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * This testcase is for BREAKPOINT event. It checks we can set
4043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * multiple breakpoints at the same location.
4143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * <BR>It runs BreakpointDebuggee and sets two breakpoints in the
4243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * breakpointTest method, then clears both breakpoints.
4343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     */
4443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    public void testSetAndClearMultipleBreakpoint() {
4543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        logWriter.println("testSetAndClearMultipleBreakpoint started");
4643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
4743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
4843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
4943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Set breakpoints.
5043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        long classID = getClassIDBySignature(getDebuggeeClassSignature());
5143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        int breakpoint1 = setBreakpoint(classID);
5243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        int breakpoint2 = setBreakpoint(classID);
5343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
5443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Clear breakpoints
5543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        debuggeeWrapper.vmMirror.clearBreakpoint(breakpoint1);
5643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        debuggeeWrapper.vmMirror.clearBreakpoint(breakpoint2);
5743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
5843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Set breakpoint again to be sure we cleared breakpoints correctly in the runtime.
5943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        int breakpoint3 = setBreakpoint(classID);
6043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        debuggeeWrapper.vmMirror.clearBreakpoint(breakpoint3);
6143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
6243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
6343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
6443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        logWriter.println("testSetAndClearMultipleBreakpoint done");
6543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    }
6643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
6743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    /**
6843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * This testcase is for BREAKPOINT event. It checks we can set
6943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * multiple breakpoints at the same location.
7043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * <BR>It runs BreakpointDebuggee and sets two breakpoints in the
7143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * breakpointTest method, then checks we receive both events at
7243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * the same time.
7343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     */
7443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    public void testSetMultipleBreakpoint() {
7543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        logWriter.println("testSetMultipleBreakpoint started");
7643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
7743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
7843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
7943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Set breakpoints.
8043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        long classID = getClassIDBySignature(getDebuggeeClassSignature());
8143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        int breakpoint1 = setBreakpoint(classID);
8243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        int breakpoint2 = setBreakpoint(classID);
8343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
8443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
8543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
8643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Wait for event.
8743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        CommandPacket event = debuggeeWrapper.vmMirror.receiveEvent();
8843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
8943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Check we received all our BREAKPOINT events at the same time.
9043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
9143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        assertEquals("Invalid number of events,", 2, parsedEvents.length);
9243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        Set<Integer> request_ids = new HashSet<Integer>();
9343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        checkBreakpointEvent(parsedEvents[0], request_ids);
9443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        checkBreakpointEvent(parsedEvents[1], request_ids);
9543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        assertTrue("Breakpoint 1 is missing", request_ids.contains(breakpoint1));
9643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        assertTrue("Breakpoint 2 is missing", request_ids.contains(breakpoint2));
9743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
9843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Clear breakpoints.
9943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        debuggeeWrapper.vmMirror.clearBreakpoint(breakpoint1);
10043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        debuggeeWrapper.vmMirror.clearBreakpoint(breakpoint2);
10143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
10243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        // Resume debuggee so the test ends cleanly.
10343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        resumeDebuggee();
10443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
10543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        logWriter.println("testSetMultipleBreakpoint done");
10643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    }
10743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
10843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    /**
10943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * Sets a breakpoint at the start of the "breakpointTest"
11043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * method and returns its request ID.
11143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     */
11243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    private int setBreakpoint(long classID) {
11343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        VmMirror mirror = debuggeeWrapper.vmMirror;
114e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        return mirror.setBreakpointAtMethodBegin(classID, "breakpointTest");
11543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    }
11643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz
11743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    /**
11843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * Checks the given event is a BREAKPOINT event and adds its request
11943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     * ID to the given request set.
12043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz     */
12143b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    private void checkBreakpointEvent(ParsedEvent parsedEvent, Set<Integer> request_ids) {
12243b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        byte eventKind = parsedEvent.getEventKind();
12343b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        assertEquals("Invalid event kind,",
12443b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz                     JDWPConstants.EventKind.BREAKPOINT,
12543b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz                     eventKind,
12643b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz                     JDWPConstants.EventKind.getName(JDWPConstants.EventKind.BREAKPOINT),
12743b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz                     JDWPConstants.EventKind.getName(eventKind));
12843b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz        request_ids.add(parsedEvent.getRequestID());
12943b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz    }
13043b7ede3db59200890d43f1338dd88ae0fd87015Sebastien Hertz}
131