package org.rubypeople.rdt.debug.core.tests;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintWriter;
import junit.framework.TestCase;
import org.rubypeople.rdt.internal.debug.core.parsing.MultiReaderStrategy;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
public class FTC_ReadStrategyTest extends TestCase {
protected PrintWriter writer ;
protected XmlPullParser xpp ;
public FTC_ReadStrategyTest(String name) {
super(name);
}
public void setUp() throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance("org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer", null);
xpp = factory.newPullParser();
PipedOutputStream outputStream = new PipedOutputStream() ;
PipedInputStream inputStream = new PipedInputStream(outputStream) ;
xpp.setInput(new InputStreamReader(inputStream)) ;
writer = new PrintWriter(new OutputStreamWriter(outputStream)) ;
}
public void testSingleReaderStrategy() throws Exception {
final TestXmlStreamReader reader = new TestXmlStreamReader(xpp) ;
reader.acceptTag("testTag") ;
Thread testTagReaderThread = new Thread() {
public void run() {
try {
reader.read() ;
} catch (Exception ex) {
}
}
} ;
testTagReaderThread.start() ;
writer.println("<testTag/>") ;
writer.flush() ;
testTagReaderThread.join() ;
assertTrue("testTag", reader.isTagRead()) ;
}
public void testMultiReaderStrategy() throws Exception {
MultiReaderStrategy multiReaderStrategy = new MultiReaderStrategy(xpp) ;
final TestXmlStreamReader testTagReader = new TestXmlStreamReader(multiReaderStrategy) ;
testTagReader.acceptTag("testTag") ;
Thread testTagReaderThread = new Thread() {
public void run() {
try {
testTagReader.read() ;
} catch (Exception ex) {
}
}
} ;
testTagReaderThread.start() ;
final TestXmlStreamReader breakpointReader = new TestXmlStreamReader(multiReaderStrategy) ;
breakpointReader.acceptTag("breakpoint") ;
Thread breakpointReaderThread = new Thread() {
public void run() {
try {
breakpointReader.read() ;
} catch (Exception ex) {
}
}
} ;
breakpointReaderThread.start() ;
Thread.sleep(500) ; // wait for threads to be started
assertTrue(testTagReaderThread.isAlive()) ;
assertTrue(breakpointReaderThread.isAlive()) ;
writer.println("<testTag/>") ;
writer.flush() ;
testTagReaderThread.join() ;
assertTrue("testTag was read.", testTagReader.isTagRead()) ;
assertTrue("breakpoint was not yet read.", !breakpointReader.isTagRead()) ;
assertTrue("breakpointReaderThread has not yet finished.",breakpointReaderThread.isAlive()) ;
writer.println("<breakpoint/>") ;
writer.flush() ;
breakpointReaderThread.join() ;
assertTrue("breakpoint was read.", breakpointReader.isTagRead()) ;
}
public void testMultiReaderStrategyWithMultipleTags() throws Exception {
// make sure that a complete element gets dispatched to the reader
MultiReaderStrategy multiReaderStrategy = new MultiReaderStrategy(xpp);
final TestXmlStreamReader testTagReader = new TestXmlStreamReader(multiReaderStrategy) ;
testTagReader.acceptTag("testTag");
Thread testTagReaderThread = new Thread() {
public void run() {
try {
testTagReader.read() ;
} catch (Exception ex) {
}
}
} ;
testTagReaderThread.start();
Thread.sleep(500); // wait for threads to be started
writer.println("<testTag><testTag><testTag/><testTag/></testTag>") ;
writer.flush() ;
testTagReaderThread.join();
assertEquals("testTag was read 3 times.", 3, testTagReader.getTagReadCount());
}
public void testMultiReaderStrategyDontMissTag() throws Exception {
// make sure the element is delivered to the reader, even if the reader is started after
// the tag is fetched from the xpp
writer.println("<testTag><testTag/></testTag>") ;
writer.flush() ;
MultiReaderStrategy multiReaderStrategy = new MultiReaderStrategy(xpp) ;
final TestXmlStreamReader testTagReader = new TestXmlStreamReader(multiReaderStrategy) ;
testTagReader.acceptTag("testTag") ;
Thread testTagReaderThread = new Thread() {
public void run() {
try {
testTagReader.read() ;
} catch (Exception ex) {
fail() ;
}
}
} ;
Thread.sleep(500) ; // wait to make this test more evil
testTagReaderThread.start() ;
Thread.sleep(500) ; // wait for threads to be started
testTagReaderThread.join() ;
assertEquals("testTag was read 2 times.", 2, testTagReader.getTagReadCount()) ;
}
}