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