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