View Javadoc

1   /*
2    * $Id: MuleResourceAdapterTestCase.java 19191 2010-08-25 21:05:23Z tcarlson $
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.AbstractMuleTestCase;
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  public class MuleResourceAdapterTestCase extends AbstractMuleTestCase
40  {
41      private MuleResourceAdapter resourceAdapter;
42  
43      @Override
44      protected void doSetUp() throws Exception
45      {
46          resourceAdapter = new MuleResourceAdapter();
47          resourceAdapter.muleContext = muleContext;
48          resourceAdapter.bootstrapContext = new MockBoostrapContext();
49      }
50  
51      @Override
52      protected void doTearDown() throws Exception
53      {
54          resourceAdapter = null;
55      }
56  
57      public void testResolveModelName() throws ResourceException
58      {
59          MuleActivationSpec activationSpec = new MuleActivationSpec();
60          activationSpec.setModelName("activationSpecModelName");
61          resourceAdapter.setModelName("resourceAdaptorModelName");
62          String modelName = resourceAdapter.resolveModelName(activationSpec);
63          assertEquals("activationSpecModelName", modelName);
64      }
65  
66      public void testResolveModelNameFromResourceAdaptor() throws ResourceException
67      {
68          MuleActivationSpec activationSpec = new MuleActivationSpec();
69          resourceAdapter.setModelName("resourceAdaptorModelName");
70          String modelName = resourceAdapter.resolveModelName(activationSpec);
71          assertEquals("resourceAdaptorModelName", modelName);
72      }
73  
74      public void testResolveModelNameFromActivationSpec() throws ResourceException
75      {
76          MuleActivationSpec activationSpec = new MuleActivationSpec();
77          activationSpec.setModelName("activationSpecModelName");
78          String modelName = resourceAdapter.resolveModelName(activationSpec);
79          assertEquals("activationSpecModelName", modelName);
80      }
81  
82      public void testResolveModelModelNameMissing()
83      {
84          MuleActivationSpec activationSpec = new MuleActivationSpec();
85          try
86          {
87              resourceAdapter.resolveModelName(activationSpec);
88              fail("Exception expected: No modelName set.");
89          }
90          catch (ResourceException e)
91          {
92              // expected
93          }
94      }
95  
96      public void testGetJcaModelCreateNew() throws MuleException, ResourceException
97      {
98          JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
99          assertEquals("jca", jcaModel.getName());
100     }
101 
102     public void testGetJcaModelUseExisting() throws MuleException, ResourceException
103     {
104         Model jcaModel = new JcaModel();
105         jcaModel.setName("jca");
106         muleContext.getRegistry().registerModel(jcaModel);
107         JcaModel jcaModel2 = resourceAdapter.getJcaModel("jca");
108         assertEquals("jca", jcaModel2.getName());
109         assertEquals(jcaModel, jcaModel2);
110     }
111 
112     public void testGetJcaModel3ExistingWrongType() throws MuleException
113     {
114         Model sedaModel = new SedaModel();
115         sedaModel.setName("jca");
116         muleContext.getRegistry().registerModel(sedaModel);
117         try
118         {
119             resourceAdapter.getJcaModel("jca");
120             fail("Exception Expected: Model is not JcaModel");
121         }
122         catch (Exception e)
123         {
124             // expected
125         }
126     }
127 
128     public void testCreateMessageInflowEndpoint() throws MuleException
129     {
130         MuleActivationSpec activationSpec = new MuleActivationSpec();
131         activationSpec.setEndpoint("test://testEndpoint");
132         ImmutableEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
133         assertEndpointAttributes(endpoint);
134     }
135 
136     public void testCreateJcaComponent() throws Exception
137     {
138         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
139         JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
140         MuleActivationSpec activationSpec = new MuleActivationSpec();
141         activationSpec.setEndpoint("test://testEndpoint");
142         InboundEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
143 
144         Service service = resourceAdapter.createJcaService(endpointFactory, jcaModel, endpoint);
145 
146         // Check service
147         assertNotNull(service);
148         assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
149         assertNotNull(service);
150         assertTrue(service instanceof JcaService);
151         assertNotNull(service.getComponent());
152         assertTrue(service.getComponent() instanceof JcaComponent);
153         assertNotNull(((JcaComponent) service.getComponent()).workManager);
154         testJcaService(service);
155 
156         testEndpoint(service);
157 
158         // Check endpoint
159         ImmutableEndpoint endpoint2 = ((ServiceCompositeMessageSource) service.getMessageSource()).getEndpoints().get(0);
160         assertEquals(endpoint, endpoint2);
161 
162         // Check service implementation
163         assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
164     }
165 
166     public void testendpointActivationOK() throws Exception
167     {
168         MuleActivationSpec activationSpec = new MuleActivationSpec();
169         activationSpec.setResourceAdapter(resourceAdapter);
170         activationSpec.setModelName("jcaModel");
171         activationSpec.setEndpoint("test://testEndpoint");
172         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
173 
174         assertEquals(0, resourceAdapter.endpoints.size());
175 
176         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
177         assertEquals(1, resourceAdapter.endpoints.size());
178 
179         MuleEndpointKey key = new MuleEndpointKey(endpointFactory, activationSpec);
180         Service service = resourceAdapter.endpoints.get(key);
181 
182         assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
183         testJcaService(service);
184         testEndpoint(service);
185         
186         assertTrue(service.getComponent() instanceof JcaComponent);
187         
188         assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
189 
190         // Additional activation with same endpointFactory does not increase size of
191         // endpoint cache.
192         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
193         assertEquals(1, resourceAdapter.endpoints.size());
194 
195         // Additional activation with new DefaultEndpointFactory instance increments size of
196         // endpoint cahce
197         resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
198         assertEquals(2, resourceAdapter.endpoints.size());
199 
200     }
201 
202     public void testendpointActivationIncorrectActivationSpec()
203     {
204         try
205         {
206             ActivationSpec activationSpec = new MockActivationSpec();
207             activationSpec.setResourceAdapter(resourceAdapter);
208             resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
209             fail("Exception expected: Invalid ActivationSpec type");
210         }
211         catch (ResourceException e)
212         {
213             // expected
214         }
215         assertEquals(0, resourceAdapter.endpoints.size());
216     }
217 
218     public void testendpointDeactivationOK() throws ResourceException
219     {
220         MuleActivationSpec activationSpec = new MuleActivationSpec();
221         activationSpec.setResourceAdapter(resourceAdapter);
222         activationSpec.setModelName("jcaModel");
223         activationSpec.setEndpoint("test://test");
224         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
225         assertEquals(0, resourceAdapter.endpoints.size());
226         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
227         assertEquals(1, resourceAdapter.endpoints.size());
228         resourceAdapter.endpointDeactivation(endpointFactory, activationSpec);
229         assertEquals(0, resourceAdapter.endpoints.size());
230     }
231 
232     protected void testEndpoint(Service service)
233     {
234         ServiceCompositeMessageSource inboundRouterCollection = (ServiceCompositeMessageSource) service.getMessageSource();
235         ImmutableEndpoint endpoint = inboundRouterCollection.getEndpoints().get(0);
236         assertEndpointAttributes(endpoint);
237     }
238 
239     protected void assertEndpointAttributes(ImmutableEndpoint endpoint)
240     {
241         assertNotNull(endpoint);
242         assertNotNull(endpoint.getConnector());
243         assertEquals("testEndpoint", endpoint.getEndpointURI().getAddress());
244         assertEquals(MessageExchangePattern.ONE_WAY, endpoint.getExchangePattern());
245     }
246 
247     protected void testJcaService(Service service)
248     {
249         // Check for a single inbound router, no outbound routers and no nested
250         // routers
251         assertNotNull(service);
252 
253         assertNotNull(service.getMessageSource());
254 
255         // InboundPassThroughRouter is now set in runtime rather than in service creation as in 1.4.x
256         // assertEquals(1, service.getInboundRouter().getRouters().size());
257         assertEquals(0, ((ServiceCompositeMessageSource) service.getMessageSource()).getMessageProcessors().size());
258     }
259 
260 }
261 
262 class MockEndpointFactory implements MessageEndpointFactory
263 {
264 
265     public MessageEndpoint createEndpoint(XAResource arg0) throws UnavailableException
266     {
267         return null;
268     }
269 
270     public boolean isDeliveryTransacted(Method arg0) throws NoSuchMethodException
271     {
272         return false;
273     }
274 }
275 
276 class MockActivationSpec implements ActivationSpec
277 {
278 
279     public void validate() throws InvalidPropertyException
280     {
281         // do nothing
282     }
283 
284     public ResourceAdapter getResourceAdapter()
285     {
286         return null;
287     }
288 
289     public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException
290     {
291         // do nothing
292     }
293 }
294 
295 class MockBoostrapContext implements BootstrapContext
296 {
297 
298     public Timer createTimer() throws UnavailableException
299     {
300         return null;
301     }
302 
303     public WorkManager getWorkManager()
304     {
305         return new TestJCAWorkManager();
306     }
307 
308     public XATerminator getXATerminator()
309     {
310         return null;
311     }
312 }