View Javadoc

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