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