View Javadoc

1   // Copyright (C) 2003 - 2012 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.communication;
23  
24  import static org.junit.Assert.assertEquals;
25  import static org.junit.Assert.assertNotNull;
26  import static org.junit.Assert.assertNull;
27  import static org.junit.Assert.fail;
28  
29  import java.io.InputStream;
30  import java.io.ObjectOutputStream;
31  import java.io.OutputStream;
32  import java.net.Socket;
33  
34  import net.grinder.communication.Connector.ConnectDetails;
35  
36  import org.junit.Test;
37  
38  
39  /**
40   *  Unit tests for {@link ClientReceiver}.
41   *
42   * @author Philip Aston
43   */
44  public class TestClientReceiver {
45  
46    @Test public void testReceive() throws Exception {
47  
48      final SocketAcceptorThread socketAcceptor = SocketAcceptorThread.create();
49  
50      final Connector connector =
51        new Connector(socketAcceptor.getHostName(), socketAcceptor.getPort(),
52                      ConnectionType.AGENT);
53  
54      final Address address = new StubAddress();
55  
56      final Receiver clientReceiver = ClientReceiver.connect(connector, address);
57  
58      socketAcceptor.join();
59  
60      final Socket acceptedSocket = socketAcceptor.getAcceptedSocket();
61  
62      assertConnection(
63        acceptedSocket.getInputStream(), ConnectionType.AGENT, address);
64  
65      final OutputStream socketOutput = acceptedSocket.getOutputStream();
66  
67      final SimpleMessage message1 = new SimpleMessage();
68  
69      final ObjectOutputStream objectStream1 =
70        new ObjectOutputStream(socketOutput);
71      objectStream1.writeObject(message1);
72      objectStream1.flush();
73  
74      final SimpleMessage message2 = new SimpleMessage();
75  
76      final ObjectOutputStream objectStream2 =
77        new ObjectOutputStream(socketOutput);
78      objectStream2.writeObject(message2);
79      objectStream2.flush();
80  
81      final Message receivedMessage1 = clientReceiver.waitForMessage();
82      final Message receivedMessage2 = clientReceiver.waitForMessage();
83  
84      assertEquals(message1, receivedMessage1);
85      assertEquals(message2, receivedMessage2);
86  
87      socketAcceptor.close();
88  
89      try {
90        ClientReceiver.connect(connector, address);
91        fail("Expected CommunicationException");
92      }
93      catch (CommunicationException e) {
94      }
95    }
96  
97    private void assertConnection(InputStream in,
98                                  ConnectionType type,
99                                  Address address) throws Exception {
100     final ConnectDetails details = Connector.read(in);
101     assertEquals(type, details.getConnectionType());
102     assertEquals(address, details.getAddress());
103   }
104 
105   @Test public void testShutdown() throws Exception {
106 
107     final SocketAcceptorThread socketAcceptor = SocketAcceptorThread.create();
108 
109     final Connector connector =
110       new Connector(socketAcceptor.getHostName(), socketAcceptor.getPort(),
111                     ConnectionType.AGENT);
112 
113     final Address address = new StubAddress();
114 
115     final Receiver clientReceiver = ClientReceiver.connect(connector, address);
116 
117     socketAcceptor.join();
118 
119     final Socket acceptedSocket = socketAcceptor.getAcceptedSocket();
120     assertConnection(
121       acceptedSocket.getInputStream(), ConnectionType.AGENT, address);
122 
123     final OutputStream socketOutput = acceptedSocket.getOutputStream();
124 
125     final SimpleMessage message1 = new SimpleMessage();
126 
127     final ObjectOutputStream objectStream1 =
128       new ObjectOutputStream(socketOutput);
129     objectStream1.writeObject(message1);
130     objectStream1.flush();
131 
132     final Message receivedMessage = clientReceiver.waitForMessage();
133     assertNotNull(receivedMessage);
134 
135     clientReceiver.shutdown();
136 
137     assertNull(clientReceiver.waitForMessage());
138 
139     socketAcceptor.close();
140   }
141 
142   @Test public void testCloseCommunicationMessage() throws Exception {
143 
144     final SocketAcceptorThread socketAcceptor = SocketAcceptorThread.create();
145 
146     final Connector connector =
147       new Connector(socketAcceptor.getHostName(), socketAcceptor.getPort(),
148                     ConnectionType.AGENT);
149 
150     final Address address = new StubAddress();
151 
152     final Receiver clientReceiver = ClientReceiver.connect(connector, address);
153 
154     socketAcceptor.join();
155 
156     final Socket acceptedSocket = socketAcceptor.getAcceptedSocket();
157 
158     assertConnection(
159       acceptedSocket.getInputStream(), ConnectionType.AGENT, address);
160 
161     final OutputStream socketOutput = acceptedSocket.getOutputStream();
162 
163     final SimpleMessage message1 = new SimpleMessage();
164 
165     final ObjectOutputStream objectStream1 =
166       new ObjectOutputStream(socketOutput);
167     objectStream1.writeObject(message1);
168     objectStream1.flush();
169 
170     final Message receivedMessage = clientReceiver.waitForMessage();
171     assertNotNull(receivedMessage);
172 
173     final Message closeCommunicationMessage = new CloseCommunicationMessage();
174 
175     final ObjectOutputStream objectStream2 =
176       new ObjectOutputStream(socketOutput);
177     objectStream2.writeObject(closeCommunicationMessage);
178     objectStream2.flush();
179 
180     assertNull(clientReceiver.waitForMessage());
181 
182     socketAcceptor.close();
183   }
184 }
185