View Javadoc
1   package org.apache.maven.plugins.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 static org.mockito.ArgumentMatchers.any;
23  import static org.mockito.ArgumentMatchers.eq;
24  import static org.mockito.Mockito.mock;
25  import static org.mockito.Mockito.verify;
26  import static org.mockito.Mockito.when;
27  
28  import java.io.File;
29  import java.nio.charset.StandardCharsets;
30  import java.nio.file.Files;
31  import java.util.Arrays;
32  
33  import org.apache.maven.model.Model;
34  import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
35  import org.apache.maven.plugins.assembly.model.Assembly;
36  import org.apache.maven.plugins.assembly.model.FileItem;
37  import org.apache.maven.plugins.assembly.utils.TypeConversionUtils;
38  import org.apache.maven.project.MavenProject;
39  import org.codehaus.plexus.archiver.Archiver;
40  import org.codehaus.plexus.components.io.resources.PlexusIoResource;
41  import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
42  import org.codehaus.plexus.logging.Logger;
43  import org.codehaus.plexus.logging.console.ConsoleLogger;
44  import org.junit.Rule;
45  import org.junit.Test;
46  import org.junit.rules.TemporaryFolder;
47  import org.junit.runner.RunWith;
48  import org.mockito.junit.MockitoJUnitRunner;
49  
50  @RunWith( MockitoJUnitRunner.class )
51  public class FileItemAssemblyPhaseTest
52  {
53      @Rule
54      public TemporaryFolder temporaryFolder = new TemporaryFolder();
55      
56      @Test
57      public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
58          throws Exception
59      {
60          final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
61  
62          final File basedir = temporaryFolder.getRoot();
63  
64          when( macCS.getBasedir()).thenReturn( basedir );
65  
66          final Logger macLogger = mock( Logger.class );
67  
68          final Assembly assembly = new Assembly();
69          assembly.setId( "test" );
70  
71          createPhase( macLogger ).execute( assembly, null, macCS );
72  
73          verify( macCS ).getBasedir();
74      }
75  
76      @Test
77      public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion()
78          throws Exception
79      {
80          final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
81  
82          final File basedir = temporaryFolder.getRoot();
83  
84          final File file = temporaryFolder.newFile( "file.txt" );
85          Files.write( file.toPath(), Arrays.asList( "This is a test file." ), StandardCharsets.UTF_8 );
86  
87          when( macCS.getBasedir() ).thenReturn( basedir );
88          when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
89          when( macCS.getFinalName() ) .thenReturn( "final-name" );
90          prepareInterpolators( macCS );
91  
92          final Logger macLogger = mock( Logger.class );
93  
94          final Archiver macArchiver = mock( Archiver.class );
95  
96          final Assembly assembly = new Assembly();
97          assembly.setId( "test" );
98  
99          final FileItem fi = new FileItem();
100         fi.setSource( file.getAbsolutePath() );
101         fi.setFiltered( false );
102         fi.setLineEnding( "keep" );
103         fi.setFileMode( "777" );
104 
105         assembly.addFile( fi );
106 
107         createPhase( macLogger ).execute( assembly, macArchiver, macCS );
108 
109         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
110                                            eq( "file.txt" ),
111                                            eq( TypeConversionUtils.modeToInt( "777",
112                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
113                                                                                                  "test" ) ) ) );
114     }
115 
116     @Test
117     public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
118         throws Exception
119     {
120         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
121 
122         final File basedir = temporaryFolder.getRoot();
123 
124         final File file = temporaryFolder.newFile( "file.txt" );
125         Files.write( file.toPath(), Arrays.asList( "This is a test file." ), StandardCharsets.UTF_8 );
126 
127         when( macCS.getBasedir() ).thenReturn( basedir );
128         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
129         when( macCS.getFinalName() ) .thenReturn( "final-name" );
130         prepareInterpolators( macCS );
131 
132         final Logger macLogger = mock( Logger.class );
133 
134         final Archiver macArchiver = mock( Archiver.class );
135 
136         final Assembly assembly = new Assembly();
137         assembly.setId( "test" );
138 
139         final FileItem fi = new FileItem();
140         fi.setSource( "file.txt" );
141         fi.setFiltered( false );
142         fi.setLineEnding( "keep" );
143         fi.setFileMode( "777" );
144 
145         assembly.addFile( fi );
146 
147         createPhase( macLogger ).execute( assembly, macArchiver, macCS );
148 
149         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
150                                            eq( "file.txt" ),
151                                            eq( TypeConversionUtils.modeToInt( "777",
152                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
153                                                                                                  "test" ) ) ) );
154     }
155 
156     @Test
157     public void testExecute_WithOutputDirectory()
158         throws Exception
159     {
160         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
161 
162         final File basedir = temporaryFolder.getRoot();
163 
164         final File readmeFile = temporaryFolder.newFile( "README.txt" );
165         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
166 
167         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
168         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
169 
170         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
171         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
172 
173         when( macCS.getBasedir() ).thenReturn( basedir );
174         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
175         when( macCS.getFinalName() ) .thenReturn( "final-name" );
176         prepareInterpolators( macCS );
177 
178         final Logger macLogger = mock( Logger.class );
179 
180         final Archiver macArchiver = mock( Archiver.class );
181 
182         final Assembly assembly = new Assembly();
183         assembly.setId( "test" );
184         assembly.setIncludeBaseDirectory( true );
185 
186         final FileItem readmeFileItem = new FileItem();
187         readmeFileItem.setSource( "README.txt" );
188         readmeFileItem.setOutputDirectory( "" );
189         readmeFileItem.setFiltered( false );
190         readmeFileItem.setLineEnding( "keep" );
191         readmeFileItem.setFileMode( "777" );
192 
193         final FileItem licenseFileItem = new FileItem();
194         licenseFileItem.setSource( "LICENSE.txt" );
195         licenseFileItem.setOutputDirectory( "/" );
196         licenseFileItem.setFiltered( false );
197         licenseFileItem.setLineEnding( "keep" );
198         licenseFileItem.setFileMode( "777" );
199 
200         final FileItem configFileItem = new FileItem();
201         configFileItem.setSource( "config/config.txt" );
202         configFileItem.setOutputDirectory( "config" );
203         configFileItem.setFiltered( false );
204         configFileItem.setLineEnding( "keep" );
205         configFileItem.setFileMode( "777" );
206 
207         assembly.addFile( readmeFileItem );
208         assembly.addFile( licenseFileItem );
209         assembly.addFile( configFileItem );
210 
211         createPhase( macLogger ).execute( assembly, macArchiver, macCS );
212 
213         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
214                                            eq( "README.txt" ),
215                                            eq( TypeConversionUtils.modeToInt( "777",
216                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
217                                                                                                  "test" ) ) ) );
218         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
219                                            eq( "LICENSE.txt" ),
220                                            eq( TypeConversionUtils.modeToInt( "777",
221                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
222                                                                                                  "test" ) ) ) );
223         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
224                                            eq( "config/config.txt" ),
225                                            eq( TypeConversionUtils.modeToInt( "777",
226                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
227                                                                                                  "test" ) ) ) );
228     
229     }
230 
231     @Test
232     public void testExecute_WithOutputDirectoryAndDestName()
233         throws Exception
234     {
235         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
236 
237         final File basedir = temporaryFolder.getRoot();
238 
239         final File readmeFile = temporaryFolder.newFile( "README.txt" );
240         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
241 
242         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
243         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
244 
245         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
246         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
247 
248         when( macCS.getBasedir() ).thenReturn( basedir );
249         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
250         when( macCS.getFinalName() ) .thenReturn( "final-name" );
251         prepareInterpolators( macCS );
252 
253         final Logger macLogger = mock( Logger.class );
254 
255         final Archiver macArchiver = mock( Archiver.class );
256 
257         final Assembly assembly = new Assembly();
258         assembly.setId( "test" );
259         assembly.setIncludeBaseDirectory( true );
260 
261         final FileItem readmeFileItem = new FileItem();
262         readmeFileItem.setSource( "README.txt" );
263         readmeFileItem.setOutputDirectory( "" );
264         readmeFileItem.setDestName( "README_renamed.txt" );
265         readmeFileItem.setFiltered( false );
266         readmeFileItem.setLineEnding( "keep" );
267         readmeFileItem.setFileMode( "777" );
268 
269         final FileItem licenseFileItem = new FileItem();
270         licenseFileItem.setSource( "LICENSE.txt" );
271         licenseFileItem.setOutputDirectory( "/" );
272         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
273         licenseFileItem.setFiltered( false );
274         licenseFileItem.setLineEnding( "keep" );
275         licenseFileItem.setFileMode( "777" );
276 
277         final FileItem configFileItem = new FileItem();
278         configFileItem.setSource( "config/config.txt" );
279         configFileItem.setDestName( "config_renamed.txt" );
280         configFileItem.setOutputDirectory( "config" );
281         configFileItem.setFiltered( false );
282         configFileItem.setLineEnding( "keep" );
283         configFileItem.setFileMode( "777" );
284 
285         assembly.addFile( readmeFileItem );
286         assembly.addFile( licenseFileItem );
287         assembly.addFile( configFileItem );
288 
289         createPhase( macLogger ).execute( assembly, macArchiver, macCS );
290 
291         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
292                                            eq( "README_renamed.txt" ),
293                                            eq( TypeConversionUtils.modeToInt( "777",
294                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
295                                                                                                  "test" ) ) ) );
296         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
297                                            eq( "LICENSE_renamed.txt" ),
298                                            eq( TypeConversionUtils.modeToInt( "777",
299                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
300                                                                                                  "test" ) ) ) );
301         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
302                                            eq( "config/config_renamed.txt" ),
303                                            eq( TypeConversionUtils.modeToInt( "777",
304                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
305                                                                                                  "test" ) ) ) );
306     }
307 
308     @Test
309     public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
310         throws Exception
311     {
312         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
313 
314         final File basedir = temporaryFolder.getRoot();
315 
316         final File readmeFile = temporaryFolder.newFile( "README.txt" );
317         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
318 
319         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
320         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
321 
322         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
323         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
324 
325         when( macCS.getBasedir() ).thenReturn( basedir );
326         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
327         when( macCS.getFinalName() ) .thenReturn( "final-name" );
328         prepareInterpolators( macCS );
329 
330         final Logger macLogger = mock( Logger.class );
331 
332         final Archiver macArchiver = mock( Archiver.class );
333 
334         final Assembly assembly = new Assembly();
335         assembly.setId( "test" );
336         assembly.setIncludeBaseDirectory( false );
337 
338         final FileItem readmeFileItem = new FileItem();
339         readmeFileItem.setSource( "README.txt" );
340         readmeFileItem.setDestName( "README_renamed.txt" );
341         readmeFileItem.setFiltered( false );
342         readmeFileItem.setLineEnding( "keep" );
343         readmeFileItem.setFileMode( "777" );
344 
345         final FileItem licenseFileItem = new FileItem();
346         licenseFileItem.setSource( "LICENSE.txt" );
347         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
348         licenseFileItem.setFiltered( false );
349         licenseFileItem.setLineEnding( "keep" );
350         licenseFileItem.setFileMode( "777" );
351 
352         final FileItem configFileItem = new FileItem();
353         configFileItem.setSource( "config/config.txt" );
354         configFileItem.setDestName( "config_renamed.txt" );
355         configFileItem.setOutputDirectory( "config" );
356         configFileItem.setFiltered( false );
357         configFileItem.setLineEnding( "keep" );
358         configFileItem.setFileMode( "777" );
359 
360         assembly.addFile( readmeFileItem );
361         assembly.addFile( licenseFileItem );
362         assembly.addFile( configFileItem );
363 
364         createPhase( macLogger ).execute( assembly, macArchiver, macCS );
365 
366         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
367                                            eq( "README_renamed.txt" ),
368                                            eq( TypeConversionUtils.modeToInt( "777",
369                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
370                                                                                                  "test" ) ) ) );
371         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
372                                            eq( "LICENSE_renamed.txt" ),
373                                            eq( TypeConversionUtils.modeToInt( "777",
374                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
375                                                                                                  "test" ) ) ) );
376         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
377                                            eq( "config/config_renamed.txt" ),
378                                            eq( TypeConversionUtils.modeToInt( "777",
379                                                                               new ConsoleLogger( Logger.LEVEL_DEBUG,
380                                                                                                  "test" ) ) ) );
381     }
382 
383     private FileItemAssemblyPhase createPhase( final Logger logger )
384     {
385         final FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
386         phase.enableLogging( logger );
387 
388         return phase;
389     }
390 
391     private void prepareInterpolators( AssemblerConfigurationSource configSource )
392     {
393         when( configSource.getCommandLinePropsInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
394         when( configSource.getEnvInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
395         when( configSource.getMainProjectInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
396     }
397 
398 }