View Javadoc

1   /*
2    * $Id: DefaultServiceExceptionStrategyTestCase.java 22421 2011-07-15 05:05:06Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.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.test.integration.exceptions;
12  
13  import org.mule.api.MuleException;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.client.LocalMuleClient;
16  import org.mule.api.construct.FlowConstruct;
17  import org.mule.api.processor.MessageProcessor;
18  import org.mule.exception.DefaultMessagingExceptionStrategy;
19  import org.mule.message.ExceptionMessage;
20  import org.mule.module.client.MuleClient;
21  import org.mule.routing.outbound.MulticastingRouter;
22  import org.mule.tck.AbstractServiceAndFlowTestCase;
23  import org.mule.tck.FunctionalTestCase;
24  import org.mule.tck.exceptions.FunctionalTestException;
25  import org.mule.tck.probe.PollingProber;
26  import org.mule.tck.probe.Probe;
27  import org.mule.tck.probe.Prober;
28  
29  import java.util.Arrays;
30  import java.util.Collection;
31  import java.util.HashMap;
32  import java.util.Map;
33  
34  import org.junit.Test;
35  import org.junit.runners.Parameterized.Parameters;
36  
37  import static org.junit.Assert.assertEquals;
38  import static org.junit.Assert.assertNotNull;
39  import static org.junit.Assert.assertNotSame;
40  import static org.junit.Assert.assertNull;
41  import static org.junit.Assert.assertTrue;
42  
43  public class DefaultServiceExceptionStrategyTestCase extends AbstractServiceAndFlowTestCase
44  {
45      @Parameters
46      public static Collection<Object[]> parameters()
47      {
48          return Arrays.asList(new Object[][]{
49              {ConfigVariant.SERVICE,
50                  "org/mule/test/integration/exceptions/default-service-exception-strategy-config-service.xml"},
51              {ConfigVariant.FLOW,
52                  "org/mule/test/integration/exceptions/default-service-exception-strategy-config-flow.xml"}});
53      }
54  
55      public DefaultServiceExceptionStrategyTestCase(ConfigVariant variant, String configResources)
56      {
57          super(variant, configResources);
58      }
59  
60      @Test
61      public void testDefaultExceptionStrategySingleEndpoint() throws MuleException
62      {
63          FlowConstruct service;
64  
65          if (variant.equals(ConfigVariant.FLOW))
66              service = muleContext.getRegistry().lookupFlowConstruct("testService1");
67          else
68              service = muleContext.getRegistry().lookupService("testService1");
69  
70          assertNotNull(service);
71          assertNotNull(service.getExceptionListener());
72          assertTrue(service.getExceptionListener() instanceof DefaultMessagingExceptionStrategy);
73          assertEquals(1,
74              ((DefaultMessagingExceptionStrategy) service.getExceptionListener()).getMessageProcessors()
75                  .size());
76  
77          MuleClient mc = new MuleClient(muleContext);
78          mc.dispatch("vm://in1", "test", null);
79          assertExceptionMessage(mc.request("vm://out1", RECEIVE_TIMEOUT));
80          // request one more time to ensure that only one exception message was sent
81          // per exception
82          assertNull(mc.request("vm://out1", RECEIVE_TIMEOUT));
83      }
84  
85      @Test
86      public void testDefaultExceptionStrategyMultipleEndpoints() throws MuleException
87      {
88          FlowConstruct service;
89  
90          if (variant.equals(ConfigVariant.FLOW))
91              service = muleContext.getRegistry().lookupFlowConstruct("testService2");
92          else
93              service = muleContext.getRegistry().lookupService("testService2");
94  
95          assertNotNull(service);
96          assertNotNull(service.getExceptionListener());
97          assertTrue(service.getExceptionListener() instanceof DefaultMessagingExceptionStrategy);
98          DefaultMessagingExceptionStrategy exceptionListener = (DefaultMessagingExceptionStrategy) service.getExceptionListener();
99          MessageProcessor mp = exceptionListener.getMessageProcessors().iterator().next();
100         assertTrue(mp.getClass().getName(), mp instanceof MulticastingRouter);
101         assertEquals(2, ((MulticastingRouter) mp).getRoutes().size());
102 
103         MuleClient mc = new MuleClient(muleContext);
104         mc.dispatch("vm://in2", "test", null);
105         MuleMessage out2 = mc.request("vm://out2", FunctionalTestCase.RECEIVE_TIMEOUT);
106         MuleMessage out3 = mc.request("vm://out3", FunctionalTestCase.RECEIVE_TIMEOUT);
107         assertExceptionMessage(out2);
108         assertExceptionMessage(out3);
109         assertNotSame(out2, out3);
110         assertEquals(out2.getPayload(), out3.getPayload());
111     }
112 
113     @Test
114     public void testDefaultExceptionStrategyNonEndpoint() throws Exception
115     {
116         LocalMuleClient mc = muleContext.getClient();
117 
118         mc.dispatch("vm://in3", "test", null);
119 
120         MuleMessage out4 = mc.request("vm://out4", FunctionalTestCase.RECEIVE_TIMEOUT);
121         assertEquals("ERROR!", out4.getPayloadAsString());
122     }
123 
124     @Test
125     public void testSerializablePayload() throws MuleException
126     {
127         Map<String, String> map = new HashMap<String, String>();
128         map.put("key1", "value1");
129         map.put("key2", "value2");
130 
131         MuleClient mc = new MuleClient(muleContext);
132         mc.dispatch("vm://in1", map, null);
133         MuleMessage message = mc.request("vm://out1", FunctionalTestCase.RECEIVE_TIMEOUT);
134 
135         assertTrue(message.getPayload() instanceof ExceptionMessage);
136         Object payload = ((ExceptionMessage) message.getPayload()).getPayload();
137         assertTrue("payload shoud be a Map, but is " + payload.getClass().getName(),
138             payload instanceof Map<?, ?>);
139         Map<?, ?> payloadMap = (Map<?, ?>) payload;
140         assertEquals("value1", payloadMap.get("key1"));
141         assertEquals("value2", payloadMap.get("key2"));
142     }
143 
144     @Test
145     public void testStopsServiceOnException() throws MuleException, InterruptedException
146     {
147         final FlowConstruct service;
148 
149         if (variant.equals(ConfigVariant.FLOW))
150             service = muleContext.getRegistry().lookupFlowConstruct("testService5");
151         else
152             service = muleContext.getRegistry().lookupService("testService5");
153 
154         MuleClient mc = new MuleClient(muleContext);
155         mc.dispatch("vm://in5", "test", null);
156 
157         assertExceptionMessage(mc.request("vm://out5", FunctionalTestCase.RECEIVE_TIMEOUT));
158 
159         Prober prober = new PollingProber(5000, 100);
160         prober.check(new Probe()
161         {
162             @Override
163             public boolean isSatisfied()
164             {
165                 return !service.getLifecycleState().isStarted();
166             }
167 
168             @Override
169             public String describeFailure()
170             {
171                 return "Service was not stopped after processing the exception";
172             }
173         });
174     }
175 
176     private void assertExceptionMessage(MuleMessage out)
177     {
178         assertTrue(out.getPayload() instanceof ExceptionMessage);
179         ExceptionMessage exceptionMessage = (ExceptionMessage) out.getPayload();
180         assertEquals(FunctionalTestException.class, exceptionMessage.getException().getCause().getClass());
181         assertEquals("test", exceptionMessage.getPayload());
182     }
183 }