View Javadoc

1   /*
2    * $Id: FileReceiverMoveDeleteTestCase.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  package org.mule.transport.file;
12  
13  import org.mule.api.MuleEventContext;
14  import org.mule.api.MuleMessage;
15  import org.mule.api.endpoint.EndpointBuilder;
16  import org.mule.api.endpoint.InboundEndpoint;
17  import org.mule.api.service.Service;
18  import org.mule.api.source.CompositeMessageSource;
19  import org.mule.api.transformer.Transformer;
20  import org.mule.component.DefaultJavaComponent;
21  import org.mule.endpoint.EndpointURIEndpointBuilder;
22  import org.mule.model.seda.SedaService;
23  import org.mule.object.SingletonObjectFactory;
24  import org.mule.tck.functional.EventCallback;
25  import org.mule.tck.functional.FunctionalTestComponent;
26  import org.mule.tck.transformer.NoActionTransformer;
27  import org.mule.transformer.AbstractMessageTransformer;
28  import org.mule.util.concurrent.Latch;
29  
30  import java.io.File;
31  
32  import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
33  
34  public class FileReceiverMoveDeleteTestCase extends AbstractFileMoveDeleteTestCase
35  {
36      @Override
37      protected void doSetUp() throws Exception
38      {
39          super.doSetUp();
40  
41          // get rid of a warning that complains about two transformers with the same data type
42          muleContext.getRegistry().unregisterTransformer("_ObjectToByteArray");
43      }
44  
45      public void testMoveAndDeleteStreaming() throws Exception
46      {
47          File inFile = initForRequest();
48  
49          File moveToDir = configureConnector(inFile, true, true, true, null);
50  
51          assertRecevied(configureService(inFile, true, false));
52          assertFiles(inFile, moveToDir, true, true);
53      }
54  
55      public void testMoveOnlyStreaming() throws Exception
56      {
57          File inFile = initForRequest();
58  
59          File moveToDir = configureConnector(inFile, true, true, false, null);
60  
61          assertRecevied(configureService(inFile, true, false));
62          assertFiles(inFile, moveToDir, true, false);
63      }
64  
65      public void testDeleteOnlyStreaming() throws Exception
66      {
67          File inFile = initForRequest();
68  
69          File moveToDir = configureConnector(inFile, true, false, true, null);
70  
71          assertRecevied(configureService(inFile, true, false));
72          assertFiles(inFile, moveToDir, false, true);
73      }
74  
75      public void testNoMoveNoDeleteStreaming() throws Exception
76      {
77          File inFile = initForRequest();
78  
79          File moveToDir = configureConnector(inFile, true, false, false, null);
80  
81          assertRecevied(configureService(inFile, true, false));
82          assertFiles(inFile, moveToDir, false, false);
83      }
84  
85      public void testMoveAndDelete() throws Exception
86      {
87          File inFile = initForRequest();
88  
89          File moveToDir = configureConnector(inFile, false, true, true, null);
90  
91          assertRecevied(configureService(inFile, false, false));
92          assertFiles(inFile, moveToDir, true, true);
93      }
94  
95      public void testMoveOnly() throws Exception
96      {
97          File inFile = initForRequest();
98  
99          File moveToDir = configureConnector(inFile, false, true, false, null);
100 
101         assertRecevied(configureService(inFile, false, false));
102         assertFiles(inFile, moveToDir, true, false);
103     }
104 
105     public void testDeleteOnly() throws Exception
106     {
107         File inFile = initForRequest();
108 
109         File moveToDir = configureConnector(inFile, false, false, true, null);
110 
111         assertRecevied(configureService(inFile, false, false));
112         assertFiles(inFile, moveToDir, false, true);
113     }
114 
115     public void testNoMoveNoDelete() throws Exception
116     {
117         File inFile = initForRequest();
118 
119         File moveToDir = configureConnector(inFile, false, false, false, null);
120 
121         assertRecevied(configureService(inFile, false, false));
122         assertFiles(inFile, moveToDir, false, false);
123     }
124 
125     public void testMoveAndDeleteFilePayload() throws Exception
126     {
127         File inFile = initForRequest();
128 
129         File moveToDir = configureConnector(inFile, false, true, false, FileMuleMessageFactory.class);
130 
131         assertRecevied(configureService(inFile, false, true));
132         assertFiles(inFile, moveToDir, true, true);
133     }
134 
135     public void testMoveOnlyFilePayload() throws Exception
136     {
137         File inFile = initForRequest();
138 
139         File moveToDir = configureConnector(inFile, false, true, false, FileMuleMessageFactory.class);
140 
141         assertRecevied(configureService(inFile, false, true));
142         assertFiles(inFile, moveToDir, true, false);
143     }
144 
145     public void testDeleteOnlyFilePayload() throws Exception
146     {
147         File inFile = initForRequest();
148 
149         File moveToDir = configureConnector(inFile, false, false, true, FileMuleMessageFactory.class);
150 
151         assertRecevied(configureService(inFile, false, true));
152         //TODO MULE-3198
153         //assertFiles(inFile, moveToDir, false, true);
154     }
155 
156     public void testNoMoveNoDeleteFilePayload() throws Exception
157     {
158         File inFile = initForRequest();
159 
160         File moveToDir = configureConnector(inFile, false, false, false, FileMuleMessageFactory.class);
161         //TODO MULE-3198
162         //assertRecevied(configureService(inFile, false, true));
163 
164         assertFiles(inFile, moveToDir, false, false);
165     }
166 
167     protected Latch configureService(File inFile, boolean streaming, boolean filePayload) throws Exception
168     {
169         Service service = new SedaService(muleContext);
170         service.setName("moveDeleteBridgeService");
171         String url = fileToUrl(inFile.getParentFile()) + "?connector=moveDeleteConnector";
172         Transformer transformer = null;
173         if (streaming)
174         {
175             if (filePayload)
176             {
177                 fail("Inconsistant test case: streaming and file payload are not compatible");
178             }
179             else
180             {
181                 transformer = new FileMessageFactoryAssertingTransformer(ReceiverFileInputStream.class);
182             }
183         }
184         else
185         {
186             if (filePayload)
187             {
188                 transformer = new FileMessageFactoryAssertingTransformer(File.class);
189             }
190             else
191             {
192                 transformer = new FileMessageFactoryAssertingTransformer(byte[].class);
193             }
194         }
195         
196         EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder(url, muleContext);
197         endpointBuilder.addMessageProcessor(transformer);
198         if (filePayload)
199         {
200             endpointBuilder.addMessageProcessor(new NoActionTransformer());
201         }
202         InboundEndpoint endpoint = 
203             muleContext.getRegistry().lookupEndpointFactory().getInboundEndpoint(endpointBuilder);
204         ((CompositeMessageSource) service.getMessageSource()).addSource(endpoint);
205         
206         final Latch latch = new Latch();
207         FunctionalTestComponent testComponent = new FunctionalTestComponent();
208         testComponent.setMuleContext(muleContext);
209         testComponent.setEventCallback(new EventCallback()
210         {
211             public void eventReceived(final MuleEventContext context, final Object message) throws Exception
212             {                
213                 assertEquals(1, latch.getCount());
214                 latch.countDown();
215                 assertEquals(TEST_MESSAGE, context.transformMessageToString());
216             }
217         });
218         testComponent.initialise();
219         
220         final DefaultJavaComponent component = new DefaultJavaComponent(new SingletonObjectFactory(testComponent));
221         component.setMuleContext(muleContext);
222         service.setComponent(component);
223         service.setModel(muleContext.getRegistry().lookupSystemModel());
224         muleContext.getRegistry().registerService(service);
225         return latch;
226     }
227 
228     protected void assertRecevied(Latch latch) throws Exception
229     {
230         assertNotNull(latch);
231         assertTrue(latch.await(2000, TimeUnit.MILLISECONDS));
232     }
233 
234     private class FileMessageFactoryAssertingTransformer extends AbstractMessageTransformer
235     {
236         private Class<?> expectedPayload;
237 
238         public FileMessageFactoryAssertingTransformer(Class<?> expectedPayload)
239         {
240             this.expectedPayload = expectedPayload;
241         }
242 
243         @Override
244         public Object transformMessage(MuleMessage message, String outputEncoding)
245         {
246             assertEquals(expectedPayload, message.getPayload().getClass());
247 
248             // If we are streaming, copy/delete shouldn't have happened yet
249             if (expectedPayload.equals(ReceiverFileInputStream.class))
250             {
251                 File file = ((ReceiverFileInputStream) message.getPayload()).getCurrentFile();
252                 assertFilesUntouched(file);
253             }
254             return message;
255         }
256     }
257 
258 }