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