View Javadoc

1   // Copyright (C) 2005 - 2011 Philip Aston
2   // All rights reserved.
3   //
4   // This file is part of The Grinder software distribution. Refer to
5   // the file LICENSE which is part of The Grinder distribution for
6   // licensing details. The Grinder distribution is available on the
7   // Internet at http://grinder.sourceforge.net/
8   //
9   // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
12  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
13  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
14  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15  // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
16  // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
17  // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
19  // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
20  // OF THE POSSIBILITY OF SUCH DAMAGE.
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   * Unit tests for {@link DebugThreadWorker}/
43   *
44   * @author Philip Aston
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 }