View Javadoc

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