View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.routing;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertNotNull;
11  import static org.junit.Assert.assertNull;
12  import static org.junit.Assert.assertSame;
13  import static org.junit.Assert.assertTrue;
14  
15  import org.mule.DefaultMessageCollection;
16  import org.mule.DefaultMuleEvent;
17  import org.mule.DefaultMuleMessage;
18  import org.mule.api.MuleContext;
19  import org.mule.api.MuleEvent;
20  import org.mule.api.MuleMessage;
21  import org.mule.api.MuleMessageCollection;
22  import org.mule.api.MuleSession;
23  import org.mule.api.endpoint.InboundEndpoint;
24  import org.mule.api.routing.RouterResultsHandler;
25  import org.mule.tck.junit4.AbstractMuleTestCase;
26  
27  import java.util.ArrayList;
28  import java.util.Collections;
29  import java.util.List;
30  
31  import org.junit.Test;
32  import org.mockito.Mockito;
33  
34  public class DefaultRouterResultsHandlerTestCase extends AbstractMuleTestCase
35  {
36  
37      protected RouterResultsHandler resultsHandler = new DefaultRouterResultsHandler();
38      protected MuleContext muleContext = Mockito.mock(MuleContext.class);
39      protected MuleSession session = Mockito.mock(MuleSession.class);
40      protected InboundEndpoint endpoint = Mockito.mock(InboundEndpoint.class);
41  
42      @Test
43      public void aggregateNoEvent()
44      {
45          MuleEvent result = resultsHandler.aggregateResults(Collections.<MuleEvent> singletonList(null),
46              Mockito.mock(MuleEvent.class), Mockito.mock(MuleContext.class));
47          assertNull(result);
48      }
49  
50      @Test
51      public void aggregateSingleEvent()
52      {
53          MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
54          message1.setInvocationProperty("key1", "value1");
55          MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
56  
57          MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
58          message2.setInvocationProperty("key2", "value2");
59          MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
60  
61          MuleEvent result = resultsHandler.aggregateResults(Collections.<MuleEvent> singletonList(event2),
62              event1, Mockito.mock(MuleContext.class));
63          assertSame(event2, result);
64  
65          // Because same event instance is returned rather than MessageCollection
66          // don't copy invocation properties
67          assertNull(result.getMessage().getInvocationProperty("key1"));
68          assertEquals("value2", result.getMessage().getInvocationProperty("key2"));
69      }
70  
71      @Test
72      public void aggregateMultipleEvents() throws Exception
73      {
74          MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
75          message1.setInvocationProperty("key1", "value1");
76          MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
77          message2.setInvocationProperty("key2", "value2");
78          MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
79          message3.setInvocationProperty("key3", "value3");
80          MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
81          MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
82          MuleEvent event3 = new DefaultMuleEvent(message3, endpoint, session);
83          List<MuleEvent> events = new ArrayList<MuleEvent>();
84          events.add(event2);
85          events.add(event3);
86  
87          MuleEvent result = resultsHandler.aggregateResults(events, event1, Mockito.mock(MuleContext.class));
88          assertNotNull(result);
89          assertEquals(DefaultMessageCollection.class, result.getMessage().getClass());
90          assertEquals(2, ((MuleMessageCollection) result.getMessage()).size());
91          assertTrue(result.getMessage().getPayload() instanceof List<?>);
92          assertEquals(message2, ((MuleMessageCollection) result.getMessage()).getMessage(0));
93          assertEquals(message3, ((MuleMessageCollection) result.getMessage()).getMessage(1));
94  
95          // Because a new MuleMessageCollection is created, propagate properties from
96          // original event
97          assertEquals("value1", result.getMessage().getInvocationProperty("key1"));
98          assertNull(result.getMessage().getInvocationProperty("key2"));
99          assertNull(result.getMessage().getInvocationProperty("key3"));
100     }
101 
102     @Test
103     public void aggregateMultipleEventsAllButOneNull()
104     {
105         MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
106         message1.setInvocationProperty("key", "value");
107         MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
108         message2.setInvocationProperty("key2", "value2");
109         MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
110         MuleEvent event2 = new DefaultMuleEvent(message2, endpoint, session);
111         List<MuleEvent> events = new ArrayList<MuleEvent>();
112         events.add(null);
113         events.add(event2);
114 
115         MuleEvent result = resultsHandler.aggregateResults(events, event1, Mockito.mock(MuleContext.class));
116         assertSame(event2, result);
117 
118         // Because same event instance is returned rather than MessageCollection
119         // don't copy invocation properties
120         assertNull(result.getMessage().getInvocationProperty("key1"));
121         assertEquals("value2", result.getMessage().getInvocationProperty("key2"));
122     }
123 
124     @Test
125     public void aggregateSingleMuleMessageCollection()
126     {
127         MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
128         message1.setInvocationProperty("key1", "value1");
129         MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
130 
131         MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
132         MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
133 
134         MuleMessageCollection messageCollection = new DefaultMessageCollection(
135             Mockito.mock(MuleContext.class));
136         messageCollection.setInvocationProperty("key2", "value2");
137         messageCollection.addMessage(message2);
138         messageCollection.addMessage(message3);
139         MuleEvent event2 = new DefaultMuleEvent(messageCollection, endpoint, session);
140 
141         MuleEvent result = resultsHandler.aggregateResults(Collections.<MuleEvent> singletonList(event2),
142             event1, Mockito.mock(MuleContext.class));
143         assertSame(event2, result);
144 
145         // Because same event instance is returned rather than MessageCollection
146         // don't copy invocation properties
147         assertNull(result.getMessage().getInvocationProperty("key1"));
148         assertEquals("value2", result.getMessage().getInvocationProperty("key2"));
149     }
150 
151     @Test
152     public void aggregateMultipleMuleMessageCollections()
153     {
154         MuleMessage message1 = new DefaultMuleMessage("test event A", muleContext);
155         message1.setInvocationProperty("key1", "value1");
156         MuleEvent event1 = new DefaultMuleEvent(message1, endpoint, session);
157 
158         MuleMessage message2 = new DefaultMuleMessage("test event B", muleContext);
159         MuleMessage message3 = new DefaultMuleMessage("test event C", muleContext);
160         MuleMessage message4 = new DefaultMuleMessage("test event D", muleContext);
161         MuleMessage message5 = new DefaultMuleMessage("test event E", muleContext);
162 
163         MuleMessageCollection messageCollection = new DefaultMessageCollection(
164             Mockito.mock(MuleContext.class));
165         messageCollection.setInvocationProperty("key2", "value2");
166         messageCollection.addMessage(message2);
167         messageCollection.addMessage(message3);
168         MuleEvent event2 = new DefaultMuleEvent(messageCollection, endpoint, session);
169 
170         MuleMessageCollection messageCollection2 = new DefaultMessageCollection(
171             Mockito.mock(MuleContext.class));
172         messageCollection.setInvocationProperty("key3", "value3");
173         messageCollection.addMessage(message4);
174         messageCollection.addMessage(message5);
175         MuleEvent event3 = new DefaultMuleEvent(messageCollection2, endpoint, session);
176 
177         List<MuleEvent> events = new ArrayList<MuleEvent>();
178         events.add(event2);
179         events.add(event3);
180 
181         MuleEvent result = resultsHandler.aggregateResults(events, event1, Mockito.mock(MuleContext.class));
182         assertNotNull(result);
183         assertEquals(DefaultMessageCollection.class, result.getMessage().getClass());
184         assertEquals(2, ((MuleMessageCollection) result.getMessage()).size());
185         assertTrue(result.getMessage().getPayload() instanceof List<?>);
186         assertEquals(messageCollection, ((MuleMessageCollection) result.getMessage()).getMessage(0));
187         assertEquals(messageCollection2, ((MuleMessageCollection) result.getMessage()).getMessage(1));
188 
189         // Because a new MuleMessageCollection is created, propagate properties from
190         // original event
191         assertEquals("value1", result.getMessage().getInvocationProperty("key1"));
192         assertNull(result.getMessage().getInvocationProperty("key2"));
193         assertNull(result.getMessage().getInvocationProperty("key3"));
194     }
195 
196 }