package org.rubypeople.rdt.debug.core.tests; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintWriter; import java.util.HashMap; import junit.framework.TestCase; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.rubypeople.rdt.debug.core.RdtDebugModel; import org.rubypeople.rdt.debug.core.model.IRubyExceptionBreakpoint; import org.rubypeople.rdt.internal.debug.core.RubyDebuggerProxy; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; public class FTC_DebuggerProxyTest extends TestCase { private PrintWriter writer; private RubyDebuggerProxy proxy; private TestRubyDebugTarget target; private BufferedReader proxyOutputReader; public FTC_DebuggerProxyTest(String name) { super(name); } protected PrintWriter getPrintWriter() { return writer; } public RubyDebuggerProxy getProxy() { return proxy; } public TestRubyDebugTarget getTarget() { return target; } public void writeToDebuggerProxy(String text) throws Exception { getPrintWriter().println(text); getPrintWriter().flush(); } public String getLineFromDebuggerProxy() throws IOException { return proxyOutputReader.readLine(); } public void setUp() throws Exception { target = new TestRubyDebugTarget(); proxy = new RubyDebuggerProxy(target, false /* useRubyDebug */); PipedInputStream pipedInputStream = new PipedInputStream(); PipedOutputStream pipedOutputStream = new PipedOutputStream(pipedInputStream); XmlPullParserFactory factory = XmlPullParserFactory.newInstance( "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer", null); XmlPullParser xpp = factory.newPullParser(); // tODO: connect streams to DebuggerConnection PipedOutputStream outputStream = new PipedOutputStream(); PipedInputStream inputStream = new PipedInputStream(outputStream); xpp.setInput(new InputStreamReader(inputStream)); proxy.startRubyLoop(); writer = new PrintWriter(new OutputStreamWriter(outputStream)); proxyOutputReader = new BufferedReader(new InputStreamReader(pipedInputStream)); } public void testMultipleBreakpoints() throws Exception { writeToDebuggerProxy("<breakpoint file=\"\" line=\"44\" threadId=\"2\"/>"); Thread.sleep(2000); assertNotNull(getTarget().getLastSuspensionPoint()); assertEquals(44, getTarget().getLastSuspensionPoint().getLine()); new Thread() { public void run() { try { Thread.sleep(2000); writeToDebuggerProxy("<breakpoint file=\"\" line=\"55\" threadId=\"2\"/>"); writeToDebuggerProxy("<threads><thread id=\"1\" status=\"sleep\"/></threads>"); } catch (Exception ex) { fail(); } } }.start(); Thread.sleep(1000); assertEquals(55, getTarget().getLastSuspensionPoint().getLine()); } public void testExceptionBreakpoint() throws IOException, CoreException { IResource resource = ResourcesPlugin.getWorkspace().getRoot(); IRubyExceptionBreakpoint rubyExceptionBreakpoint = RdtDebugModel.createExceptionBreakpoint(resource, "MyStandardError", true, new HashMap()); proxy.addBreakpoint(rubyExceptionBreakpoint); assertEquals("cont", this.getLineFromDebuggerProxy()); assertEquals("catch MyStandardError", this.getLineFromDebuggerProxy()); } }