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