1   package net.sourceforge.quexec.proc;
2   
3   
4   import static org.junit.Assert.assertEquals;
5   
6   import java.io.IOException;
7   import java.io.PipedReader;
8   import java.io.PipedWriter;
9   import java.util.concurrent.TimeoutException;
10  
11  import javax.annotation.Resource;
12  
13  import net.sourceforge.quexec.packet.chars.producer.AbstractReaderCharPacketProducer;
14  
15  import org.apache.commons.lang.StringUtils;
16  import org.apache.commons.logging.Log;
17  import org.apache.commons.logging.LogFactory;
18  import org.junit.Test;
19  import org.junit.runner.RunWith;
20  import org.springframework.test.context.ContextConfiguration;
21  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
22  
23  @RunWith(SpringJUnit4ClassRunner.class)
24  @ContextConfiguration(locations={
25  		"/net/sourceforge/quexec/proc/LocalProcessController-context.xml",
26          "/spring/beanPostProcess-context.xml"})
27  public class ProcessCharPacketStreamsToJavaIOLinkTest {
28  	
29  	private static final Log log =
30  		LogFactory.getLog(ProcessCharPacketStreamsToJavaIOLinkTest.class);
31  
32  	@Resource(name="quexec:localProcessController")
33  	LocalProcessController procCtrl;
34  	
35  	@Test(timeout=3000)
36  	public void linkProcessIOToStringStreams()
37  	throws IOException, InterruptedException, TimeoutException {
38  		PipedWriter procInWriter = new PipedWriter();
39  		PipedReader procInReader = new PipedReader(procInWriter);
40  		
41  		PipedReader procOutReader = new PipedReader();
42  		PipedWriter procOutWriter = new PipedWriter(procOutReader);
43  		
44  		ProcessExecutor pexec = procCtrl.getProcessExecutor();
45  		
46  		ProcessCharPacketStreamsToJavaIOLink ioLink =
47  			new ProcessCharPacketStreamsToJavaIOLink(procCtrl,
48  					procInReader, procOutWriter,
49  					AbstractReaderCharPacketProducer.ReadMode.BLOCKING);
50  
51  		pexec.execJava(CatMain.class.getName());
52  		
53  		ioLink.link();
54  		
55  		final String[] msg = {"foo", "bar", "baz and something else"};
56  		for (String s : msg) {
57  			procInWriter.write(s + "\n");
58  		}
59  		procInWriter.close();
60  		
61  		pexec.waitFor();
62  
63  		StringBuilder result = new StringBuilder();
64  		int ch;
65  		while ((ch = procOutReader.read()) != -1) {
66  			result.append((char) ch);
67  			log.debug("char read. buffer content: " + result.toString());
68  		}
69  		assertEquals(StringUtils.join(msg, '\n') + "\n", result.toString());
70  		
71  		ioLink.awaitEndOfOutputProducer();
72  		ioLink.shutdown();
73  	}
74  
75  }