1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.MuleSession;
16 import org.mule.api.endpoint.ImmutableEndpoint;
17 import org.mule.api.endpoint.OutboundEndpoint;
18 import org.mule.endpoint.DynamicURIOutboundEndpoint;
19 import org.mule.endpoint.MuleEndpointURI;
20 import org.mule.routing.LoggingCatchAllStrategy;
21 import org.mule.routing.filters.PayloadTypeFilter;
22 import org.mule.tck.AbstractMuleTestCase;
23 import org.mule.tck.MuleTestUtils;
24
25 import com.mockobjects.dynamic.C;
26 import com.mockobjects.dynamic.Mock;
27
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32
33 public class ChainingRouterTestCase extends AbstractMuleTestCase
34 {
35 private Mock session;
36 private ChainingRouter router;
37 private List endpoints;
38
39 protected void doSetUp() throws Exception
40 {
41 super.doSetUp();
42 session = MuleTestUtils.getMockSession();
43 router = new ChainingRouter();
44
45 DefaultOutboundRouterCollection messageRouter = new DefaultOutboundRouterCollection();
46 messageRouter.setCatchAllStrategy(new LoggingCatchAllStrategy());
47
48 ImmutableEndpoint endpoint1 = getTestOutboundEndpoint("Test1Provider");
49 assertNotNull(endpoint1);
50
51 ImmutableEndpoint endpoint2 = getTestOutboundEndpoint("Test2Provider");
52 assertNotNull(endpoint2);
53
54 PayloadTypeFilter filter = new PayloadTypeFilter(String.class);
55 router.setFilter(filter);
56 endpoints = new ArrayList();
57 endpoints.add(endpoint1);
58 endpoints.add(endpoint2);
59 router.setEndpoints(endpoints);
60
61 assertEquals(filter, router.getFilter());
62 session.matchAndReturn("getService", getTestService("TEST", Object.class));
63 }
64
65 public void testChainingOutboundRouterSynchronous() throws Exception
66 {
67 MuleMessage message = new DefaultMuleMessage("test event");
68 assertTrue(router.isMatch(message));
69
70 message = new DefaultMuleMessage("test event");
71
72 session.expectAndReturn("sendEvent", C.eq(message, endpoints.get(0)), message);
73 session.expectAndReturn("sendEvent", C.eq(message, endpoints.get(1)), message);
74 final MuleMessage result = router.route(message, (MuleSession)session.proxy(), true);
75 assertNotNull("This is a sync call, we need a result returned.", result);
76 assertEquals(message, result);
77 session.verify();
78 }
79
80 public void testChainingOutboundRouterSynchronousWithTemplate() throws Exception
81 {
82 OutboundEndpoint endpoint3 = getTestOutboundEndpoint("Test3Provider", "test://foo?[barValue]");
83 assertNotNull(endpoint3);
84 router.addEndpoint(endpoint3);
85
86 Map m = new HashMap();
87 m.put("barValue", "bar");
88 MuleMessage message = new DefaultMuleMessage("test event", m);
89 assertTrue(router.isMatch(message));
90
91 ImmutableEndpoint ep = router.getEndpoint(2, message);
92 assertEquals("test://foo?bar", ep.getEndpointURI().toString());
93
94 session.expectAndReturn("sendEvent", C.eq(message, new DynamicURIOutboundEndpoint(
95 (OutboundEndpoint) router.getEndpoints().get(0), new MuleEndpointURI("test://test"))), message);
96 session.expectAndReturn("sendEvent", C.eq(message, new DynamicURIOutboundEndpoint(
97 (OutboundEndpoint) router.getEndpoints().get(1), new MuleEndpointURI("test://test"))), message);
98 session.expectAndReturn("sendEvent", C.eq(message, new DynamicURIOutboundEndpoint(
99 (OutboundEndpoint) router.getEndpoints().get(2), new MuleEndpointURI("test://foo?bar"))), message);
100 final MuleMessage result = router.route(message, (MuleSession)session.proxy(), true);
101 assertNotNull("This is a sync call, we need a result returned.", result);
102 assertEquals(message, result);
103 session.verify();
104 }
105
106 public void testChainingOutboundRouterAsynchronous() throws Exception
107 {
108 MuleMessage message = new DefaultMuleMessage("test event");
109 assertTrue(router.isMatch(message));
110
111 message = new DefaultMuleMessage("test event");
112
113 session.expectAndReturn("sendEvent", C.eq(message, endpoints.get(0)), message);
114 session.expectAndReturn("dispatchEvent", C.eq(message, endpoints.get(1)), message);
115 final MuleMessage result = router.route(message, (MuleSession)session.proxy(), false);
116 assertNull("Async call shouldn't return any result.", result);
117 session.verify();
118 }
119
120
121
122
123 public void testBrokenChain() throws Exception
124 {
125 final MuleMessage message = new DefaultMuleMessage("test event");
126 final ImmutableEndpoint endpoint1 = (ImmutableEndpoint)endpoints.get(0);
127 session.expect("sendEvent", C.eq(message, endpoint1));
128 MuleMessage result = router.route(message, (MuleSession)session.proxy(), false);
129 session.verify();
130 assertNull(result);
131 }
132
133 }