View Javadoc

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