View Javadoc

1   // Copyright (C) 2004 - 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.communication;
23  
24  import static org.junit.Assert.assertSame;
25  import static org.junit.Assert.fail;
26  import static org.mockito.Matchers.isA;
27  import static org.mockito.Mockito.doThrow;
28  import static org.mockito.Mockito.times;
29  import static org.mockito.Mockito.verify;
30  import static org.mockito.Mockito.verifyNoMoreInteractions;
31  
32  import org.junit.Before;
33  import org.junit.Test;
34  import org.mockito.Mock;
35  import org.mockito.MockitoAnnotations;
36  
37  
38  /**
39   *  Unit tests for {@link TeeSender}.
40   *
41   * @author Philip Aston
42   */
43  public class TestTeeSender {
44  
45    @Mock private Sender m_sender1;
46    @Mock private Sender m_sender2;
47  
48    @Before public void setUp() {
49      MockitoAnnotations.initMocks(this);
50    }
51  
52    @Test public void testWithGoodSenders() throws Exception {
53  
54      final TeeSender teeSender = new TeeSender(m_sender1, m_sender2);
55  
56      final Message m1 = new SimpleMessage();
57      final Message m2 = new SimpleMessage();
58  
59      teeSender.send(m1);
60      teeSender.send(m2);
61      teeSender.handle(m2);
62      teeSender.shutdown();
63  
64      verify(m_sender1).send(m1);
65      verify(m_sender1, times(2)).send(m2);
66      verify(m_sender1).shutdown();
67  
68      verify(m_sender2).send(m1);
69      verify(m_sender2, times(2)).send(m2);
70      verify(m_sender2).shutdown();
71  
72      verifyNoMoreInteractions(m_sender1, m_sender2);
73    }
74  
75    @Test public void testWithABadSender() throws Exception {
76  
77      final CommunicationException exceptionToThrowFromSend =
78        new CommunicationException("Foo");
79  
80      final RuntimeException exceptionToThrowFromShutdown =
81        new RuntimeException();
82  
83      doThrow(exceptionToThrowFromSend).when(m_sender2).send(isA(Message.class));
84      doThrow(exceptionToThrowFromShutdown).when(m_sender2).shutdown();
85  
86      // m_sender1 is first, so should be invoked before m_sender2 fails.
87      final TeeSender teeSender1 = new TeeSender(m_sender1, m_sender2);
88  
89      final Message m = new SimpleMessage();
90  
91      try {
92        teeSender1.send(m);
93        fail("Expected CommunicationException");
94      }
95      catch (CommunicationException e) {
96        assertSame(exceptionToThrowFromSend, e);
97      }
98  
99      verify(m_sender1).send(m);
100 
101     try {
102       teeSender1.shutdown();
103       fail("Expected RuntimeException");
104     }
105     catch (RuntimeException e) {
106       assertSame(exceptionToThrowFromShutdown, e);
107     }
108 
109     verify(m_sender1).shutdown();
110 
111     // goodSender is second, so will never be invoked.
112     final TeeSender teeSender2 = new TeeSender(m_sender2, m_sender1);
113 
114     try {
115       teeSender2.send(m);
116       fail("Expected CommunicationException");
117     }
118     catch (CommunicationException e) {
119       assertSame(exceptionToThrowFromSend, e);
120     }
121 
122     try {
123       teeSender2.shutdown();
124       fail("Expected RuntimeException");
125     }
126     catch (RuntimeException e) {
127       assertSame(exceptionToThrowFromShutdown, e);
128     }
129 
130     verifyNoMoreInteractions(m_sender1);
131   }
132 }