1   /*
2    * $Id: FileReceiverMoveDeleteTestCase.java 12017 2008-06-12 09:04:04Z rossmason $
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  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.service.Service;
17  import org.mule.api.transformer.TransformerException;
18  import org.mule.component.DefaultJavaComponent;
19  import org.mule.endpoint.EndpointURIEndpointBuilder;
20  import org.mule.endpoint.URIBuilder;
21  import org.mule.model.seda.SedaService;
22  import org.mule.object.SingletonObjectFactory;
23  import org.mule.tck.functional.EventCallback;
24  import org.mule.tck.functional.FunctionalTestComponent;
25  import org.mule.transformer.AbstractMessageAwareTransformer;
26  import org.mule.transformer.NoActionTransformer;
27  import org.mule.util.concurrent.Latch;
28  
29  import java.io.File;
30  
31  import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
32  
33  public class FileReceiverMoveDeleteTestCase extends AbstractFileMoveDeleteTestCase
34  {
35  
36      public void testMoveAndDeleteStreaming() throws Exception
37      {
38          File inFile = initForRequest();
39  
40          File moveToDir = configureConnector(inFile, true, true, true, null);
41  
42          assertRecevied(configureService(inFile, true, false));
43  
44          assertFiles(inFile, moveToDir, true, true);
45      }
46  
47      public void testMoveOnlyStreaming() throws Exception
48      {
49          File inFile = initForRequest();
50  
51          File moveToDir = configureConnector(inFile, true, true, false, null);
52  
53          assertRecevied(configureService(inFile, true, false));
54  
55          assertFiles(inFile, moveToDir, true, false);
56      }
57  
58      public void testDeleteOnlyStreaming() throws Exception
59      {
60          File inFile = initForRequest();
61  
62          File moveToDir = configureConnector(inFile, true, false, true, null);
63  
64          assertRecevied(configureService(inFile, true, false));
65  
66          assertFiles(inFile, moveToDir, false, true);
67      }
68  
69      public void testNoMoveNoDeleteStreaming() throws Exception
70      {
71          File inFile = initForRequest();
72  
73          File moveToDir = configureConnector(inFile, true, false, false, null);
74  
75          assertRecevied(configureService(inFile, true, false));
76  
77          assertFiles(inFile, moveToDir, false, false);
78      }
79  
80      public void testMoveAndDelete() throws Exception
81      {
82          File inFile = initForRequest();
83  
84          File moveToDir = configureConnector(inFile, false, true, true, null);
85          assertRecevied(configureService(inFile, false, false));
86  
87          assertFiles(inFile, moveToDir, true, true);
88      }
89  
90      public void testMoveOnly() throws Exception
91      {
92          File inFile = initForRequest();
93  
94          File moveToDir = configureConnector(inFile, false, true, false, null);
95  
96          assertRecevied(configureService(inFile, false, false));
97  
98          assertFiles(inFile, moveToDir, true, false);
99      }
100 
101     public void testDeleteOnly() throws Exception
102     {
103         File inFile = initForRequest();
104 
105         File moveToDir = configureConnector(inFile, false, false, true, null);
106 
107         assertRecevied(configureService(inFile, false, false));
108 
109         assertFiles(inFile, moveToDir, false, true);
110     }
111 
112     public void testNoMoveNoDelete() throws Exception
113     {
114         File inFile = initForRequest();
115 
116         File moveToDir = configureConnector(inFile, false, false, false, null);
117 
118         assertRecevied(configureService(inFile, false, false));
119 
120         assertFiles(inFile, moveToDir, false, false);
121     }
122 
123     public void testMoveAndDeleteFilePayload() throws Exception
124     {
125         File inFile = initForRequest();
126 
127         File moveToDir = configureConnector(inFile, false, true, false, FileMessageAdapter.class);
128 
129         // TODO MULE-3198
130         // assertRecevied(configureService(inFile, false, true));
131         // assertFiles(inFile, moveToDir, true, true);
132     }
133 
134     public void testMoveOnlyFilePayload() throws Exception
135     {
136         File inFile = initForRequest();
137 
138         File moveToDir = configureConnector(inFile, false, true, false, FileMessageAdapter.class);
139 
140         // TODO MULE-3198
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, FileMessageAdapter.class);
150 
151         // TODO MULE-3198
152         // assertRecevied(configureService(inFile, false, true));
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, FileMessageAdapter.class);
161 
162         // TODO MULE-3198
163         // assertRecevied(configureService(inFile, false, true));
164 
165         assertFiles(inFile, moveToDir, false, false);
166     }
167 
168     protected Latch configureService(File inFile, boolean streaming, boolean filePayload) throws Exception
169     {
170 
171         Service s = new SedaService();
172         s.setName("moveDeleteBridgeService");
173         String url = fileToUrl(inFile.getParentFile()) + "?connector=moveDeleteConnector";
174         org.mule.api.transformer.Transformer transformer = null;
175         if (streaming)
176         {
177             if (filePayload)
178             {
179                 fail("Inconsistant test case: streaming and file payload are not compatible");
180             }
181             else
182             {
183                 transformer = new FileMessageAdaptorAssertingTransformer(FileMessageAdapter.class,
184                     ReceiverFileInputStream.class);
185             }
186         }
187         else
188         {
189             if (filePayload)
190             {
191                 transformer = new FileMessageAdaptorAssertingTransformer(FileMessageAdapter.class, File.class);
192             }
193             else
194             {
195                 transformer = new FileMessageAdaptorAssertingTransformer(FileContentsMessageAdapter.class, byte[].class);
196             }
197         }
198         EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder(new URIBuilder(url), muleContext);
199         endpointBuilder.addTransformer(transformer);
200         if (filePayload)
201         {
202             endpointBuilder.addTransformer(new NoActionTransformer());
203         }
204         endpointBuilder.setSynchronous(true);
205         s.getInboundRouter().addEndpoint(
206             muleContext.getRegistry().lookupEndpointFactory().getInboundEndpoint(endpointBuilder));
207         final Latch latch = new Latch();
208         FunctionalTestComponent component = new FunctionalTestComponent();
209         component.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 
219         component.initialise();
220         s.setComponent(new DefaultJavaComponent(new SingletonObjectFactory(component)));
221         s.setModel(muleContext.getRegistry().lookupSystemModel());
222         muleContext.getRegistry().registerService(s);
223         s.start();
224         return latch;
225     }
226 
227     protected void assertRecevied(Latch latch) throws Exception
228     {
229         assertTrue(latch != null && latch.await(2000, TimeUnit.MILLISECONDS));
230     }
231 
232     private class FileMessageAdaptorAssertingTransformer extends AbstractMessageAwareTransformer
233     {
234         private Class expectedMessageAdaptor;
235         private Class expectedPayload;
236 
237         public FileMessageAdaptorAssertingTransformer(Class expectedMessageAdaptor, Class expectedPayload)
238         {
239             this.expectedMessageAdaptor = expectedMessageAdaptor;
240             this.expectedPayload = expectedPayload;
241         }
242 
243         public Object transform(MuleMessage message, String outputEncoding) throws TransformerException
244         {
245             assertEquals(expectedMessageAdaptor, message.getAdapter().getClass());
246             assertEquals(expectedPayload, message.getAdapter().getPayload().getClass());
247 
248             // If we are streaming, copy/delete shouldn't have happened yet
249             if (expectedMessageAdaptor.equals(FileMessageAdapter.class))
250             {
251                 assertFilesUntouched(((FileMessageAdapter) message.getAdapter()).file);
252             }
253             return message;
254         }
255     }
256 
257 }