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 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         macCS.expectGetEncoding();
122 
123         mm.replayAll();
124 
125         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
126                                                  new DefaultAssemblyContext() );
127 
128         mm.verifyAll();
129     }
130 
131     public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
132         throws ArchiveCreationException, AssemblyFormattingException, IOException
133     {
134         final MockManager mm = new MockManager();
135 
136         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
137 
138         final File basedir = fileManager.createTempDir();
139 
140         final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
141 
142         macCS.expectGetBasedir( basedir );
143 
144         final File tempRoot = fileManager.createTempDir();
145 
146         macCS.expectGetTemporaryRootDirectory( tempRoot );
147 
148         macCS.expectGetProject( new MavenProject( new Model() ) );
149 
150         macCS.expectGetFinalName( "final-name" );
151 
152         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
153 
154         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
155 
156         final Assembly assembly = new Assembly();
157         assembly.setId( "test" );
158 
159         final FileItem fi = new FileItem();
160         fi.setSource( "file.txt" );
161         fi.setFiltered( false );
162         fi.setLineEnding( "keep" );
163         fi.setFileMode( "777" );
164 
165         macArchiver.expectAddFile( file,
166                                    "file.txt",
167                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
168 
169         assembly.addFile( fi );
170 
171         macCS.expectGetEncoding();
172 
173         mm.replayAll();
174 
175         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
176                                                  new DefaultAssemblyContext() );
177 
178         mm.verifyAll();
179     }
180 
181     public void testExecute_WithOutputDirectory()
182         throws Exception
183     {
184         final MockManager mm = new MockManager();
185 
186         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
187 
188         final File basedir = fileManager.createTempDir();
189 
190         final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
191         final File licenseFile =
192             fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
193         final File configFile =
194             fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
195 
196         macCS.expectGetBasedir( basedir );
197 
198         final File tempRoot = fileManager.createTempDir();
199 
200         macCS.expectGetTemporaryRootDirectory( tempRoot );
201 
202         macCS.expectGetProject( new MavenProject( new Model() ) );
203 
204         macCS.expectGetFinalName( "final-name" );
205 
206         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
207 
208         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
209 
210         final Assembly assembly = new Assembly();
211         assembly.setId( "test" );
212         assembly.setIncludeBaseDirectory( true );
213 
214         final FileItem readmeFileItem = new FileItem();
215         readmeFileItem.setSource( "README.txt" );
216         readmeFileItem.setOutputDirectory( "" );
217         readmeFileItem.setFiltered( false );
218         readmeFileItem.setLineEnding( "keep" );
219         readmeFileItem.setFileMode( "777" );
220 
221         final FileItem licenseFileItem = new FileItem();
222         licenseFileItem.setSource( "LICENSE.txt" );
223         licenseFileItem.setOutputDirectory( "/" );
224         licenseFileItem.setFiltered( false );
225         licenseFileItem.setLineEnding( "keep" );
226         licenseFileItem.setFileMode( "777" );
227 
228         final FileItem configFileItem = new FileItem();
229         configFileItem.setSource( "config/config.txt" );
230         configFileItem.setOutputDirectory( "config" );
231         configFileItem.setFiltered( false );
232         configFileItem.setLineEnding( "keep" );
233         configFileItem.setFileMode( "777" );
234 
235         macArchiver.expectAddFile( readmeFile,
236                                    "README.txt",
237                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
238         macArchiver.expectAddFile( licenseFile,
239                                    "LICENSE.txt",
240                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
241         macArchiver.expectAddFile( configFile,
242                                    "config/config.txt",
243                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
244 
245         assembly.addFile( readmeFileItem );
246         assembly.addFile( licenseFileItem );
247         assembly.addFile( configFileItem );
248 
249         macCS.expectGetEncoding();
250 
251         mm.replayAll();
252 
253         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
254                                                  new DefaultAssemblyContext() );
255 
256         mm.verifyAll();
257     }
258 
259     public void testExecute_WithOutputDirectoryAndDestName()
260         throws Exception
261     {
262         final MockManager mm = new MockManager();
263 
264         final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
265 
266         final File basedir = fileManager.createTempDir();
267 
268         final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
269         final File licenseFile =
270             fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
271         final File configFile =
272             fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
273 
274         macCS.expectGetBasedir( basedir );
275 
276         final File tempRoot = fileManager.createTempDir();
277 
278         macCS.expectGetTemporaryRootDirectory( tempRoot );
279 
280         macCS.expectGetProject( new MavenProject( new Model() ) );
281 
282         macCS.expectGetFinalName( "final-name" );
283 
284         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
285 
286         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
287 
288         final Assembly assembly = new Assembly();
289         assembly.setId( "test" );
290         assembly.setIncludeBaseDirectory( true );
291 
292         final FileItem readmeFileItem = new FileItem();
293         readmeFileItem.setSource( "README.txt" );
294         readmeFileItem.setOutputDirectory( "" );
295         readmeFileItem.setDestName( "README_renamed.txt" );
296         readmeFileItem.setFiltered( false );
297         readmeFileItem.setLineEnding( "keep" );
298         readmeFileItem.setFileMode( "777" );
299 
300         final FileItem licenseFileItem = new FileItem();
301         licenseFileItem.setSource( "LICENSE.txt" );
302         licenseFileItem.setOutputDirectory( "/" );
303         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
304         licenseFileItem.setFiltered( false );
305         licenseFileItem.setLineEnding( "keep" );
306         licenseFileItem.setFileMode( "777" );
307 
308         final FileItem configFileItem = new FileItem();
309         configFileItem.setSource( "config/config.txt" );
310         configFileItem.setDestName( "config_renamed.txt" );
311         configFileItem.setOutputDirectory( "config" );
312         configFileItem.setFiltered( false );
313         configFileItem.setLineEnding( "keep" );
314         configFileItem.setFileMode( "777" );
315 
316         macArchiver.expectAddFile( readmeFile,
317                                    "README_renamed.txt",
318                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
319         macArchiver.expectAddFile( licenseFile,
320                                    "LICENSE_renamed.txt",
321                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
322         macArchiver.expectAddFile( configFile,
323                                    "config/config_renamed.txt",
324                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
325 
326         assembly.addFile( readmeFileItem );
327         assembly.addFile( licenseFileItem );
328         assembly.addFile( configFileItem );
329 
330         macCS.expectGetEncoding();
331 
332         mm.replayAll();
333 
334         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
335                                                  new DefaultAssemblyContext() );
336 
337         mm.verifyAll();
338     }
339 
340     public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
341         throws Exception
342     {
343         final MockManager mm = new MockManager();
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         final File tempRoot = fileManager.createTempDir();
358 
359         macCS.expectGetTemporaryRootDirectory( tempRoot );
360 
361         macCS.expectGetProject( new MavenProject( new Model() ) );
362 
363         macCS.expectGetFinalName( "final-name" );
364 
365         final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
366 
367         final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
368 
369         final Assembly assembly = new Assembly();
370         assembly.setId( "test" );
371         assembly.setIncludeBaseDirectory( false );
372 
373         final FileItem readmeFileItem = new FileItem();
374         readmeFileItem.setSource( "README.txt" );
375         readmeFileItem.setDestName( "README_renamed.txt" );
376         readmeFileItem.setFiltered( false );
377         readmeFileItem.setLineEnding( "keep" );
378         readmeFileItem.setFileMode( "777" );
379 
380         final FileItem licenseFileItem = new FileItem();
381         licenseFileItem.setSource( "LICENSE.txt" );
382         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
383         licenseFileItem.setFiltered( false );
384         licenseFileItem.setLineEnding( "keep" );
385         licenseFileItem.setFileMode( "777" );
386 
387         final FileItem configFileItem = new FileItem();
388         configFileItem.setSource( "config/config.txt" );
389         configFileItem.setDestName( "config_renamed.txt" );
390         configFileItem.setOutputDirectory( "config" );
391         configFileItem.setFiltered( false );
392         configFileItem.setLineEnding( "keep" );
393         configFileItem.setFileMode( "777" );
394 
395         macArchiver.expectAddFile( readmeFile,
396                                    "README_renamed.txt",
397                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
398         macArchiver.expectAddFile( licenseFile,
399                                    "LICENSE_renamed.txt",
400                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
401         macArchiver.expectAddFile( configFile,
402                                    "config/config_renamed.txt",
403                                    TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
404 
405         assembly.addFile( readmeFileItem );
406         assembly.addFile( licenseFileItem );
407         assembly.addFile( configFileItem );
408 
409         macCS.expectGetEncoding();
410 
411         mm.replayAll();
412 
413         createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource,
414                                                  new DefaultAssemblyContext() );
415 
416         mm.verifyAll();
417     }
418 
419     private FileItemAssemblyPhase createPhase( final Logger logger )
420     {
421         final FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
422         phase.enableLogging( logger );
423 
424         return phase;
425     }
426 
427     private final class MockAndControlForArchiver
428     {
429         Archiver archiver;
430 
431         MockControl control;
432 
433         public MockAndControlForArchiver( final MockManager mockManager )
434         {
435             control = MockControl.createControl( Archiver.class );
436             mockManager.add( control );
437 
438             archiver = (Archiver) control.getMock();
439         }
440 
441         public void expectAddFile( final File file, final String outputLocation, final int fileMode )
442         {
443             try
444             {
445                 archiver.addFile( file, outputLocation, fileMode );
446             }
447             catch ( final ArchiverException e )
448             {
449                 Assert.fail( "Should never happen." );
450             }
451         }
452     }
453 
454     private final class MockAndControlForConfigSource
455     {
456         AssemblerConfigurationSource configSource;
457 
458         MockControl control;
459 
460         public MockAndControlForConfigSource( final MockManager mockManager )
461         {
462             control = MockControl.createControl( AssemblerConfigurationSource.class );
463             mockManager.add( control );
464 
465             configSource = (AssemblerConfigurationSource) control.getMock();
466 
467             configSource.getMavenSession();
468             control.setReturnValue( null, MockControl.ZERO_OR_MORE );
469         }
470 
471         public void expectGetProject( final MavenProject project )
472         {
473             configSource.getProject();
474             control.setReturnValue( project, MockControl.ONE_OR_MORE );
475         }
476 
477         public void expectGetFinalName( final String finalName )
478         {
479             configSource.getFinalName();
480             control.setReturnValue( finalName, MockControl.ONE_OR_MORE );
481         }
482 
483         public void expectGetTemporaryRootDirectory( final File tempRoot )
484         {
485             configSource.getTemporaryRootDirectory();
486             control.setReturnValue( tempRoot, MockControl.ONE_OR_MORE );
487         }
488 
489         public void expectGetBasedir( final File basedir )
490         {
491             configSource.getBasedir();
492             control.setReturnValue( basedir, MockControl.ONE_OR_MORE );
493         }
494 
495         public void expectGetEncoding( )
496         {
497             configSource.getEncoding();
498             control.setReturnValue( "UTF-8", MockControl.ONE_OR_MORE );
499         }
500 }
501 
502     private final class MockAndControlForLogger
503     {
504         Logger logger;
505 
506         MockControl control;
507 
508         public MockAndControlForLogger( final MockManager mockManager )
509         {
510             control = MockControl.createControl( Logger.class );
511             mockManager.add( control );
512 
513             logger = (Logger) control.getMock();
514         }
515     }
516 
517 }