1   /*
2    * $Id: OutboundMessageRouterTestCase.java 10524 2008-01-24 19:20:11Z akuzmin $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.routing.outbound;
12  
13  import org.mule.impl.MuleMessage;
14  import org.mule.providers.DefaultMessageAdapter;
15  import org.mule.routing.LoggingCatchAllStrategy;
16  import org.mule.routing.filters.PayloadTypeFilter;
17  import org.mule.tck.AbstractMuleTestCase;
18  import org.mule.tck.MuleTestUtils;
19  import org.mule.umo.UMOMessage;
20  import org.mule.umo.UMOSession;
21  import org.mule.umo.endpoint.UMOEndpoint;
22  import org.mule.umo.routing.RoutingException;
23  
24  import com.mockobjects.dynamic.C;
25  import com.mockobjects.dynamic.Mock;
26  
27  import java.util.ArrayList;
28  import java.util.List;
29  
30  public class OutboundMessageRouterTestCase extends AbstractMuleTestCase
31  {
32      public void testOutboundMessageRouter() throws Exception
33      {
34          Mock session = MuleTestUtils.getMockSession();
35          session.matchAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
36          OutboundRouterCollection messageRouter = new OutboundRouterCollection();
37          messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
38          assertNotNull(messageRouter.getCatchAllStrategy());
39  
40          UMOEndpoint endpoint1 = getTestEndpoint("Test1Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
41          assertNotNull(endpoint1);
42  
43          UMOEndpoint endpoint2 = getTestEndpoint("Test2Provider", UMOEndpoint.ENDPOINT_TYPE_SENDER);
44          assertNotNull(endpoint2);
45  
46          FilteringOutboundRouter router1 = new FilteringOutboundRouter();
47          PayloadTypeFilter filter = new PayloadTypeFilter(String.class);
48          router1.setFilter(filter);
49          List endpoints = new ArrayList();
50          endpoints.add(endpoint1);
51          router1.setEndpoints(endpoints);
52  
53          FilteringOutboundRouter router2 = new FilteringOutboundRouter();
54          PayloadTypeFilter filter2 = new PayloadTypeFilter();
55          filter2.setExpectedType(Exception.class);
56          router2.setFilter(filter2);
57          endpoints = new ArrayList();
58          endpoints.add(endpoint2);
59          router2.setEndpoints(endpoints);
60  
61          messageRouter.addRouter(router1);
62          assertEquals(1, messageRouter.getRouters().size());
63          assertNotNull(messageRouter.removeRouter(router1));
64          assertEquals(0, messageRouter.getRouters().size());
65          List list = new ArrayList();
66          list.add(router1);
67          list.add(router2);
68          messageRouter.setRouters(list);
69  
70          UMOMessage message = new MuleMessage("test event");
71  
72          session.expect("dispatchEvent", C.eq(message, endpoint1));
73          messageRouter.route(message, (UMOSession)session.proxy(), false);
74          session.verify();
75  
76          message = new MuleMessage(new IllegalArgumentException());
77  
78          session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
79          session.expect("dispatchEvent", C.eq(message, endpoint2));
80          messageRouter.route(message, (UMOSession)session.proxy(), false);
81          session.verify();
82  
83          FilteringOutboundRouter router3 = new FilteringOutboundRouter();
84          router3.setFilter(new PayloadTypeFilter(Object.class));
85          endpoints = new ArrayList();
86          endpoints.add(endpoint2);
87          router3.setEndpoints(endpoints);
88          messageRouter.addRouter(router3);
89  
90          // now the message should be routed twice to different endpoints
91          message = new MuleMessage("testing multiple routing");
92          session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
93          session.expectAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
94  
95          session.expect("dispatchEvent", C.eq(message, endpoint1));
96          session.expect("dispatchEvent", C.eq(message, endpoint2));
97          messageRouter.setMatchAll(true);
98          messageRouter.route(message, (UMOSession)session.proxy(), false);
99          session.verify();
100     }
101 
102     public void testRouterWithCatchAll() throws Exception
103     {
104         final int[] count1 = new int[]{0};
105         final int[] count2 = new int[]{0};
106         final int[] catchAllCount = new int[]{0};
107 
108         OutboundRouterCollection messageRouter = new OutboundRouterCollection();
109 
110         FilteringOutboundRouter filterRouter1 = new FilteringOutboundRouter()
111         {
112             public UMOMessage route(UMOMessage message, UMOSession session, boolean synchronous)
113                 throws RoutingException
114             {
115                 count1[0]++;
116                 return message;
117             }
118         };
119 
120         FilteringOutboundRouter filterRouter2 = new FilteringOutboundRouter()
121         {
122             public UMOMessage route(UMOMessage message, UMOSession session, boolean synchronous)
123                 throws RoutingException
124             {
125                 count2[0]++;
126                 return message;
127             }
128         };
129 
130         filterRouter1.setFilter(new PayloadTypeFilter(Exception.class));
131         filterRouter2.setFilter(new PayloadTypeFilter(StringBuffer.class));
132         messageRouter.addRouter(filterRouter1);
133         messageRouter.addRouter(filterRouter2);
134 
135         LoggingCatchAllStrategy strategy = new LoggingCatchAllStrategy()
136         {
137             public UMOMessage catchMessage(UMOMessage message, UMOSession session, boolean synchronous)
138                 throws RoutingException
139             {
140                 catchAllCount[0]++;
141                 return null;
142             }
143         };
144 
145         messageRouter.setCatchAllStrategy(strategy);
146 
147         UMOSession session = getTestSession(getTestComponent(getTestDescriptor("test", "test")));
148 
149         messageRouter.route(new MuleMessage("hello"), session, true);
150         assertEquals(1, catchAllCount[0]);
151         assertEquals(0, count1[0]);
152         assertEquals(0, count2[0]);
153 
154         messageRouter.route(new MuleMessage(new StringBuffer()), session, true);
155         assertEquals(1, catchAllCount[0]);
156         assertEquals(0, count1[0]);
157         assertEquals(1, count2[0]);
158 
159         messageRouter.route(new MuleMessage(new Exception()), session, true);
160         assertEquals(1, catchAllCount[0]);
161         assertEquals(1, count1[0]);
162         assertEquals(1, count2[0]);
163     }
164 
165     public void testCorrelation() throws Exception
166     {
167         FilteringOutboundRouter filterRouter = new FilteringOutboundRouter();
168         UMOSession session = getTestSession(getTestComponent(getTestDescriptor("test", "test")));
169         UMOMessage message = new MuleMessage(new DefaultMessageAdapter(new StringBuffer()));
170         UMOEndpoint endpoint = getTestEndpoint("test", "sender");
171         filterRouter.setMessageProperties(session, message, endpoint);
172         assertNotNull(message.getCorrelationId());
173     }
174 }