View Javadoc

1   /*
2    * $Id: MuleResourceAdapterTestCase.java 22377 2011-07-11 12:41:42Z 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  
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             // expected
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             // expected
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         // Check service
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         // Check endpoint
175         ImmutableEndpoint endpoint2 = ((ServiceCompositeMessageSource) service.getMessageSource()).getEndpoints().get(0);
176         assertEquals(endpoint, endpoint2);
177 
178         // Check service implementation
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         // Additional activation with same endpointFactory does not increase size of
208         // endpoint cache.
209         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
210         assertEquals(1, resourceAdapter.endpoints.size());
211 
212         // Additional activation with new DefaultEndpointFactory instance increments size of
213         // endpoint cahce
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             // expected
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         // Check for a single inbound router, no outbound routers and no nested
269         // routers
270         assertNotNull(service);
271 
272         assertNotNull(service.getMessageSource());
273 
274         // InboundPassThroughRouter is now set in runtime rather than in service creation as in 1.4.x
275         // assertEquals(1, service.getInboundRouter().getRouters().size());
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         // do nothing
301     }
302 
303     public ResourceAdapter getResourceAdapter()
304     {
305         return null;
306     }
307 
308     public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException
309     {
310         // do nothing
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 }