1   /*
2    * $Id: EndpointSelectorTestCase.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.tck.AbstractMuleTestCase;
15  import org.mule.tck.MuleTestUtils;
16  import org.mule.umo.UMOMessage;
17  import org.mule.umo.UMOSession;
18  import org.mule.umo.endpoint.UMOEndpoint;
19  import org.mule.umo.routing.CouldNotRouteOutboundMessageException;
20  
21  import com.mockobjects.dynamic.C;
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  /**
30   * Sample config:
31   * 
32   * <pre>
33   * &lt;outbound-router&gt;
34   *      &lt;router className=&quot;org.mule.routing.outbound.EndpointSelector&quot;&gt;
35   *          &lt;endpoint name=&quot;dest1&quot; address=&quot;jms://queue1&quot; /&gt;
36   *          &lt;endpoint name=&quot;dest2&quot; address=&quot;jms://queue2&quot; /&gt;
37   *          &lt;endpoint name=&quot;dest3&quot; address=&quot;jms://queue3&quot; /&gt;
38   *          &lt;properties&gt;
39   *              &lt;property name=&quot;selector&quot; value=&quot;endpoint&quot; /&gt;
40   *          &lt;/properties&gt;
41   *      &lt;/router&gt;
42   * &lt;/outbound-router&gt;
43   * </pre>
44   * 
45   * </pre>
46   */
47  public class EndpointSelectorTestCase extends AbstractMuleTestCase
48  {
49      Mock session;
50      UMOEndpoint dest1;
51      UMOEndpoint dest2;
52      UMOEndpoint dest3;
53      EndpointSelector router;
54  
55      protected void doSetUp() throws Exception
56      {
57          super.doSetUp();
58          session = MuleTestUtils.getMockSession();
59          session.matchAndReturn("getComponent", getTestComponent(getTestDescriptor("test", "blah")));
60          dest1 = getTestEndpoint("dest1", UMOEndpoint.ENDPOINT_TYPE_SENDER);
61          dest2 = getTestEndpoint("dest2", UMOEndpoint.ENDPOINT_TYPE_SENDER);
62          dest3 = getTestEndpoint("dest3", UMOEndpoint.ENDPOINT_TYPE_SENDER);
63  
64          List endpoints = new ArrayList();
65          endpoints.add(dest1);
66          endpoints.add(dest2);
67          endpoints.add(dest3);
68  
69          router = new EndpointSelector();
70          router.setEndpoints(endpoints);
71      }
72  
73      public void testSelectEndpointDefaultProperty() throws Exception
74      {
75          Map props = new HashMap();
76          props.put("apple", "red");
77          props.put(router.getSelectorProperty(), "dest3");
78          props.put("banana", "yellow");
79          UMOMessage message = new MuleMessage("test event", props);
80  
81          assertTrue(router.isMatch(message));
82          session.expect("dispatchEvent", C.eq(message, dest3));
83          router.route(message, (UMOSession) session.proxy(), false);
84          session.verify();
85      }
86  
87      public void testSelectEndpointCustomProperty() throws Exception
88      {
89          // The "wayOut" property will determine which endpoint the message gets sent
90          // to.
91          router.setSelectorProperty("wayOut");
92  
93          Map props = new HashMap();
94          props.put("apple", "red");
95          props.put("wayOut", "dest2");
96          props.put("banana", "yellow");
97          UMOMessage message = new MuleMessage("test event", props);
98  
99          assertTrue(router.isMatch(message));
100         session.expect("dispatchEvent", C.eq(message, dest2));
101         router.route(message, (UMOSession) session.proxy(), false);
102         session.verify();
103     }
104 
105     public void testSelectEndpointNoMatch() throws Exception
106     {
107         Map props = new HashMap();
108         props.put(router.getSelectorProperty(), "dest5");
109         UMOMessage message = new MuleMessage("test event", props);
110 
111         try
112         {
113             router.route(message, (UMOSession) session.proxy(), false);
114             fail("Router should have thrown an exception if endpoint was not found.");
115         }
116         catch (CouldNotRouteOutboundMessageException e)
117         {
118             // expected
119         }
120     }
121 
122     public void testSelectEndpointNoPropertySet() throws Exception
123     {
124         UMOMessage message = new MuleMessage("test event");
125 
126         try
127         {
128             router.route(message, (UMOSession) session.proxy(), false);
129             fail("Router should have thrown an exception if no selector property was set on the message.");
130         }
131         catch (IllegalArgumentException e)
132         {
133             // expected
134         }
135     }
136 }