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