1   /*
2    * $Id: FilterListMessageSplitterRouterTestCase.java 7976 2007-08-21 14:26:13Z 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.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      public void testMessageSpltterRouter() throws Exception
34      {
35          Mock session = MuleTestUtils.getMockSession();
36  
37          UMOEndpoint endpoint1 = getTestEndpoint("Test1endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
38          endpoint1.setEndpointURI(new MuleEndpointURI("test://endpointUri.1"));
39          endpoint1.setFilter(new PayloadTypeFilter(Apple.class));
40          UMOEndpoint endpoint2 = getTestEndpoint("Test2Endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
41          endpoint2.setEndpointURI(new MuleEndpointURI("test://endpointUri.2"));
42          endpoint2.setFilter(new PayloadTypeFilter(Orange.class));
43          UMOEndpoint endpoint3 = getTestEndpoint("Test3Endpoint", UMOEndpoint.ENDPOINT_TYPE_SENDER);
44          endpoint3.setEndpointURI(new MuleEndpointURI("test://endpointUri.3"));
45  
46          FilteringListMessageSplitter router = new FilteringListMessageSplitter();
47          router.setFilter(new PayloadTypeFilter(List.class));
48          router.addEndpoint(endpoint1);
49          router.addEndpoint(endpoint2);
50          router.addEndpoint(endpoint3);
51  
52          List payload = new ArrayList();
53          payload.add(new Apple());
54          payload.add(new Apple());
55          payload.add(new Orange());
56          payload.add(new String());
57          UMOMessage message = new MuleMessage(payload);
58  
59          assertTrue(router.isMatch(message));
60          session.expect("dispatchEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)));
61          session.expect("dispatchEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)));
62          session.expect("dispatchEvent", C.args(new PayloadConstraint(Orange.class), C.eq(endpoint2)));
63          session.expect("dispatchEvent", C.args(new PayloadConstraint(String.class), C.eq(endpoint3)));
64          router.route(message, (UMOSession)session.proxy(), false);
65          session.verify();
66  
67          message = new MuleMessage(payload);
68  
69          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)),
70              message);
71          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Apple.class), C.eq(endpoint1)),
72              message);
73          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(Orange.class), C.eq(endpoint2)),
74              message);
75          session.expectAndReturn("sendEvent", C.args(new PayloadConstraint(String.class), C.eq(endpoint3)),
76              message);
77          UMOMessage result = router.route(message, (UMOSession)session.proxy(), true);
78          assertNotNull(result);
79          assertEquals(message, result);
80          session.verify();
81      }
82  
83      private class PayloadConstraint implements Constraint
84      {
85          private Class type;
86  
87          public PayloadConstraint(Class type)
88          {
89              this.type = type;
90          }
91  
92          public boolean eval(Object o)
93          {
94              return ((UMOMessage)o).getPayload().getClass().equals(type);
95          }
96      }
97  }