1   package org.apache.maven.plugin.assembly.archive.phase;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.model.Model;
23  import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
24  import org.apache.maven.plugin.assembly.DefaultAssemblyContext;
25  import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
26  import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
27  import org.apache.maven.plugin.assembly.model.Assembly;
28  import org.apache.maven.plugin.assembly.model.FileItem;
29  import org.apache.maven.plugin.assembly.testutils.MockManager;
30  import org.apache.maven.plugin.assembly.testutils.TestFileManager;
31  import org.apache.maven.plugin.assembly.utils.TypeConversionUtils;
32  import org.apache.maven.project.MavenProject;
33  import org.codehaus.plexus.archiver.Archiver;
34  import org.codehaus.plexus.archiver.ArchiverException;
35  import org.codehaus.plexus.logging.Logger;
36  import org.codehaus.plexus.logging.console.ConsoleLogger;
37  import org.easymock.MockControl;
38  
39  import java.io.File;
40  import java.io.IOException;
41  
42  import junit.framework.Assert;
43  import junit.framework.TestCase;
44  
45  public class FileItemAssemblyPhaseTest
46      extends TestCase
47  {
48  
49      private final TestFileManager fileManager = new TestFileManager( "file-item-phase.test.", "" );
50  
51      @Override
52      public void tearDown()
53          throws IOException
54      {
55          fileManager.cleanUp();
56      }
57  
58      public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
59          throws ArchiveCreationException, AssemblyFormattingException
60      {
61          final MockManager mm = new MockManager();
62  
63          final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
64  
65          final File basedir = fileManager.createTempDir();
66  
67          macCS.expectGetBasedir( basedir );
68  
69          final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
70  
71          final Assembly assembly = new Assembly();
72          assembly.setId( "test" );
73  
74          mm.replayAll();
75  
76          createPhase( macLogger.logger ).execute( assembly, null, macCS.configSource, new DefaultAssemblyContext() );
77  
78          mm.verifyAll();
79      }
80  
81      public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion()
82          throws ArchiveCreationException, AssemblyFormattingException, IOException
83      {
84          final MockManager mm = new MockManager();
85  
86          final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
87  
88          final File basedir = fileManager.createTempDir();
89  
90          final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
91  
92          macCS.expectGetBasedir( basedir );
93  
94          final File tempRoot = fileManager.createTempDir();
95  
96          macCS.expectGetTemporaryRootDirectory( tempRoot );
97  
98          macCS.expectGetProject( new MavenProject( new Model() ) );
99  
100         macCS.expectGetFinalName( "final-name" );
101 
102         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
103 
104         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
105 
106         final Assembly assembly = new Assembly();
107         assembly.setId( "test" );
108 
109         final FileItem fi = new FileItem();
110         fi.setSource( file.getAbsolutePath() );
111         fi.setFiltered( false );
112         fi.setLineEnding( "keep" );
113         fi.setFileMode( "777" );
114 
115         macArchiver.expectAddFile( file,
116                                    "file.txt",
117                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
118 
119         assembly.addFile( fi );
120 
121         mm.replayAll();
122 
123         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
124                                                  new DefaultAssemblyContext() );
125 
126         mm.verifyAll();
127     }
128 
129     public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
130         throws ArchiveCreationException, AssemblyFormattingException, IOException
131     {
132         final MockManager mm = new MockManager();
133 
134         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
135 
136         final File basedir = fileManager.createTempDir();
137 
138         final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
139 
140         macCS.expectGetBasedir( basedir );
141 
142         final File tempRoot = fileManager.createTempDir();
143 
144         macCS.expectGetTemporaryRootDirectory( tempRoot );
145 
146         macCS.expectGetProject( new MavenProject( new Model() ) );
147 
148         macCS.expectGetFinalName( "final-name" );
149 
150         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
151 
152         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
153 
154         final Assembly assembly = new Assembly();
155         assembly.setId( "test" );
156 
157         final FileItem fi = new FileItem();
158         fi.setSource( "file.txt" );
159         fi.setFiltered( false );
160         fi.setLineEnding( "keep" );
161         fi.setFileMode( "777" );
162 
163         macArchiver.expectAddFile( file,
164                                    "file.txt",
165                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
166 
167         assembly.addFile( fi );
168 
169         mm.replayAll();
170 
171         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
172                                                  new DefaultAssemblyContext() );
173 
174         mm.verifyAll();
175     }
176 
177     public void testExecute_WithOutputDirectory()
178         throws Exception
179     {
180         final MockManager mm = new MockManager();
181 
182         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
183 
184         final File basedir = fileManager.createTempDir();
185 
186         final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
187         final File licenseFile =
188             fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
189         final File configFile =
190             fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
191 
192         macCS.expectGetBasedir( basedir );
193 
194         final File tempRoot = fileManager.createTempDir();
195 
196         macCS.expectGetTemporaryRootDirectory( tempRoot );
197 
198         macCS.expectGetProject( new MavenProject( new Model() ) );
199 
200         macCS.expectGetFinalName( "final-name" );
201 
202         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
203 
204         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
205 
206         final Assembly assembly = new Assembly();
207         assembly.setId( "test" );
208         assembly.setIncludeBaseDirectory( true );
209 
210         final FileItem readmeFileItem = new FileItem();
211         readmeFileItem.setSource( "README.txt" );
212         readmeFileItem.setOutputDirectory( "" );
213         readmeFileItem.setFiltered( false );
214         readmeFileItem.setLineEnding( "keep" );
215         readmeFileItem.setFileMode( "777" );
216 
217         final FileItem licenseFileItem = new FileItem();
218         licenseFileItem.setSource( "LICENSE.txt" );
219         licenseFileItem.setOutputDirectory( "/" );
220         licenseFileItem.setFiltered( false );
221         licenseFileItem.setLineEnding( "keep" );
222         licenseFileItem.setFileMode( "777" );
223 
224         final FileItem configFileItem = new FileItem();
225         configFileItem.setSource( "config/config.txt" );
226         configFileItem.setOutputDirectory( "config" );
227         configFileItem.setFiltered( false );
228         configFileItem.setLineEnding( "keep" );
229         configFileItem.setFileMode( "777" );
230 
231         macArchiver.expectAddFile( readmeFile,
232                                    "README.txt",
233                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
234         macArchiver.expectAddFile( licenseFile,
235                                    "LICENSE.txt",
236                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
237         macArchiver.expectAddFile( configFile,
238                                    "config/config.txt",
239                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
240 
241         assembly.addFile( readmeFileItem );
242         assembly.addFile( licenseFileItem );
243         assembly.addFile( configFileItem );
244 
245         mm.replayAll();
246 
247         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
248                                                  new DefaultAssemblyContext() );
249 
250         mm.verifyAll();
251     }
252 
253     public void testExecute_WithOutputDirectoryAndDestName()
254         throws Exception
255     {
256         final MockManager mm = new MockManager();
257 
258         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
259 
260         final File basedir = fileManager.createTempDir();
261 
262         final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
263         final File licenseFile =
264             fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
265         final File configFile =
266             fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
267 
268         macCS.expectGetBasedir( basedir );
269 
270         final File tempRoot = fileManager.createTempDir();
271 
272         macCS.expectGetTemporaryRootDirectory( tempRoot );
273 
274         macCS.expectGetProject( new MavenProject( new Model() ) );
275 
276         macCS.expectGetFinalName( "final-name" );
277 
278         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
279 
280         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
281 
282         final Assembly assembly = new Assembly();
283         assembly.setId( "test" );
284         assembly.setIncludeBaseDirectory( true );
285 
286         final FileItem readmeFileItem = new FileItem();
287         readmeFileItem.setSource( "README.txt" );
288         readmeFileItem.setOutputDirectory( "" );
289         readmeFileItem.setDestName( "README_renamed.txt" );
290         readmeFileItem.setFiltered( false );
291         readmeFileItem.setLineEnding( "keep" );
292         readmeFileItem.setFileMode( "777" );
293 
294         final FileItem licenseFileItem = new FileItem();
295         licenseFileItem.setSource( "LICENSE.txt" );
296         licenseFileItem.setOutputDirectory( "/" );
297         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
298         licenseFileItem.setFiltered( false );
299         licenseFileItem.setLineEnding( "keep" );
300         licenseFileItem.setFileMode( "777" );
301 
302         final FileItem configFileItem = new FileItem();
303         configFileItem.setSource( "config/config.txt" );
304         configFileItem.setDestName( "config_renamed.txt" );
305         configFileItem.setOutputDirectory( "config" );
306         configFileItem.setFiltered( false );
307         configFileItem.setLineEnding( "keep" );
308         configFileItem.setFileMode( "777" );
309 
310         macArchiver.expectAddFile( readmeFile,
311                                    "README_renamed.txt",
312                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
313         macArchiver.expectAddFile( licenseFile,
314                                    "LICENSE_renamed.txt",
315                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
316         macArchiver.expectAddFile( configFile,
317                                    "config/config_renamed.txt",
318                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
319 
320         assembly.addFile( readmeFileItem );
321         assembly.addFile( licenseFileItem );
322         assembly.addFile( configFileItem );
323 
324         mm.replayAll();
325 
326         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
327                                                  new DefaultAssemblyContext() );
328 
329         mm.verifyAll();
330     }
331 
332     public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
333         throws Exception
334     {
335         final MockManager mm = new MockManager();
336 
337         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
338 
339         final File basedir = fileManager.createTempDir();
340 
341         final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
342         final File licenseFile =
343             fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
344         final File configFile =
345             fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
346 
347         macCS.expectGetBasedir( basedir );
348 
349         final File tempRoot = fileManager.createTempDir();
350 
351         macCS.expectGetTemporaryRootDirectory( tempRoot );
352 
353         macCS.expectGetProject( new MavenProject( new Model() ) );
354 
355         macCS.expectGetFinalName( "final-name" );
356 
357         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
358 
359         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
360 
361         final Assembly assembly = new Assembly();
362         assembly.setId( "test" );
363         assembly.setIncludeBaseDirectory( false );
364 
365         final FileItem readmeFileItem = new FileItem();
366         readmeFileItem.setSource( "README.txt" );
367         readmeFileItem.setDestName( "README_renamed.txt" );
368         readmeFileItem.setFiltered( false );
369         readmeFileItem.setLineEnding( "keep" );
370         readmeFileItem.setFileMode( "777" );
371 
372         final FileItem licenseFileItem = new FileItem();
373         licenseFileItem.setSource( "LICENSE.txt" );
374         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
375         licenseFileItem.setFiltered( false );
376         licenseFileItem.setLineEnding( "keep" );
377         licenseFileItem.setFileMode( "777" );
378 
379         final FileItem configFileItem = new FileItem();
380         configFileItem.setSource( "config/config.txt" );
381         configFileItem.setDestName( "config_renamed.txt" );
382         configFileItem.setOutputDirectory( "config" );
383         configFileItem.setFiltered( false );
384         configFileItem.setLineEnding( "keep" );
385         configFileItem.setFileMode( "777" );
386 
387         macArchiver.expectAddFile( readmeFile,
388                                    "README_renamed.txt",
389                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
390         macArchiver.expectAddFile( licenseFile,
391                                    "LICENSE_renamed.txt",
392                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
393         macArchiver.expectAddFile( configFile,
394                                    "config/config_renamed.txt",
395                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
396 
397         assembly.addFile( readmeFileItem );
398         assembly.addFile( licenseFileItem );
399         assembly.addFile( configFileItem );
400 
401         mm.replayAll();
402 
403         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
404                                                  new DefaultAssemblyContext() );
405 
406         mm.verifyAll();
407     }
408 
409     private FileItemAssemblyPhase createPhase( final Logger logger )
410     {
411         final FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
412         phase.enableLogging( logger );
413 
414         return phase;
415     }
416 
417     private final class MockAndControlForArchiver
418     {
419         Archiver archiver;
420 
421         MockControl control;
422 
423         public MockAndControlForArchiver( final MockManager mockManager )
424         {
425             control = MockControl.createControl( Archiver.class );
426             mockManager.add( control );
427 
428             archiver = (Archiver) control.getMock();
429         }
430 
431         public void expectAddFile( final File file, final String outputLocation, final int fileMode )
432         {
433             try
434             {
435                 archiver.addFile( file, outputLocation, fileMode );
436             }
437             catch ( final ArchiverException e )
438             {
439                 Assert.fail( "Should never happen." );
440             }
441         }
442     }
443 
444     private final class MockAndControlForConfigSource
445     {
446         AssemblerConfigurationSource configSource;
447 
448         MockControl control;
449 
450         public MockAndControlForConfigSource( final MockManager mockManager )
451         {
452             control = MockControl.createControl( AssemblerConfigurationSource.class );
453             mockManager.add( control );
454 
455             configSource = (AssemblerConfigurationSource) control.getMock();
456 
457             configSource.getMavenSession();
458             control.setReturnValue( null, MockControl.ZERO_OR_MORE );
459         }
460 
461         public void expectGetProject( final MavenProject project )
462         {
463             configSource.getProject();
464             control.setReturnValue( project, MockControl.ONE_OR_MORE );
465         }
466 
467         public void expectGetFinalName( final String finalName )
468         {
469             configSource.getFinalName();
470             control.setReturnValue( finalName, MockControl.ONE_OR_MORE );
471         }
472 
473         public void expectGetTemporaryRootDirectory( final File tempRoot )
474         {
475             configSource.getTemporaryRootDirectory();
476             control.setReturnValue( tempRoot, MockControl.ONE_OR_MORE );
477         }
478 
479         public void expectGetBasedir( final File basedir )
480         {
481             configSource.getBasedir();
482             control.setReturnValue( basedir, MockControl.ONE_OR_MORE );
483         }
484     }
485 
486     private final class MockAndControlForLogger
487     {
488         Logger logger;
489 
490         MockControl control;
491 
492         public MockAndControlForLogger( final MockManager mockManager )
493         {
494             control = MockControl.createControl( Logger.class );
495             mockManager.add( control );
496 
497             logger = (Logger) control.getMock();
498         }
499     }
500 
501 }