1   /*
2    * $Id: FilterListMessageSplitterRouterTestCase.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.endpoint.MuleEndpointURI;
15  import org.mule.routing.filters.PayloadTypeFilter;
16  import org.mule.tck.AbstractMuleTestCase;
17  import org.mule.tck.MuleTestUtils;
18  import org.mule.tck.testmodels.fruit.Apple;
19  import org.mule.tck.testmodels.fruit.Orange;
20  import org.mule.umo.UMOMessage;
21  import org.mule.umo.UMOSession;
22  import org.mule.umo.endpoint.UMOEndpoint;
23  
24  import com.mockobjects.constraint.Constraint;
25  import com.mockobjects.dynamic.C;
26  import com.mockobjects.dynamic.Mock;
27  
28  import java.util.ArrayList;
29  import java.util.List;
30  
31  public class FilterListMessageSplitterRouterTestCase extends AbstractMuleTestCase
32  {
33  
34      public void testMessageSplitterRouter() throws Exception
35      {
36          Mock session = MuleTestUtils.getMockSession();
37          session.matchAndReturn("getComponent", getTestComponent(getTestDescriptor("TEST", "java.lang.Object")));
38          UMOEndpoint endpoint1 = getTestEndpoint("Test1endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
39          endpoint1.setEndpointURI(new MuleEndpointURI("test://endpointUri.1"));
40          endpoint1.setFilter(new PayloadTypeFilter(Apple.class));
41          UMOEndpoint endpoint2 = getTestEndpoint("Test2Endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
42          endpoint2.setEndpointURI(new MuleEndpointURI("test://endpointUri.2"));
43          endpoint2.setFilter(new PayloadTypeFilter(Orange.class));
44          UMOEndpoint endpoint3 = getTestEndpoint("Test3Endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
45          endpoint3.setEndpointURI(new MuleEndpointURI("test://endpointUri.3"));
46  
47          FilteringListMessageSplitter router = new FilteringListMessageSplitter();
48          router.setFilter(new PayloadTypeFilter(List.class));
49          router.addEndpoint(endpoint1);
50          router.addEndpoint(endpoint2);
51          router.addEndpoint(endpoint3);
52  
53          List payload = new ArrayList();
54          payload.add(new Apple());
55          payload.add(new Apple());
56          payload.add(new Orange());
57          payload.add(new String());
58          UMOMessage message = new MuleMessage(payload);
59  
60          assertTrue(router.isMatch(message));
61          session.expect("dispatchEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)));
62          session.expect("dispatchEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)));
63          session.expect("dispatchEvent", C.args(new PayloadConstraint(Orange.class), C.eq(endpoint2)));
64          session.expect("dispatchEvent", C.args(new PayloadConstraint(String.class), C.eq(endpoint3)));
65          router.route(message, (UMOSession) session.proxy(), false);
66          session.verify();
67  
68          message = new MuleMessage(payload);
69  
70          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)),
71              message);
72          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)),
73              message);
74          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Orange.class), C.eq(endpoint2)),
75              message);
76          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(String.class), C.eq(endpoint3)),
77              message);
78          UMOMessage result = router.route(message, (UMOSession) session.proxy(), true);
79          assertNotNull(result);
80          assertEquals(message, result);
81          session.verify();
82      }
83  
84      private class PayloadConstraint implements Constraint
85      {
86          private Class type;
87  
88          public PayloadConstraint(Class type)
89          {
90              this.type = type;
91          }
92  
93          public boolean eval(Object o)
94          {
95              return ((UMOMessage) o).getPayload().getClass().equals(type);
96          }
97      }
98  
99  }