1
2
3
4
5
6
7
8
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.expectAndReturn("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
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 }