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