1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package net.grinder.engine.agent;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.junit.Assert.fail;
28
29 import java.io.InputStream;
30
31 import net.grinder.common.UncheckedInterruptedException;
32 import net.grinder.communication.StreamSender;
33 import net.grinder.engine.agent.AgentIdentityImplementation.WorkerIdentityImplementation;
34 import net.grinder.engine.agent.DebugThreadWorker.IsolateGrinderProcessRunner;
35 import net.grinder.testutility.DelegatingStubFactory;
36 import net.grinder.testutility.RedirectStandardStreams;
37
38 import org.junit.Test;
39
40
41
42
43
44
45
46 public class TestDebugThreadWorker {
47
48 private final WorkerIdentityImplementation m_workerIdentity =
49 new AgentIdentityImplementation(getClass().getName())
50 .createWorkerIdentity();
51
52 @Test public void testDebugThreadWorker() throws Exception {
53
54 final DelegatingStubFactory<IsolatedGrinderProcessRunner>
55 isolateGrinderProcessRunnerStubFactory =
56 DelegatingStubFactory.create(new IsolatedGrinderProcessRunner());
57
58 final DebugThreadWorker worker =
59 new DebugThreadWorker(m_workerIdentity,
60 isolateGrinderProcessRunnerStubFactory.getStub());
61
62 assertEquals(m_workerIdentity, worker.getIdentity());
63 assertNotNull(worker.getCommunicationStream());
64
65 worker.start();
66
67 final int[] resultHolder = { -1 };
68
69 final Thread waitThread = new Thread() {
70 public void run() {
71 resultHolder[0] = worker.waitFor();
72 }
73 };
74
75 waitThread.start();
76
77 assertEquals(-1, resultHolder[0]);
78 assertTrue(waitThread.isAlive());
79
80 final RedirectStandardStreams streams = new RedirectStandardStreams() {
81 protected void runWithRedirectedStreams() throws Exception {
82 new StreamSender(worker.getCommunicationStream()).shutdown();
83 waitThread.join();
84 }
85 };
86
87 streams.run();
88
89 isolateGrinderProcessRunnerStubFactory.assertSuccess(
90 "run", InputStream.class);
91
92 assertEquals(-2, resultHolder[0]);
93 final String output = new String(streams.getStderrBytes());
94 assertTrue(output.indexOf("No control stream from agent") > 0);
95
96 worker.destroy();
97 }
98
99 @Test public void testInterruption() throws Exception {
100
101 final DebugThreadWorker debugThreadWorker =
102 new DebugThreadWorker(
103 m_workerIdentity,
104 new IsolateGrinderProcessRunner() {
105 public int run(InputStream agentInputStream) {
106 try {
107 Thread.sleep(10000);
108 }
109 catch (InterruptedException e) {
110 }
111 return 0;
112 }});
113
114 debugThreadWorker.start();
115
116 Thread.currentThread().interrupt();
117
118 try {
119 debugThreadWorker.waitFor();
120 fail("Expected UncheckedInterruptedException");
121 }
122 catch (UncheckedInterruptedException e) {
123 }
124
125 debugThreadWorker.destroy();
126 debugThreadWorker.waitFor();
127 }
128 }