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 }