1   package net.sourceforge.quexec.server;
2   
3   
4   import static org.junit.Assert.assertEquals;
5   import static org.junit.Assert.assertFalse;
6   
7   import java.util.Arrays;
8   import java.util.concurrent.TimeoutException;
9   
10  import javax.annotation.Resource;
11  
12  import net.sourceforge.quexec.jms.AbstractJmsBasedTest;
13  import net.sourceforge.quexec.packet.chars.stream.CharPacketInputStream;
14  import net.sourceforge.quexec.proc.AsyncProcessHandle;
15  import net.sourceforge.quexec.proc.CatMain;
16  import net.sourceforge.quexec.proc.EchoArgsMain;
17  import net.sourceforge.quexec.proc.ProcessResult;
18  import net.sourceforge.quexec.proc.RemoteProcessStub;
19  
20  import org.junit.After;
21  import org.junit.Before;
22  import org.junit.Test;
23  import org.junit.runner.RunWith;
24  import org.springframework.beans.BeansException;
25  import org.springframework.context.ApplicationContext;
26  import org.springframework.context.ApplicationContextAware;
27  import org.springframework.test.context.ContextConfiguration;
28  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
29  
30  @RunWith(SpringJUnit4ClassRunner.class)
31  @ContextConfiguration(locations=
32  {"/net/sourceforge/quexec/server/ProcessExecutorServiceBean-context.xml",
33   "/net/sourceforge/quexec/proc/RemoteProcessStub-context.xml",
34   "/spring/jmsBase-context.xml",
35   "/spring/beanPostProcess-context.xml"})
36  public class ProcessExecutorServiceBeanTest extends AbstractJmsBasedTest
37  implements ApplicationContextAware {
38  	
39  	private ApplicationContext ctx;
40  	
41  	@Resource(name="quexec:processExecutorService")
42  	ProcessExecutorServiceBean execBean;
43  
44  	@Before
45  	public void setUp() throws Exception {
46  	}
47  
48  	@After
49  	public void tearDown() throws Exception {
50  	}
51  	
52  	@Override
53  	public void setApplicationContext(ApplicationContext ctx)
54  			throws BeansException {
55  		this.ctx = ctx;
56  	}
57  
58  	@Test(timeout=10000)
59  	public void runSyncSimpleCommand() {
60  		for (int i = 0; i < 3; i++) {
61  			ProcessResult result = this.execBean.runSyncJava(Arrays.asList(
62  					EchoArgsMain.class.getName(), "foo" + i));
63  			assertEquals(0, result.getReturnValue());
64  			assertEquals("foo" + i + "\n", result.getOutput());
65  		}
66  	}
67  
68  	@Test(timeout=10000, expected=NativeExecutionException.class)
69  	public void runSyncNonExistingCommand() {
70  			this.execBean.runSync(Arrays.asList("/dev/null/nowhere"));
71  	}
72  
73  	@Test(timeout=10000, expected=NativeExecutionException.class)
74  	public void runSyncCommandWithTimeout() {
75  		this.execBean.runSyncJava(Arrays.asList(CatMain.class.getName()), 10);
76  	}
77  
78  	@Test(timeout=10000)
79  	public void runAsyncSimpleCommand()
80  	throws InterruptedException, TimeoutException {
81  		AsyncProcessHandle handle = this.execBean.runAsyncJava(Arrays.asList(
82  				CatMain.class.getName()));
83  		
84  		RemoteProcessStub stub =
85  			(RemoteProcessStub) ctx.getBean("quexec:remoteProcessStub");
86  		stub.adjustProcessInputDestinationName(handle.getProcessInputQueueName());
87  		stub.adjustProcessOutputDestinationName(handle.getProcessOutputQueueName());
88  
89  		final String[] msg = {"foo", "bar", "baz and something else"};
90  		for (String s : msg) {
91  			stub.getProcessInput().sendPacket(s + "\n");
92  		}
93  		stub.getProcessInput().finish();
94  
95  		CharPacketInputStream processOutput = stub.getProcessOutput();
96  		for (String s : msg) {
97  			assertFalse(processOutput.isFinished());
98  			assertEquals(s + "\n", processOutput.readPacket());
99  		}
100 		while (!processOutput.isFinished());
101 	}
102 
103 }