View Javadoc

1   /*
2    * $Id: RoundRobinTestCase.java 22377 2011-07-11 12:41:42Z 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;
12  
13  import org.mule.DefaultMuleEvent;
14  import org.mule.DefaultMuleMessage;
15  import org.mule.MessageExchangePattern;
16  import org.mule.api.DefaultMuleException;
17  import org.mule.api.MuleEvent;
18  import org.mule.api.MuleException;
19  import org.mule.api.MuleMessage;
20  import org.mule.api.MuleSession;
21  import org.mule.api.processor.MessageProcessor;
22  import org.mule.tck.junit4.AbstractMuleContextTestCase;
23  
24  import java.util.ArrayList;
25  import java.util.List;
26  import java.util.concurrent.atomic.AtomicInteger;
27  
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  
32  public class RoundRobinTestCase extends AbstractMuleContextTestCase
33  {
34      private final static int NUMBER_OF_ROUTES = 10;
35      private final static int NUMBER_OF_MESSAGES = 10;
36      private final AtomicInteger messageNumber = new AtomicInteger(0);
37  
38      public RoundRobinTestCase()
39      {
40          setStartContext(true);
41      }
42  
43      @Test
44      public void testRoundRobin() throws Exception
45      {
46          RoundRobin rr = new RoundRobin();
47          MuleSession session = getTestSession(getTestService(), muleContext);
48          List<TestProcessor> routes = new ArrayList<TestProcessor>(NUMBER_OF_ROUTES);
49          for (int i = 0; i < NUMBER_OF_ROUTES; i++)
50          {
51              routes.add(new TestProcessor());
52          }
53          rr.setRoutes(new ArrayList<MessageProcessor>(routes));
54          List<Thread> threads = new ArrayList<Thread>(NUMBER_OF_ROUTES);
55          for (int i = 0; i < NUMBER_OF_ROUTES; i++)
56          {
57              threads.add(new Thread(new TestDriver(session, rr, NUMBER_OF_MESSAGES)));
58          }
59          for (Thread t : threads)
60          {
61              t.start();
62          }
63          for (Thread t : threads)
64          {
65              t.join();
66          }
67          for (TestProcessor route : routes)
68          {
69              assertEquals(NUMBER_OF_MESSAGES, route.getCount());
70          }
71      }
72  
73      class TestDriver implements Runnable
74      {
75          private MessageProcessor target;
76          private int numMessages;
77          private MuleSession session;
78  
79          TestDriver(MuleSession session, MessageProcessor target, int numMessages)
80          {
81              this.target = target;
82              this.numMessages = numMessages;
83              this.session = session;
84          }
85  
86          @Override
87          public void run()
88          {
89              for (int i = 0; i < numMessages; i++)
90              {
91                  MuleMessage msg = new DefaultMuleMessage(TEST_MESSAGE + messageNumber.getAndIncrement(), muleContext);
92                  MuleEvent event = new DefaultMuleEvent(msg, MessageExchangePattern.REQUEST_RESPONSE, session);
93                  try
94                  {
95                      target.process(event);
96                  }
97                  catch (MuleException e)
98                  {
99                      // this is expected
100                 }
101             }
102         }
103     }
104 
105     static class TestProcessor implements MessageProcessor
106     {
107         private int count;
108         private List<Object> payloads = new ArrayList<Object>();
109 
110         @Override
111         public MuleEvent process(MuleEvent event) throws MuleException
112         {
113             payloads.add(event.getMessage().getPayload());
114             count++;
115             if (count % 3 == 0)
116             {
117                 throw new DefaultMuleException("Mule Exception!");
118             }
119             return null;
120         }
121 
122         public int getCount()
123         {
124             return count;
125         }
126     }
127 }