Bug 306858 - Investigate re-architecting RhinoDebugger* implementation
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/scripts/script1.js b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/scripts/script1.js
new file mode 100644
index 0000000..f19e46d
--- /dev/null
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/scripts/script1.js
@@ -0,0 +1,17 @@
+var line1 = true;
+function test() { //line 2
+ return; "line 3"; //line 3
+}//line 4
+// line 5
+var line6 = test();
+var line7 = test();
+// line 8
+// line 9
+var line10 = test();
+// line 11
+// line 12
+function test2() { // line 13
+ return "line 14"; //line 14
+} // line 15
+// line 16
+// line 17
\ No newline at end of file
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointTest.java
index 01d7ef8..2d47952 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointTest.java
@@ -210,7 +210,7 @@
} finally {
Context.exit();
}
- waitForEvents(7);
+ waitForEvents(8);
request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
response = debugSession.receiveResponse(request.getSequence(), 30000);
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointsTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointsTest.java
index 41fc8d5..53e098b 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointsTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestBreakpointsTest.java
@@ -19,6 +19,7 @@
import org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession;
import org.eclipse.wst.jsdt.debug.rhino.transport.DisconnectedException;
import org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket;
+import org.eclipse.wst.jsdt.debug.rhino.transport.JSONConstants;
import org.eclipse.wst.jsdt.debug.rhino.transport.Request;
import org.eclipse.wst.jsdt.debug.rhino.transport.Response;
import org.eclipse.wst.jsdt.debug.rhino.transport.TimeoutException;
@@ -28,11 +29,11 @@
public class RequestBreakpointsTest extends RequestTest {
public void testBreakpointsWithNoBreakpoints() throws DisconnectedException, TimeoutException {
- Request request = new Request("breakpoints");
+ Request request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
Response response = debugSession.receiveResponse(request.getSequence(), 30000);
assertTrue(response.isSuccess());
- Collection breakpoints = (Collection) response.getBody().get("breakpoints");
+ Collection breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertTrue(breakpoints.isEmpty());
}
@@ -94,11 +95,11 @@
};
eventHandler.addSubhandler(setbreakpointHandler);
- Request request = new Request("breakpoints");
+ Request request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
Response response = debugSession.receiveResponse(request.getSequence(), 30000);
assertTrue(response.isSuccess());
- Collection breakpoints = (Collection) response.getBody().get("breakpoints");
+ Collection breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertTrue(breakpoints.isEmpty());
@@ -131,11 +132,11 @@
waitForEvents(1);
- request = new Request("breakpoints");
+ request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
response = debugSession.receiveResponse(request.getSequence(), 30000);
assertTrue(response.isSuccess());
- breakpoints = (Collection) response.getBody().get("breakpoints");
+ breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertEquals(10, breakpoints.size());
@@ -212,7 +213,7 @@
Subhandler clearbreakpointHandler = new Subhandler() {
public boolean handleEvent(DebugSession debugSession, EventPacket event) {
if (event.getEvent().equals("break")) {
- List breakpoints = (List) event.getBody().get("breakpoints");
+ List breakpoints = (List) event.getBody().get(JSONConstants.BREAKPOINTS);
for (Iterator iterator = breakpoints.iterator(); iterator.hasNext();) {
Number breakpointId = (Number) iterator.next();
Request request = new Request("clearbreakpoint");
@@ -236,11 +237,11 @@
};
eventHandler.addSubhandler(clearbreakpointHandler);
- Request request = new Request("breakpoints");
+ Request request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
Response response = debugSession.receiveResponse(request.getSequence(), 30000);
assertTrue(response.isSuccess());
- Collection breakpoints = (Collection) response.getBody().get("breakpoints");
+ Collection breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertTrue(breakpoints.isEmpty());
@@ -270,12 +271,12 @@
} finally {
Context.exit();
}
- waitForEvents(7);
- request = new Request("breakpoints");
+ waitForEvents(8);
+ request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
response = debugSession.receiveResponse(request.getSequence(), 30000);
assertTrue(response.isSuccess());
- breakpoints = (Collection) response.getBody().get("breakpoints");
+ breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertEquals(3, breakpoints.size());
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestClearBreakpointTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestClearBreakpointTest.java
index eedc489..6d14a54 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestClearBreakpointTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestClearBreakpointTest.java
@@ -154,7 +154,7 @@
} finally {
Context.exit();
}
- waitForEvents(7);
+ waitForEvents(8);
request = new Request("breakpoints");
debugSession.sendRequest(request);
response = debugSession.receiveResponse(request.getSequence(), 30000);
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestScriptTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestScriptTest.java
index 86b0ddc..ee47838 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestScriptTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestScriptTest.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.wst.jsdt.debug.rhino.tests;
+import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -72,13 +73,13 @@
assertEquals(script, result.get("source"));
List lineNumbers = (List) result.get("lines");
assertEquals(7, lineNumbers.size());
- assertEquals(2, Util.numberAsInt(lineNumbers.get(0)));
- assertEquals(3, Util.numberAsInt(lineNumbers.get(1)));
- assertEquals(6, Util.numberAsInt(lineNumbers.get(2)));
- assertEquals(7, Util.numberAsInt(lineNumbers.get(3)));
- assertEquals(10, Util.numberAsInt(lineNumbers.get(4)));
- assertEquals(13, Util.numberAsInt(lineNumbers.get(5)));
- assertEquals(14, Util.numberAsInt(lineNumbers.get(6)));
+ assertTrue("The line number [2] should be returned", lineNumbers.contains(new BigDecimal(2)));
+ assertTrue("The line number [3] should be returned", lineNumbers.contains(new BigDecimal(3)));
+ assertTrue("The line number [6] should be returned", lineNumbers.contains(new BigDecimal(6)));
+ assertTrue("The line number [7] should be returned", lineNumbers.contains(new BigDecimal(7)));
+ assertTrue("The line number [10] should be returned", lineNumbers.contains(new BigDecimal(10)));
+ assertTrue("The line number [13] should be returned", lineNumbers.contains(new BigDecimal(13)));
+ assertTrue("The line number [14] should be returned", lineNumbers.contains(new BigDecimal(14)));
List functionNames = (List) result.get("functions");
assertEquals(2, functionNames.size());
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestSetBreakpointTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestSetBreakpointTest.java
index 6c665f2..d601e1c 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestSetBreakpointTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestSetBreakpointTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,174 +11,83 @@
package org.eclipse.wst.jsdt.debug.rhino.tests;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
-import org.eclipse.wst.jsdt.debug.rhino.tests.TestEventHandler.Subhandler;
-import org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket;
+import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
+import org.eclipse.wst.jsdt.debug.rhino.transport.JSONConstants;
import org.eclipse.wst.jsdt.debug.rhino.transport.Request;
import org.eclipse.wst.jsdt.debug.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.rhino.transport.TimeoutException;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
-import org.osgi.framework.Constants;
+/**
+ * Tests setting breakpoints and making sure we get the break events for them when evaluating the script
+ *
+ * @since 1.0
+ */
public class RequestSetBreakpointTest extends RequestTest {
- public void testBreakpointsWithNoBreakpoints() throws DisconnectedException, TimeoutException {
- Request request = new Request("breakpoints");
+ /**
+ * Tests asking for the current set of breakpoints when the session has none
+ *
+ * @throws Exception if the test fails
+ */
+ public void testBreakpointsWithNoBreakpoints() throws Exception {
+ Request request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
- Response response = debugSession.receiveResponse(request.getSequence(), 30000);
+ Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
assertTrue(response.isSuccess());
- Collection breakpoints = (Collection) response.getBody().get("breakpoints");
+ Collection breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertTrue(breakpoints.isEmpty());
}
- public void testGetSetClearBreakpoint() throws DisconnectedException, TimeoutException {
+ /**
+ * Tests setting a variety of breakpoints and that they are hit
+ *
+ * @throws Exception if the test fails
+ */
+ public void testGetSetClearBreakpoint() throws Exception {
+ eventHandler.addSubhandler(setBreakpointsHandler);
+ eventHandler.addSubhandler(clearBreakpointsHandler);
- Subhandler setbreakpointHandler = new Subhandler() {
- public boolean handleEvent(DebugSession debugSession, EventPacket event) {
- if (event.getEvent().equals("script")) {
- Object scriptId = event.getBody().get("scriptId");
- Request request = new Request("script");
- request.getArguments().put("scriptId", scriptId);
- try {
- debugSession.sendRequest(request);
- Response response = debugSession.receiveResponse(request.getSequence(), 10000);
- assertTrue(response.isSuccess());
- Map result = (Map) response.getBody().get("script");
-
- // line numbers
- List lineNumbers = (List) result.get("lines");
- for (Iterator iterator = lineNumbers.iterator(); iterator.hasNext();) {
- Number lineNumber = (Number) iterator.next();
- request = new Request("setbreakpoint");
- request.getArguments().put("scriptId", scriptId);
- request.getArguments().put("line", lineNumber);
- debugSession.sendRequest(request);
- response = debugSession.receiveResponse(request.getSequence(), 10000);
- assertTrue(response.isSuccess());
- }
-
- // functions
- List functionNames = (List) result.get("functions");
- for (Iterator iterator = functionNames.iterator(); iterator.hasNext();) {
- String functionName = (String) iterator.next();
- request = new Request("setbreakpoint");
- request.getArguments().put("scriptId", scriptId);
- request.getArguments().put("function", functionName);
- debugSession.sendRequest(request);
- response = debugSession.receiveResponse(request.getSequence(), 10000);
- assertTrue(response.isSuccess());
- }
-
- // script onEnter
- request = new Request("setbreakpoint");
- request.getArguments().put("scriptId", scriptId);
- debugSession.sendRequest(request);
- response = debugSession.receiveResponse(request.getSequence(), 10000);
- assertTrue(response.isSuccess());
- } catch (DisconnectedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (TimeoutException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return true;
- }
- return false;
- }
- };
- eventHandler.addSubhandler(setbreakpointHandler);
-
- Subhandler clearbreakpointHandler = new Subhandler() {
- public boolean handleEvent(DebugSession debugSession, EventPacket event) {
- if (event.getEvent().equals("break")) {
- List breakpoints = (List) event.getBody().get("breakpoints");
- for (Iterator iterator = breakpoints.iterator(); iterator.hasNext();) {
- Number breakpointId = (Number) iterator.next();
- Request request = new Request("clearbreakpoint");
- request.getArguments().put("breakpointId", breakpointId);
- try {
- debugSession.sendRequest(request);
- Response response = debugSession.receiveResponse(request.getSequence(), 10000);
- assertTrue(response.isSuccess());
- } catch (DisconnectedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (TimeoutException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return true;
- }
- return false;
- }
- };
- eventHandler.addSubhandler(clearbreakpointHandler);
-
- Request request = new Request("breakpoints");
+ Request request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
- Response response = debugSession.receiveResponse(request.getSequence(), 30000);
+ Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
assertTrue(response.isSuccess());
- Collection breakpoints = (Collection) response.getBody().get("breakpoints");
+ Collection breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertTrue(breakpoints.isEmpty());
-
- Map headers = new HashMap();
- headers.put(Constants.BUNDLE_SYMBOLICNAME, "test");
- String script = "var line1 = true;\r\n";
- script += "function test() { // line 2 \r\n";
- script += " return \"line 3\";\r\n";
- script += "} // line 4 \r\n";
- script += "// line 5\r\n";
- script += "var line6 = test();\r\n";
- script += "var line7 = test();\r\n";
- script += "// line 8\r\n";
- script += "// line 9\r\n";
- script += "var line10 = test();\r\n";
- script += "// line 11\r\n";
- script += "// line 12\r\n";
- script += "function test2() { // line 13 \r\n";
- script += " return \"line 14\";\r\n";
- script += "} // line 15 \r\n";
- script += "// line 16\r\n";
- script += "// line 17\r\n";
-
- Scriptable scope = null;
+ String script = Util.getTestSource(Util.SRC_SCRIPTS_CONTAINER, "script1.js");
+ assertNotNull("The test source for [script1.js] should exist", script);
Context context = contextFactory.enterContext();
try {
- scope = context.initStandardObjects();
- context.evaluateString(scope, script, "script", 0, null);
+ Scriptable scope = context.initStandardObjects();
+ context.evaluateString(scope, script, JSONConstants.SCRIPT, 0, null);
} finally {
Context.exit();
}
- waitForEvents(7);
- request = new Request("breakpoints");
+ waitForEvents(8);
+
+ request = new Request(JSONConstants.BREAKPOINTS);
debugSession.sendRequest(request);
- response = debugSession.receiveResponse(request.getSequence(), 30000);
+ response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
assertTrue(response.isSuccess());
- breakpoints = (Collection) response.getBody().get("breakpoints");
+ breakpoints = (Collection) response.getBody().get(JSONConstants.BREAKPOINTS);
assertNotNull(breakpoints);
assertEquals(3, breakpoints.size());
for (Iterator iterator = breakpoints.iterator(); iterator.hasNext();) {
Number breakpointId = (Number) iterator.next();
- request = new Request("breakpoint");
- request.getArguments().put("breakpointId", breakpointId);
+ request = new Request(JSONConstants.BREAKPOINT);
+ request.getArguments().put(JSONConstants.BREAKPOINT_ID, breakpointId);
debugSession.sendRequest(request);
- response = debugSession.receiveResponse(request.getSequence(), 10000);
+ response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
assertTrue(response.isSuccess());
- Map breakpoint = (Map) response.getBody().get("breakpoint");
- assertEquals(breakpointId.intValue(), Util.numberAsInt(breakpoint.get("breakpointId")));
- assertTrue(breakpoint.containsKey("scriptId"));
+ Map breakpoint = (Map) response.getBody().get(JSONConstants.BREAKPOINT);
+ assertEquals(breakpointId.intValue(), Util.numberAsInt(breakpoint.get(JSONConstants.BREAKPOINT_ID)));
+ assertTrue(breakpoint.containsKey(JSONConstants.SCRIPT_ID));
}
}
}
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestTest.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestTest.java
index 0f7c7ea..e2135b7 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestTest.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RequestTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,20 +10,158 @@
*******************************************************************************/
package org.eclipse.wst.jsdt.debug.rhino.tests;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import junit.framework.TestCase;
+import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
import org.eclipse.wst.jsdt.debug.rhino.debugger.RhinoDebugger;
+import org.eclipse.wst.jsdt.debug.rhino.tests.TestEventHandler.Subhandler;
import org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession;
+import org.eclipse.wst.jsdt.debug.rhino.transport.DisconnectedException;
+import org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket;
import org.eclipse.wst.jsdt.debug.rhino.transport.PipedTransportService;
+import org.eclipse.wst.jsdt.debug.rhino.transport.Request;
+import org.eclipse.wst.jsdt.debug.rhino.transport.Response;
+import org.eclipse.wst.jsdt.debug.rhino.transport.TimeoutException;
import org.eclipse.wst.jsdt.debug.rhino.transport.TransportService;
import org.mozilla.javascript.ContextFactory;
-public class RequestTest extends TestCase {
+/**
+ * Abstract test for making requests
+ *
+ * @since 1.0
+ */
+public abstract class RequestTest extends TestCase {
+ /**
+ * This default handler handles a script load event and sets a
+ * breakpoint on every single debuggable line
+ *
+ * @since 1.1
+ */
+ protected static Subhandler setBreakpointsHandler = new Subhandler() {
+ /* (non-Javadoc)
+ * @see org.eclipse.wst.jsdt.debug.rhino.tests.TestEventHandler.Subhandler#handleEvent(org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession, org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket)
+ */
+ public boolean handleEvent(DebugSession debugSession, EventPacket event) {
+ if (event.getEvent().equals("script")) {
+ Object scriptId = event.getBody().get("scriptId");
+ Request request = new Request("script");
+ request.getArguments().put("scriptId", scriptId);
+ try {
+ debugSession.sendRequest(request);
+ Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
+ assertTrue(response.isSuccess());
+ Map result = (Map) response.getBody().get("script");
+
+ // line numbers
+ List lineNumbers = (List) result.get("lines");
+ for (Iterator iterator = lineNumbers.iterator(); iterator.hasNext();) {
+ Number lineNumber = (Number) iterator.next();
+ request = new Request("setbreakpoint");
+ request.getArguments().put("scriptId", scriptId);
+ request.getArguments().put("line", lineNumber);
+ debugSession.sendRequest(request);
+ response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
+ assertTrue(response.isSuccess());
+ }
+
+ // functions
+ List functionNames = (List) result.get("functions");
+ for (Iterator iterator = functionNames.iterator(); iterator.hasNext();) {
+ String functionName = (String) iterator.next();
+ request = new Request("setbreakpoint");
+ request.getArguments().put("scriptId", scriptId);
+ request.getArguments().put("function", functionName);
+ debugSession.sendRequest(request);
+ response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
+ assertTrue(response.isSuccess());
+ }
+
+ // script onEnter
+ request = new Request("setbreakpoint");
+ request.getArguments().put("scriptId", scriptId);
+ debugSession.sendRequest(request);
+ response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
+ assertTrue(response.isSuccess());
+ } catch (DisconnectedException e) {
+ e.printStackTrace();
+ } catch (TimeoutException e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
+ return false;
+ }
+ };
+
+ /**
+ * Default handler that handles a <code>break</code> event and clears the
+ * associated breakpoint
+ *
+ * @since 1.1
+ */
+ protected static Subhandler clearBreakpointsHandler = new Subhandler() {
+ /* (non-Javadoc)
+ * @see org.eclipse.wst.jsdt.debug.rhino.tests.TestEventHandler.Subhandler#handleEvent(org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession, org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket)
+ */
+ public boolean handleEvent(DebugSession debugSession, EventPacket event) {
+ if (event.getEvent().equals("break")) {
+ List breakpoints = (List) event.getBody().get("breakpoints");
+ for (Iterator iterator = breakpoints.iterator(); iterator.hasNext();) {
+ Number breakpointId = (Number) iterator.next();
+ Request request = new Request("clearbreakpoint");
+ request.getArguments().put("breakpointId", breakpointId);
+ try {
+ debugSession.sendRequest(request);
+ Response response = debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
+ assertTrue(response.isSuccess());
+ } catch (DisconnectedException e) {
+ e.printStackTrace();
+ } catch (TimeoutException e) {
+ e.printStackTrace();
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+ };
+
protected RhinoDebugger debugger;
protected DebugSession debugSession;
protected TestEventHandler eventHandler;
protected ContextFactory contextFactory;
+ private static boolean tracing = false;
+ /**
+ * Turns on tracing for the test. All testing event handlers use this.
+ */
+ protected void useTracing() {
+ tracing = true;
+ }
+
+ /**
+ * Turns off tracing. This method is called on every {@link #tearDown()} invocation.
+ */
+ protected void disableTracing() {
+ tracing = false;
+ }
+
+ /**
+ * Returns if tracing is enabled
+ *
+ * @return if tracing is enabled
+ */
+ public static boolean isTracing() {
+ return tracing;
+ }
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
protected void setUp() throws Exception {
TransportService pipedTransport = new PipedTransportService();
ConnectionHelper helper = new ConnectionHelper(pipedTransport, null);
@@ -32,7 +170,7 @@
debugger.start();
debugSession = new DebugSession(helper.getClientConnection());
- eventHandler = new TestEventHandler(debugSession);
+ eventHandler = new TestEventHandler(debugSession, getName());
eventHandler.start();
assertTrue(debugger.suspendForRuntime(5000));
@@ -41,7 +179,11 @@
super.setUp();
}
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#tearDown()
+ */
protected void tearDown() throws Exception {
+ disableTracing();
super.tearDown();
contextFactory.removeListener(debugger);
eventHandler.stop();
@@ -49,8 +191,33 @@
debugSession.dispose();
}
+ /**
+ * Forces the backing event handler to block until the given number of events have been
+ * received or a timeout occurs.
+ *
+ * @param count the event count to wait for
+ */
synchronized void waitForEvents(int count) {
eventHandler.waitForEvents(count);
}
+ /**
+ * Sets the collection of specific events we are expecting to handle
+ *
+ * @param events the collection of events
+ */
+ synchronized void setExpectedEvents(EventPacket[] events) {
+ eventHandler.setExpectedEvents(events);
+ }
+
+ /**
+ * Forces the backing event handler to block until the given number of events have been
+ * received or a timeout occurs.
+ *
+ * @param events the specific set of events expected
+ * @see #setExpectedEvents(EventPacket[])
+ */
+ synchronized void waitForEvents(EventPacket[] events) {
+ eventHandler.waitForEvents(events);
+ }
}
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/AllTests.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RhinoDebugTestSuite.java
similarity index 92%
rename from tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/AllTests.java
rename to tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RhinoDebugTestSuite.java
index f7d0b50..757f2f8 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/AllTests.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/RhinoDebugTestSuite.java
@@ -11,13 +11,13 @@
import junit.framework.Test;
import junit.framework.TestSuite;
-public class AllTests extends TestSuite {
+public class RhinoDebugTestSuite extends TestSuite {
public static Test suite() {
- return new AllTests();
+ return new RhinoDebugTestSuite();
}
- public AllTests() {
+ public RhinoDebugTestSuite() {
addTestSuite(TransportTest.class);
addTestSuite(DebugSessionTest.class);
addTestSuite(RhinoDebuggerTest.class);
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/TestEventHandler.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/TestEventHandler.java
index 177a8f9..d3b6095 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/TestEventHandler.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/TestEventHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,121 +10,136 @@
*******************************************************************************/
package org.eclipse.wst.jsdt.debug.rhino.tests;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
-import java.util.Map;
+import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
import org.eclipse.wst.jsdt.debug.rhino.transport.DebugSession;
import org.eclipse.wst.jsdt.debug.rhino.transport.DisconnectedException;
import org.eclipse.wst.jsdt.debug.rhino.transport.EventPacket;
import org.eclipse.wst.jsdt.debug.rhino.transport.JSONUtil;
import org.eclipse.wst.jsdt.debug.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.rhino.transport.Response;
import org.eclipse.wst.jsdt.debug.rhino.transport.TimeoutException;
+/**
+ * Event handler for testing purposes
+ *
+ * @since 1.0
+ */
public class TestEventHandler implements Runnable {
+ /**
+ * Sub-handler for test to implement and add to the root {@link TestEventHandler}
+ */
public interface Subhandler {
boolean handleEvent(DebugSession debugSession, EventPacket event);
}
- public static Subhandler debugScriptSubhandler = new Subhandler() {
-
- public boolean handleEvent(DebugSession debugSession, EventPacket event) {
- if (event.getEvent().equals("script")) {
- Object scriptId = event.getBody().get("scriptId");
- Request request = new Request("script");
- request.getArguments().put("scriptId", scriptId);
- try {
- debugSession.sendRequest(request);
- Response response = debugSession.receiveResponse(request.getSequence(), 10000);
- System.out.println(JSONUtil.write(response.toJSON()));
- String lines = (String) ((Map) response.getBody().get("script")).get("source");
- BufferedReader reader = new BufferedReader(new StringReader(lines));
- try {
- int lineNumber = 1;
- String line = reader.readLine();
- while (line != null) {
- System.out.println("[" + lineNumber++ + "]: " + line);
- line = reader.readLine();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (DisconnectedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (TimeoutException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return false;
- }
-
- };
-
private DebugSession debugSession;
private Thread thread;
private final ArrayList subhandlers = new ArrayList();
+ private final ArrayList expectedEvents = new ArrayList();
private volatile boolean shutdown = false;
private int eventCount = 0;
+ private String testname = null;
- public TestEventHandler(DebugSession debugSession) {
+ /**
+ * Constructor
+ *
+ * @param debugSession the current session to handle
+ * @param testname the name of the test using this handler
+ */
+ public TestEventHandler(DebugSession debugSession, String testname) {
this.debugSession = debugSession;
this.thread = new Thread(this, "TestEventHandler");
+ this.testname = testname;
}
+ /**
+ * start the test handler
+ */
public void start() {
thread.start();
}
+ /**
+ * stop the test handler
+ */
public void stop() {
shutdown = true;
+ this.expectedEvents.clear();
+ this.subhandlers.clear();
+ this.eventCount = 0;
thread.interrupt();
try {
thread.join();
} catch (InterruptedException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
-
}
+ /**
+ * Sets the events that the handler is expected to receive
+ * @param events
+ */
+ public void setExpectedEvents(EventPacket[] events) {
+ this.expectedEvents.clear();
+ for (int i = 0; i < events.length; i++) {
+ this.expectedEvents.add(events[i]);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Runnable#run()
+ */
public void run() {
while (!shutdown) {
try {
- EventPacket event = debugSession.receiveEvent(1000);
+ EventPacket event = debugSession.receiveEvent(VirtualMachine.DEFAULT_TIMEOUT);
handleEvent(event);
} catch (TimeoutException e) {
- // ignore
+ //ignore
} catch (DisconnectedException e) {
- // TODO Auto-generated catch block
e.printStackTrace();
}
}
-
}
+ /**
+ * Add a sub handler
+ * @param subhandler
+ */
public synchronized void addSubhandler(Subhandler subhandler) {
subhandlers.add(subhandler);
}
+ /**
+ * Remove a sub handler
+ * @param subhandler
+ */
public synchronized void removeSubhandler(Subhandler subhandler) {
subhandlers.remove(subhandler);
}
+ /**
+ * Handles the given event packet
+ * @param event
+ */
private synchronized void handleEvent(EventPacket event) {
- // System.out.println(JSONUtil.write(event.toJSON()));
+ String estring = null;
+ if(RequestTest.isTracing()) {
+ estring = JSONUtil.write(event.toJSON());
+ System.out.println(this.testname+" got event: "+estring);
+ }
for (Iterator iterator = subhandlers.iterator(); iterator.hasNext();) {
Subhandler subhandler = (Subhandler) iterator.next();
try {
if (subhandler.handleEvent(debugSession, event)) {
+ if(RequestTest.isTracing()) {
+ System.out.println("\t"+this.testname+" handled event: "+estring);
+ }
+ this.expectedEvents.remove(event);
eventCount++;
notifyAll();
}
@@ -138,6 +153,11 @@
}
+ /**
+ * Continues the handler
+ * @param event
+ * @param step
+ */
protected void sendContinue(EventPacket event, String step) {
Number threadId = (Number) event.getBody().get("threadId");
@@ -146,7 +166,7 @@
request.getArguments().put("step", step);
try {
debugSession.sendRequest(request);
- debugSession.receiveResponse(request.getSequence(), 1000);
+ debugSession.receiveResponse(request.getSequence(), VirtualMachine.DEFAULT_TIMEOUT);
} catch (DisconnectedException e) {
if (!shutdown)
e.printStackTrace();
@@ -156,6 +176,10 @@
}
}
+ /**
+ * Waits for all of the events specified from {@link #setExpectedEvents(EventPacket[])}
+ * @param count
+ */
public synchronized void waitForEvents(int count) {
long timeout = System.currentTimeMillis() + 5000;
while (eventCount < count && System.currentTimeMillis() < timeout) {
@@ -165,12 +189,47 @@
e.printStackTrace();
}
}
- if (eventCount != count) {
- throw new IllegalStateException("eventcount was: " + eventCount + " expected: " + count);
+ try {
+ if (eventCount != count) {
+ throw new IllegalStateException("eventcount was: " + eventCount + " expected: " + count);
+ }
+ }
+ finally {
+ this.eventCount = 0;
}
}
-
- public int eventCount() {
- return eventCount;
+
+ /**
+ * Waits for the given collection of events to be handled, or a default timeout to occur
+ * @param events
+ */
+ public synchronized void waitForEvents(EventPacket[] events) {
+ long timeout = System.currentTimeMillis() + 5000;
+ while(!this.expectedEvents.isEmpty() && System.currentTimeMillis() < timeout) {
+ try {
+ wait(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ if(!this.expectedEvents.isEmpty()) {
+ try {
+ throw new IllegalStateException("Some expected events were not received");
+ }
+ finally {
+ this.eventCount = 0;
+ for (int i = 0; i < this.expectedEvents.size(); i++) {
+ System.out.println(this.testname+" missed expected event: "+JSONUtil.write(this.expectedEvents.get(i)));
+ }
+ }
+ }
+ if(this.eventCount > events.length) {
+ try {
+ throw new IllegalStateException(this.testname+" got too many events - expected ["+events.length+"] got ["+eventCount+"]");
+ }
+ finally {
+ this.eventCount = 0;
+ }
+ }
}
}
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/Util.java b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/Util.java
index c8f664a..e0f8b5c 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/Util.java
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/src/org/eclipse/wst/jsdt/debug/rhino/tests/Util.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,10 +10,199 @@
*******************************************************************************/
package org.eclipse.wst.jsdt.debug.rhino.tests;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * Collection of utility methods for tests
+ *
+ * @since 1.0
+ */
public class Util {
+ /**
+ * BiDi
+ * @since 1.1
+ */
+ public static final String UTF_8 = "UTF-8";
+ /**
+ * The name of the source container <code>scripts</code> in the test bundle
+ * @since 1.1
+ */
+ public static final String SRC_SCRIPTS_CONTAINER = "scripts";
+
+ /**
+ * Constant representing the default size to read from an input stream
+ * @since 1.1
+ */
+ private static final int DEFAULT_READING_SIZE = 8192;
+
+ /**
+ * Returns the int value of the given {@link Number}
+ * @param number
+ * @return
+ */
public static int numberAsInt(Object number) {
return ((Number) number).intValue();
}
+ /**
+ * Returns the OS path to the directory that contains the test plugin.
+ *
+ * @since 1.1
+ */
+ public static IPath getPluginDirectoryPath() {
+ if (Platform.isRunning()) {
+ try {
+ URL platformURL = Platform.getBundle("org.eclipse.wst.jsdt.debug.rhino.tests").getEntry("/");
+ return new Path(new File(FileLocator.toFileURL(platformURL).getFile()).getAbsolutePath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return new Path(System.getProperty("user.dir"));
+ }
+
+ /**
+ * Loads the test source with the given name. If the source does not exist
+ * a {@link FileNotFoundException} is thrown.
+ *
+ * @param container the folder in the test project containing the source
+ * @param sourcename the name of the source file to load
+ *
+ * @return the {@link String} representation of the source or <code>null</code>
+ * @throws FileNotFoundException if the source does not exist
+ * @since 1.1
+ */
+ public static String getTestSource(String container, String sourcename) {
+ return getFileContentAsString(getPluginDirectoryPath().append(container).append(sourcename).toFile());
+ }
+
+ /**
+ * Returns the contents of the given file as a string, or <code>null</code>
+ *
+ * @param file the file to get the contents for
+ * @return the contents of the file as a {@link String} or <code>null</code>
+ * @since 1.1
+ */
+ public static String getFileContentAsString(File file) {
+ String contents = null;
+ FileInputStream stream = null;
+ try {
+ stream = new FileInputStream(file);
+ char[] array = getInputStreamAsCharArray(stream, -1, "UTF-8");
+ contents = new String(array);
+ }
+ catch(IOException ioe) {
+ ioe.printStackTrace();
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ return contents;
+ }
+
+ /**
+ * Returns the given input stream's contents as a character array.
+ * If a length is specified (i.e. if length != -1), this represents the number of bytes in the stream.
+ * Note the specified stream is not closed in this method
+ *
+ * @param stream the stream to get convert to the char array
+ * @param length the length of the input stream, or -1 if unknown
+ * @param encoding the encoding to use when reading the stream
+ * @return the given input stream's contents as a character array.
+ * @throws IOException if a problem occurred reading the stream.
+ * @since 1.1
+ */
+ public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding) throws IOException {
+ Charset charset = null;
+ try {
+ charset = Charset.forName(encoding);
+ } catch (IllegalCharsetNameException e) {
+ System.err.println("Illegal charset name : " + encoding); //$NON-NLS-1$
+ return null;
+ } catch(UnsupportedCharsetException e) {
+ System.err.println("Unsupported charset : " + encoding); //$NON-NLS-1$
+ return null;
+ }
+ CharsetDecoder charsetDecoder = charset.newDecoder();
+ charsetDecoder.onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE);
+ byte[] contents = getInputStreamAsByteArray(stream, length);
+ ByteBuffer byteBuffer = ByteBuffer.allocate(contents.length);
+ byteBuffer.put(contents);
+ byteBuffer.flip();
+ return charsetDecoder.decode(byteBuffer).array();
+ }
+
+ /**
+ * Returns the given input stream as a byte array
+ *
+ * @param stream the stream to get as a byte array
+ * @param length the length to read from the stream or -1 for unknown
+ * @return the given input stream as a byte array
+ * @throws IOException
+ * @since 1.1
+ */
+ public static byte[] getInputStreamAsByteArray(InputStream stream, int length) throws IOException {
+ byte[] contents;
+ if (length == -1) {
+ contents = new byte[0];
+ int contentsLength = 0;
+ int amountRead = -1;
+ do {
+ // read at least 8K
+ int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE);
+ // resize contents if needed
+ if (contentsLength + amountRequested > contents.length) {
+ System.arraycopy(contents,
+ 0,
+ contents = new byte[contentsLength + amountRequested],
+ 0,
+ contentsLength);
+ }
+ // read as many bytes as possible
+ amountRead = stream.read(contents, contentsLength, amountRequested);
+ if (amountRead > 0) {
+ // remember length of contents
+ contentsLength += amountRead;
+ }
+ } while (amountRead != -1);
+ // resize contents if necessary
+ if (contentsLength < contents.length) {
+ System.arraycopy(contents, 0, contents = new byte[contentsLength], 0, contentsLength);
+ }
+ } else {
+ contents = new byte[length];
+ int len = 0;
+ int readSize = 0;
+ while ((readSize != -1) && (len != length)) {
+ // See PR 1FMS89U
+ // We record first the read size. In this case length is the actual
+ // read size.
+ len += readSize;
+ readSize = stream.read(contents, len, length - len);
+ }
+ }
+ return contents;
+ }
}
diff --git a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/test.xml b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/test.xml
index 95bfa66..a2b6dc3 100644
--- a/tests/org.eclipse.wst.jsdt.debug.rhino.tests/test.xml
+++ b/tests/org.eclipse.wst.jsdt.debug.rhino.tests/test.xml
@@ -18,7 +18,7 @@
value="org.eclipse.wst.jsdt.debug.rhino.tests" />
<property
name="classname"
- value="org.eclipse.wst.jsdt.debug.rhino.tests.AllTests" />
+ value="org.eclipse.wst.jsdt.debug.rhino.tests.RhinoDebugTestSuite" />
<property
name="testType"
value="core-test" />