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.outbound;
8   
9   import org.mule.DefaultMuleMessage;
10  import org.mule.api.MuleEvent;
11  import org.mule.api.MuleMessage;
12  import org.mule.api.MuleSession;
13  import org.mule.api.endpoint.OutboundEndpoint;
14  import org.mule.api.processor.MessageProcessor;
15  import org.mule.api.routing.MatchableMessageProcessor;
16  import org.mule.api.routing.RoutingException;
17  import org.mule.routing.AbstractCatchAllStrategy;
18  import org.mule.routing.LoggingCatchAllStrategy;
19  import org.mule.routing.filters.PayloadTypeFilter;
20  import org.mule.tck.MuleTestUtils;
21  import org.mule.tck.junit4.AbstractMuleContextTestCase;
22  
23  import com.mockobjects.dynamic.Mock;
24  
25  import java.util.ArrayList;
26  import java.util.List;
27  
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertNotNull;
32  
33  public class OutboundMessageRouterTestCase extends AbstractMuleContextTestCase
34  {
35      public OutboundMessageRouterTestCase()
36      {
37          setStartContext(true);        
38      }
39  
40      @Test
41      public void testOutboundMessageRouter() throws Exception
42      {
43          Mock session = MuleTestUtils.getMockSession();
44          session.matchAndReturn("getFlowConstruct", getTestService());
45          
46          DefaultOutboundRouterCollection messageRouter = createObject(DefaultOutboundRouterCollection.class);
47          messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
48          assertNotNull(messageRouter.getCatchAllStrategy());
49  
50          OutboundEndpoint endpoint1 = getTestOutboundEndpoint("Test1Provider", 
51              "test://Test1Provider?exchangePattern=one-way");
52          assertNotNull(endpoint1);
53  
54          OutboundEndpoint endpoint2 = getTestOutboundEndpoint("Test2Provider");
55          assertNotNull(endpoint2);
56  
57          Mock mockendpoint1 = RouterTestUtils.getMockEndpoint(endpoint1);
58          Mock mockendpoint2 = RouterTestUtils.getMockEndpoint(endpoint2);
59  
60          FilteringOutboundRouter router1 = new FilteringOutboundRouter();
61          PayloadTypeFilter filter = new PayloadTypeFilter(String.class);
62          router1.setFilter(filter);
63          List<MessageProcessor> endpoints = new ArrayList<MessageProcessor>();
64          endpoints.add((OutboundEndpoint) mockendpoint1.proxy());
65          router1.setRoutes(endpoints);
66  
67          FilteringOutboundRouter router2 = new FilteringOutboundRouter();
68          PayloadTypeFilter filter2 = new PayloadTypeFilter();
69          filter2.setExpectedType(Exception.class);
70          router2.setFilter(filter2);
71          endpoints = new ArrayList<MessageProcessor>();
72          endpoints.add((OutboundEndpoint) mockendpoint2.proxy());
73          router2.setRoutes(endpoints);
74  
75          messageRouter.addRoute(router1);
76          assertEquals(1, messageRouter.getRoutes().size());
77          messageRouter.removeRoute(router1);
78          assertEquals(0, messageRouter.getRoutes().size());
79          
80          List<MatchableMessageProcessor> list = new ArrayList<MatchableMessageProcessor>();
81          list.add(router1);
82          list.add(router2);
83          messageRouter.setMessageProcessors(list);
84  
85          MuleEvent event = getTestInboundEvent("test event", (MuleSession) session.proxy());
86  
87          mockendpoint1.expect("process",RouterTestUtils.getArgListCheckerMuleEvent());
88          messageRouter.process(event);
89          mockendpoint1.verify();
90  
91          event = getTestInboundEvent(new IllegalArgumentException(), (MuleSession) session.proxy());
92          
93          session.expectAndReturn("getFlowConstruct", getTestService());
94          mockendpoint2.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
95          messageRouter.process(event);
96          mockendpoint2.verify();
97  
98          FilteringOutboundRouter router3 = new FilteringOutboundRouter();
99          router3.setFilter(new PayloadTypeFilter(Object.class));
100         endpoints = new ArrayList<MessageProcessor>();
101         endpoints.add((OutboundEndpoint) mockendpoint2.proxy());
102         router3.setRoutes(endpoints);
103         messageRouter.addRoute(router3);
104 
105         // now the message should be routed twice to different targets
106         event = getTestInboundEvent("testing multiple routing", (MuleSession) session.proxy());
107         session.expectAndReturn("getFlowConstruct", getTestService());
108         session.expectAndReturn("getFlowConstruct", getTestService());
109 
110         mockendpoint1.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
111         mockendpoint2.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
112 
113         messageRouter.setMatchAll(true);
114         messageRouter.process(event);
115         mockendpoint1.verify();
116         mockendpoint2.verify();
117     }
118 
119     @Test
120     public void testRouterWithCatchAll() throws Exception
121     {
122         final int[] count1 = new int[]{0};
123         final int[] count2 = new int[]{0};
124         final int[] catchAllCount = new int[]{0};
125 
126         DefaultOutboundRouterCollection messageRouter = new DefaultOutboundRouterCollection();
127 
128         FilteringOutboundRouter filterRouter1 = new FilteringOutboundRouter()
129         {
130             @Override
131             public MuleEvent route(MuleEvent event)
132                 throws RoutingException
133             {
134                 count1[0]++;
135                 return event;
136             }
137         };
138 
139         FilteringOutboundRouter filterRouter2 = new FilteringOutboundRouter()
140         {
141             @Override
142             public MuleEvent route(MuleEvent event)
143                 throws RoutingException
144             {
145                 count2[0]++;
146                 return event;
147             }
148         };
149 
150         filterRouter1.setFilter(new PayloadTypeFilter(Exception.class));
151         filterRouter2.setFilter(new PayloadTypeFilter(StringBuffer.class));
152         messageRouter.addRoute(filterRouter1);
153         messageRouter.addRoute(filterRouter2);
154 
155         AbstractCatchAllStrategy strategy = new AbstractCatchAllStrategy()
156         {
157             @Override
158             public MuleEvent doCatchMessage(MuleEvent event) throws RoutingException
159             {
160                 catchAllCount[0]++;
161                 return null;
162             }
163         };
164 
165         messageRouter.setCatchAllStrategy(strategy);
166 
167         MuleSession session = getTestSession(getTestService(), muleContext);
168 
169         MuleEvent event = getTestInboundEvent("hello");
170         messageRouter.process(event);
171         assertEquals(1, catchAllCount[0]);
172         assertEquals(0, count1[0]);
173         assertEquals(0, count2[0]);
174 
175         event = getTestInboundEvent(new StringBuffer());
176         messageRouter.process(event);
177         assertEquals(1, catchAllCount[0]);
178         assertEquals(0, count1[0]);
179         assertEquals(1, count2[0]);
180 
181         event = getTestInboundEvent(new Exception());
182         messageRouter.process(event);
183         assertEquals(1, catchAllCount[0]);
184         assertEquals(1, count1[0]);
185         assertEquals(1, count2[0]);
186     }
187 
188     @Test
189     public void testCorrelation() throws Exception
190     {
191         FilteringOutboundRouter filterRouter = new FilteringOutboundRouter();
192         MuleSession session = getTestSession(getTestService(), muleContext);
193         MuleMessage message = new DefaultMuleMessage(new StringBuffer(), muleContext);
194         OutboundEndpoint endpoint = getTestOutboundEndpoint("test");
195         filterRouter.setMessageProperties(session.getFlowConstruct(), message, endpoint);
196         assertNotNull(message.getCorrelationId());
197     }
198 }