View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.routing;
8   
9   import org.mule.DefaultMuleEvent;
10  import org.mule.DefaultMuleMessage;
11  import org.mule.api.DefaultMuleException;
12  import org.mule.api.MuleEvent;
13  import org.mule.api.MuleException;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.MuleSession;
16  import org.mule.api.processor.MessageProcessor;
17  import org.mule.tck.junit4.AbstractMuleContextTestCase;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicInteger;
23  import org.junit.Test;
24  
25  import static org.junit.Assert.assertEquals;
26  
27  public class RoundRobinTestCase extends AbstractMuleContextTestCase
28  {
29      private final static int NUMBER_OF_ROUTES = 10;
30      private final static int NUMBER_OF_MESSAGES = 10;
31      private final AtomicInteger messageNumber = new AtomicInteger(0);
32  
33      public RoundRobinTestCase()
34      {
35          setStartContext(true);
36      }
37  
38      @Test
39      public void testRoundRobin() throws Exception
40      {
41          RoundRobin rr = new RoundRobin();
42          MuleSession session = getTestSession(getTestService(), muleContext);
43          List<TestProcessor> routes = new ArrayList<TestProcessor>(NUMBER_OF_ROUTES);
44          for (int i = 0; i < NUMBER_OF_ROUTES; i++)
45          {
46              routes.add(new TestProcessor());
47          }
48          rr.setMessageProcessors(new ArrayList<MessageProcessor>(routes));
49          List<Thread> threads = new ArrayList<Thread>(NUMBER_OF_ROUTES);
50          for (int i = 0; i < NUMBER_OF_ROUTES; i++)
51          {
52              threads.add(new Thread(new TestDriver(session, rr, NUMBER_OF_MESSAGES)));
53          }
54          for (Thread t : threads)
55          {
56              t.start();
57          }
58          for (Thread t : threads)
59          {
60              t.join();
61          }
62          for (TestProcessor route : routes)
63          {
64              assertEquals(NUMBER_OF_MESSAGES, route.getCount());
65          }
66      }
67  
68      class TestDriver implements Runnable
69      {
70          private MessageProcessor target;
71          private int numMessages;
72          private MuleSession session;
73  
74          TestDriver(MuleSession session, MessageProcessor target, int numMessages)
75          {
76              this.target = target;
77              this.numMessages = numMessages;
78              this.session = session;
79          }
80  
81          public void run()
82          {
83              for (int i = 0; i < numMessages; i++)
84              {
85                  MuleMessage msg = new DefaultMuleMessage(TEST_MESSAGE + messageNumber.getAndIncrement(), muleContext);
86                  MuleEvent event = new DefaultMuleEvent(msg, null, session);
87                  try
88                  {
89                      target.process(event);
90                  }
91                  catch (MuleException e)
92                  {
93                      // this is expected
94                  }
95              }
96          }
97      }
98  
99      static class TestProcessor implements MessageProcessor
100     {
101         private int count;
102         private List<Object> payloads = new ArrayList<Object>();
103 
104         public MuleEvent process(MuleEvent event) throws MuleException
105         {
106             payloads.add(event.getMessage().getPayload());
107             count++;
108             if (count % 3 == 0)
109             {
110                 throw new DefaultMuleException("Mule Exception!");
111             }
112             return null;
113         }
114 
115         public int getCount()
116         {
117             return count;
118         }
119     }
120 }