View Javadoc

1   /*
2    * $Id: EndpointSelectorTestCase.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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.DefaultMuleMessage;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.MuleSession;
16  import org.mule.api.endpoint.OutboundEndpoint;
17  import org.mule.api.processor.MessageProcessor;
18  import org.mule.api.routing.RoutingException;
19  import org.mule.tck.AbstractMuleTestCase;
20  import org.mule.tck.MuleTestUtils;
21  
22  import com.mockobjects.dynamic.Mock;
23  
24  import java.util.ArrayList;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  public class EndpointSelectorTestCase extends AbstractMuleTestCase
30  {
31      public EndpointSelectorTestCase()
32      {
33          setStartContext(true);
34      }
35  
36      Mock session;
37      OutboundEndpoint dest1;
38      OutboundEndpoint dest2;
39      OutboundEndpoint dest3;
40      EndpointSelector router;
41      Mock mockendpoint1;
42      Mock mockendpoint2;
43      Mock mockendpoint3;
44  
45  
46      @Override
47      protected void doSetUp() throws Exception
48      {
49          super.doSetUp();
50          session = MuleTestUtils.getMockSession();
51          session.matchAndReturn("getFlowConstruct", getTestService());
52          dest1 = getTestOutboundEndpoint("dest1");
53          dest2 = getTestOutboundEndpoint("dest2");
54          dest3 = getTestOutboundEndpoint("dest3");
55  
56          mockendpoint1 = RouterTestUtils.getMockEndpoint(dest1);
57          mockendpoint2 = RouterTestUtils.getMockEndpoint(dest2);
58          mockendpoint3 = RouterTestUtils.getMockEndpoint(dest3);
59  
60          List<MessageProcessor> endpoints = new ArrayList<MessageProcessor>();
61          endpoints.add((OutboundEndpoint) mockendpoint1.proxy());
62          endpoints.add((OutboundEndpoint) mockendpoint2.proxy());
63          endpoints.add((OutboundEndpoint) mockendpoint3.proxy());
64  
65          router = new EndpointSelector();
66          router.setRoutes(endpoints);
67          router.setMuleContext(muleContext);
68          router.initialise();
69      }
70  
71      public void testSelectEndpointDefaultProperty() throws Exception
72      {
73          Map<String, Object> props = new HashMap<String, Object>();
74          props.put("apple", "red");
75          props.put(EndpointSelector.DEFAULT_SELECTOR_EXPRESSION, "dest3");
76          props.put("banana", "yellow");
77          MuleMessage message = new DefaultMuleMessage("test event", props, muleContext);
78  
79          assertTrue(router.isMatch(message));
80          mockendpoint3.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
81          router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
82          mockendpoint3.verify();
83      }
84  
85      public void testSelectEndpointCustomProperty() throws Exception
86      {
87          // The "wayOut" property will determine which endpoint the message gets sent to.
88          router.setExpression("wayOut");
89          router.setEvaluator("header");
90  
91          Map<String, Object> props = new HashMap<String, Object>();
92          props.put("apple", "red");
93          props.put("wayOut", "dest2");
94          props.put("banana", "yellow");
95          MuleMessage message = new DefaultMuleMessage("test event", props, muleContext);
96  
97          assertTrue(router.isMatch(message));
98          mockendpoint2.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
99          router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
100         mockendpoint2.verify();
101     }
102 
103     public void testSelectEndpointNoMatch() throws Exception
104     {
105         Map<String, Object> props = new HashMap<String, Object>();
106         props.put(EndpointSelector.DEFAULT_SELECTOR_EXPRESSION, "dest5");
107 
108         try
109         {
110             // this test used to fail at the router; it now fails earlier when the message is
111             // constructed.  i don't think this is a problem.
112             MuleMessage message = new DefaultMuleMessage("test event", props, muleContext);
113             router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
114             fail("Router should have thrown an exception if endpoint was not found.");
115         }
116         catch (Exception e)
117         {
118             // expected
119         }
120     }
121 
122     public void testSelectEndpointNoMatchUseDefault() throws Exception
123     {
124         MuleMessage message = new DefaultMuleMessage("test event", muleContext);
125         router.setDefaultEndpointName("dest3");
126 
127         assertTrue(router.isMatch(message));
128         mockendpoint3.expect("process", RouterTestUtils.getArgListCheckerMuleEvent());
129         router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
130         mockendpoint3.verify();
131     }
132 
133     public void testSelectEndpointNoPropertySet() throws Exception
134     {
135         MuleMessage message = new DefaultMuleMessage("test event", muleContext);
136 
137         try
138         {
139             router.route(new OutboundRoutingTestEvent(message, (MuleSession) session.proxy()));
140             fail("Router should have thrown an exception if no selector property was set on the message.");
141         }
142         catch (RoutingException e)
143         {
144             // expected
145         }
146     }
147 }