1
2
3
4
5
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
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 }