1
2
3
4
5
6
7
8
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
81
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 }