View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
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.MuleMessageCollection;
13  import org.mule.api.MuleSession;
14  import org.mule.api.endpoint.OutboundEndpoint;
15  import org.mule.api.processor.MessageProcessor;
16  import org.mule.tck.MuleTestUtils;
17  import org.mule.tck.junit4.AbstractMuleContextTestCase;
18  
19  import com.mockobjects.dynamic.Mock;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  import java.util.StringTokenizer;
24  
25  import org.junit.Test;
26  
27  import static org.junit.Assert.assertEquals;
28  import static org.junit.Assert.assertNotNull;
29  import static org.junit.Assert.assertTrue;
30  
31  public class MessageSplitterRouterTestCase extends AbstractMuleContextTestCase
32  {
33      public MessageSplitterRouterTestCase()
34      {
35          setStartContext(true);
36      }
37  
38      @Test
39      public void testMessageSplitterRouter() throws Exception
40      {
41          Mock session = MuleTestUtils.getMockSession();
42          session.matchAndReturn("getFlowConstruct", getTestService());
43          session.matchAndReturn("setFlowConstruct", RouterTestUtils.getArgListCheckerFlowConstruct(), null);
44  
45          //Async targets
46          OutboundEndpoint endpoint1 = getTestOutboundEndpoint("Test1Endpoint", "test://endpointUri.1");
47          OutboundEndpoint endpoint2 = getTestOutboundEndpoint("Test2Endpoint", "test://endpointUri.2");
48          OutboundEndpoint endpoint3 = getTestOutboundEndpoint("Test3Endpoint", "test://endpointUri.3");
49          Mock mockendpoint1 = RouterTestUtils.getMockEndpoint(endpoint1);
50          Mock mockendpoint2 = RouterTestUtils.getMockEndpoint(endpoint2);
51          Mock mockendpoint3 = RouterTestUtils.getMockEndpoint(endpoint3);
52  
53          //Sync targets  org.python.core.__builtin__
54          OutboundEndpoint endpoint4 = getTestOutboundEndpoint("Test4Endpoint", 
55              "test://endpointUri.4?exchangePattern=request-response");
56          OutboundEndpoint endpoint5 = getTestOutboundEndpoint("Test5Endpoint", 
57              "test://endpointUri.5?exchangePattern=request-response");
58          OutboundEndpoint endpoint6 = getTestOutboundEndpoint("Test6Endpoint", 
59              "test://endpointUri.6?exchangePattern=request-response");
60          Mock mockendpoint4 = RouterTestUtils.getMockEndpoint(endpoint4);
61          Mock mockendpoint5 = RouterTestUtils.getMockEndpoint(endpoint5);
62          Mock mockendpoint6 = RouterTestUtils.getMockEndpoint(endpoint6);
63  
64  
65          // Dummy message splitter
66          AbstractMessageSplitter router = new AbstractMessageSplitter()
67          {
68              @Override
69              protected SplitMessage getMessageParts(MuleMessage message, List<MessageProcessor> endpoints)
70              {
71                  int i = 0;
72                  SplitMessage splitMessage = new SplitMessage();
73                  for (StringTokenizer tokenizer = new StringTokenizer(message.getPayload().toString(), ","); tokenizer.hasMoreTokens(); i++)
74                  {
75                      String s = tokenizer.nextToken();
76                      splitMessage.addPart(s, (OutboundEndpoint) endpoints.get(i));
77                  }
78                  return splitMessage;
79              }
80          };
81  
82          router.setMuleContext(muleContext);
83  
84          List<MessageProcessor> endpoints = new ArrayList<MessageProcessor>();
85          endpoints.add((OutboundEndpoint) mockendpoint1.proxy());
86          endpoints.add((OutboundEndpoint) mockendpoint2.proxy());
87          endpoints.add((OutboundEndpoint) mockendpoint3.proxy());
88          router.setRoutes(endpoints);
89  
90          MuleMessage message = new DefaultMuleMessage("test,mule,message", muleContext);
91  
92          assertTrue(router.isMatch(message));
93          mockendpoint1.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
94          mockendpoint2.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
95          mockendpoint3.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
96          router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
97          mockendpoint1.verify();
98          mockendpoint2.verify();
99          mockendpoint3.verify();
100 
101         endpoints = new ArrayList<MessageProcessor>();
102         endpoints.add((OutboundEndpoint) mockendpoint4.proxy());
103         endpoints.add((OutboundEndpoint) mockendpoint5.proxy());
104         endpoints.add((OutboundEndpoint) mockendpoint6.proxy());
105         router.getRoutes().clear();
106         router.setRoutes(endpoints);
107 
108         message = new DefaultMuleMessage("test,mule,message", muleContext);
109         MuleEvent event = new OutboundRoutingTestEvent(message, null);
110 
111         mockendpoint4.expectAndReturn("process", RouterTestUtils.getArgListCheckerMuleEvent(), event);
112         mockendpoint5.expectAndReturn("process", RouterTestUtils.getArgListCheckerMuleEvent(), event);
113         mockendpoint6.expectAndReturn("process", RouterTestUtils.getArgListCheckerMuleEvent(), event);
114         MuleEvent result = router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
115         assertNotNull(result);
116         MuleMessage resultMessage = result.getMessage();
117         assertNotNull(resultMessage);
118         assertTrue(resultMessage instanceof MuleMessageCollection);
119         assertEquals(3, ((MuleMessageCollection) resultMessage).size());
120         mockendpoint4.verify();
121         mockendpoint5.verify();
122         mockendpoint6.verify();
123     }
124 }