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