1
2
3
4
5
6
7
8
9
10
11
12 package org.mule.module.jca;
13
14 import org.mule.MessageExchangePattern;
15 import org.mule.api.MuleException;
16 import org.mule.api.endpoint.ImmutableEndpoint;
17 import org.mule.api.endpoint.InboundEndpoint;
18 import org.mule.api.model.Model;
19 import org.mule.api.service.Service;
20 import org.mule.model.seda.SedaModel;
21 import org.mule.service.ServiceCompositeMessageSource;
22 import org.mule.tck.junit4.AbstractMuleContextTestCase;
23
24 import java.lang.reflect.Method;
25 import java.util.Timer;
26
27 import javax.resource.ResourceException;
28 import javax.resource.spi.ActivationSpec;
29 import javax.resource.spi.BootstrapContext;
30 import javax.resource.spi.InvalidPropertyException;
31 import javax.resource.spi.ResourceAdapter;
32 import javax.resource.spi.UnavailableException;
33 import javax.resource.spi.XATerminator;
34 import javax.resource.spi.endpoint.MessageEndpoint;
35 import javax.resource.spi.endpoint.MessageEndpointFactory;
36 import javax.resource.spi.work.WorkManager;
37 import javax.transaction.xa.XAResource;
38
39 import org.junit.Test;
40
41 import static org.junit.Assert.assertEquals;
42 import static org.junit.Assert.assertNotNull;
43 import static org.junit.Assert.assertTrue;
44 import static org.junit.Assert.fail;
45
46 public class MuleResourceAdapterTestCase extends AbstractMuleContextTestCase
47 {
48 private MuleResourceAdapter resourceAdapter;
49
50 @Override
51 protected void doSetUp() throws Exception
52 {
53 resourceAdapter = new MuleResourceAdapter();
54 resourceAdapter.muleContext = muleContext;
55 resourceAdapter.bootstrapContext = new MockBoostrapContext();
56 }
57
58 @Override
59 protected void doTearDown() throws Exception
60 {
61 resourceAdapter = null;
62 }
63
64 @Test
65 public void testResolveModelName() throws ResourceException
66 {
67 MuleActivationSpec activationSpec = new MuleActivationSpec();
68 activationSpec.setModelName("activationSpecModelName");
69 resourceAdapter.setModelName("resourceAdaptorModelName");
70 String modelName = resourceAdapter.resolveModelName(activationSpec);
71 assertEquals("activationSpecModelName", modelName);
72 }
73
74 @Test
75 public void testResolveModelNameFromResourceAdaptor() throws ResourceException
76 {
77 MuleActivationSpec activationSpec = new MuleActivationSpec();
78 resourceAdapter.setModelName("resourceAdaptorModelName");
79 String modelName = resourceAdapter.resolveModelName(activationSpec);
80 assertEquals("resourceAdaptorModelName", modelName);
81 }
82
83 @Test
84 public void testResolveModelNameFromActivationSpec() throws ResourceException
85 {
86 MuleActivationSpec activationSpec = new MuleActivationSpec();
87 activationSpec.setModelName("activationSpecModelName");
88 String modelName = resourceAdapter.resolveModelName(activationSpec);
89 assertEquals("activationSpecModelName", modelName);
90 }
91
92 @Test
93 public void testResolveModelModelNameMissing()
94 {
95 MuleActivationSpec activationSpec = new MuleActivationSpec();
96 try
97 {
98 resourceAdapter.resolveModelName(activationSpec);
99 fail("Exception expected: No modelName set.");
100 }
101 catch (ResourceException e)
102 {
103
104 }
105 }
106
107 @Test
108 public void testGetJcaModelCreateNew() throws MuleException, ResourceException
109 {
110 JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
111 assertEquals("jca", jcaModel.getName());
112 }
113
114 @Test
115 public void testGetJcaModelUseExisting() throws MuleException, ResourceException
116 {
117 Model jcaModel = new JcaModel();
118 jcaModel.setName("jca");
119 muleContext.getRegistry().registerModel(jcaModel);
120 JcaModel jcaModel2 = resourceAdapter.getJcaModel("jca");
121 assertEquals("jca", jcaModel2.getName());
122 assertEquals(jcaModel, jcaModel2);
123 }
124
125 @Test
126 public void testGetJcaModel3ExistingWrongType() throws MuleException
127 {
128 Model sedaModel = new SedaModel();
129 sedaModel.setName("jca");
130 muleContext.getRegistry().registerModel(sedaModel);
131 try
132 {
133 resourceAdapter.getJcaModel("jca");
134 fail("Exception Expected: Model is not JcaModel");
135 }
136 catch (Exception e)
137 {
138
139 }
140 }
141
142 @Test
143 public void testCreateMessageInflowEndpoint() throws MuleException
144 {
145 MuleActivationSpec activationSpec = new MuleActivationSpec();
146 activationSpec.setEndpoint("test://testEndpoint");
147 ImmutableEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
148 assertEndpointAttributes(endpoint);
149 }
150
151 @Test
152 public void testCreateJcaComponent() throws Exception
153 {
154 MessageEndpointFactory endpointFactory = new MockEndpointFactory();
155 JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
156 MuleActivationSpec activationSpec = new MuleActivationSpec();
157 activationSpec.setEndpoint("test://testEndpoint");
158 InboundEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
159
160 Service service = resourceAdapter.createJcaService(endpointFactory, jcaModel, endpoint);
161
162
163 assertNotNull(service);
164 assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
165 assertNotNull(service);
166 assertTrue(service instanceof JcaService);
167 assertNotNull(service.getComponent());
168 assertTrue(service.getComponent() instanceof JcaComponent);
169 assertNotNull(((JcaComponent) service.getComponent()).workManager);
170 testJcaService(service);
171
172 testEndpoint(service);
173
174
175 ImmutableEndpoint endpoint2 = ((ServiceCompositeMessageSource) service.getMessageSource()).getEndpoints().get(0);
176 assertEquals(endpoint, endpoint2);
177
178
179 assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
180 }
181
182 @Test
183 public void testendpointActivationOK() throws Exception
184 {
185 MuleActivationSpec activationSpec = new MuleActivationSpec();
186 activationSpec.setResourceAdapter(resourceAdapter);
187 activationSpec.setModelName("jcaModel");
188 activationSpec.setEndpoint("test://testEndpoint");
189 MessageEndpointFactory endpointFactory = new MockEndpointFactory();
190
191 assertEquals(0, resourceAdapter.endpoints.size());
192
193 resourceAdapter.endpointActivation(endpointFactory, activationSpec);
194 assertEquals(1, resourceAdapter.endpoints.size());
195
196 MuleEndpointKey key = new MuleEndpointKey(endpointFactory, activationSpec);
197 Service service = resourceAdapter.endpoints.get(key);
198
199 assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
200 testJcaService(service);
201 testEndpoint(service);
202
203 assertTrue(service.getComponent() instanceof JcaComponent);
204
205 assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
206
207
208
209 resourceAdapter.endpointActivation(endpointFactory, activationSpec);
210 assertEquals(1, resourceAdapter.endpoints.size());
211
212
213
214 resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
215 assertEquals(2, resourceAdapter.endpoints.size());
216
217 }
218
219 @Test
220 public void testendpointActivationIncorrectActivationSpec()
221 {
222 try
223 {
224 ActivationSpec activationSpec = new MockActivationSpec();
225 activationSpec.setResourceAdapter(resourceAdapter);
226 resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
227 fail("Exception expected: Invalid ActivationSpec type");
228 }
229 catch (ResourceException e)
230 {
231
232 }
233 assertEquals(0, resourceAdapter.endpoints.size());
234 }
235
236 @Test
237 public void testendpointDeactivationOK() throws ResourceException
238 {
239 MuleActivationSpec activationSpec = new MuleActivationSpec();
240 activationSpec.setResourceAdapter(resourceAdapter);
241 activationSpec.setModelName("jcaModel");
242 activationSpec.setEndpoint("test://test");
243 MessageEndpointFactory endpointFactory = new MockEndpointFactory();
244 assertEquals(0, resourceAdapter.endpoints.size());
245 resourceAdapter.endpointActivation(endpointFactory, activationSpec);
246 assertEquals(1, resourceAdapter.endpoints.size());
247 resourceAdapter.endpointDeactivation(endpointFactory, activationSpec);
248 assertEquals(0, resourceAdapter.endpoints.size());
249 }
250
251 protected void testEndpoint(Service service)
252 {
253 ServiceCompositeMessageSource inboundRouterCollection = (ServiceCompositeMessageSource) service.getMessageSource();
254 ImmutableEndpoint endpoint = inboundRouterCollection.getEndpoints().get(0);
255 assertEndpointAttributes(endpoint);
256 }
257
258 protected void assertEndpointAttributes(ImmutableEndpoint endpoint)
259 {
260 assertNotNull(endpoint);
261 assertNotNull(endpoint.getConnector());
262 assertEquals("testEndpoint", endpoint.getEndpointURI().getAddress());
263 assertEquals(MessageExchangePattern.ONE_WAY, endpoint.getExchangePattern());
264 }
265
266 protected void testJcaService(Service service)
267 {
268
269
270 assertNotNull(service);
271
272 assertNotNull(service.getMessageSource());
273
274
275
276 assertEquals(0, ((ServiceCompositeMessageSource) service.getMessageSource()).getMessageProcessors().size());
277 }
278
279 }
280
281 class MockEndpointFactory implements MessageEndpointFactory
282 {
283
284 public MessageEndpoint createEndpoint(XAResource arg0) throws UnavailableException
285 {
286 return null;
287 }
288
289 public boolean isDeliveryTransacted(Method arg0) throws NoSuchMethodException
290 {
291 return false;
292 }
293 }
294
295 class MockActivationSpec implements ActivationSpec
296 {
297
298 public void validate() throws InvalidPropertyException
299 {
300
301 }
302
303 public ResourceAdapter getResourceAdapter()
304 {
305 return null;
306 }
307
308 public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException
309 {
310
311 }
312 }
313
314 class MockBoostrapContext implements BootstrapContext
315 {
316
317 public Timer createTimer() throws UnavailableException
318 {
319 return null;
320 }
321
322 public WorkManager getWorkManager()
323 {
324 return new TestJCAWorkManager();
325 }
326
327 public XATerminator getXATerminator()
328 {
329 return null;
330 }
331 }