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.junit.Rule;
43  import org.junit.Test;
44  import org.junit.rules.TemporaryFolder;
45  import org.junit.runner.RunWith;
46  import org.mockito.junit.MockitoJUnitRunner;
47  import org.slf4j.Logger;
48  import org.slf4j.LoggerFactory;
49  
50  @RunWith( MockitoJUnitRunner.class )
51  public class FileItemAssemblyPhaseTest
52  {
53      private final Logger logger = LoggerFactory.getLogger( getClass() );
54  
55      @Rule
56      public TemporaryFolder temporaryFolder = new TemporaryFolder();
57      
58      @Test
59      public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
60          throws Exception
61      {
62          final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
63  
64          final File basedir = temporaryFolder.getRoot();
65  
66          when( macCS.getBasedir()).thenReturn( basedir );
67  
68          final Assembly assembly = new Assembly();
69          assembly.setId( "test" );
70  
71          new FileItemAssemblyPhase().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 Archiver macArchiver = mock( Archiver.class );
93  
94          final Assembly assembly = new Assembly();
95          assembly.setId( "test" );
96  
97          final FileItem fi = new FileItem();
98          fi.setSource( file.getAbsolutePath() );
99          fi.setFiltered( false );
100         fi.setLineEnding( "keep" );
101         fi.setFileMode( "777" );
102 
103         assembly.addFile( fi );
104 
105         new FileItemAssemblyPhase().execute( assembly, macArchiver, macCS );
106 
107         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
108                                            eq( "file.txt" ),
109                                            eq( TypeConversionUtils.modeToInt( "777",
110                                                                               logger ) ) );
111     }
112 
113     @Test
114     public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
115         throws Exception
116     {
117         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
118 
119         final File basedir = temporaryFolder.getRoot();
120 
121         final File file = temporaryFolder.newFile( "file.txt" );
122         Files.write( file.toPath(), Arrays.asList( "This is a test file." ), StandardCharsets.UTF_8 );
123 
124         when( macCS.getBasedir() ).thenReturn( basedir );
125         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
126         when( macCS.getFinalName() ) .thenReturn( "final-name" );
127         prepareInterpolators( macCS );
128 
129         final Archiver macArchiver = mock( Archiver.class );
130 
131         final Assembly assembly = new Assembly();
132         assembly.setId( "test" );
133 
134         final FileItem fi = new FileItem();
135         fi.setSource( "file.txt" );
136         fi.setFiltered( false );
137         fi.setLineEnding( "keep" );
138         fi.setFileMode( "777" );
139 
140         assembly.addFile( fi );
141 
142         new FileItemAssemblyPhase().execute( assembly, macArchiver, macCS );
143 
144         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
145                                            eq( "file.txt" ),
146                                            eq( TypeConversionUtils.modeToInt( "777",
147                                                                               logger ) ) );
148     }
149 
150     @Test
151     public void testExecute_WithOutputDirectory()
152         throws Exception
153     {
154         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
155 
156         final File basedir = temporaryFolder.getRoot();
157 
158         final File readmeFile = temporaryFolder.newFile( "README.txt" );
159         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
160 
161         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
162         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
163 
164         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
165         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
166 
167         when( macCS.getBasedir() ).thenReturn( basedir );
168         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
169         when( macCS.getFinalName() ) .thenReturn( "final-name" );
170         prepareInterpolators( macCS );
171 
172         final Archiver macArchiver = mock( Archiver.class );
173 
174         final Assembly assembly = new Assembly();
175         assembly.setId( "test" );
176         assembly.setIncludeBaseDirectory( true );
177 
178         final FileItem readmeFileItem = new FileItem();
179         readmeFileItem.setSource( "README.txt" );
180         readmeFileItem.setOutputDirectory( "" );
181         readmeFileItem.setFiltered( false );
182         readmeFileItem.setLineEnding( "keep" );
183         readmeFileItem.setFileMode( "777" );
184 
185         final FileItem licenseFileItem = new FileItem();
186         licenseFileItem.setSource( "LICENSE.txt" );
187         licenseFileItem.setOutputDirectory( "/" );
188         licenseFileItem.setFiltered( false );
189         licenseFileItem.setLineEnding( "keep" );
190         licenseFileItem.setFileMode( "777" );
191 
192         final FileItem configFileItem = new FileItem();
193         configFileItem.setSource( "config/config.txt" );
194         configFileItem.setOutputDirectory( "config" );
195         configFileItem.setFiltered( false );
196         configFileItem.setLineEnding( "keep" );
197         configFileItem.setFileMode( "777" );
198 
199         assembly.addFile( readmeFileItem );
200         assembly.addFile( licenseFileItem );
201         assembly.addFile( configFileItem );
202 
203         new FileItemAssemblyPhase().execute( assembly, macArchiver, macCS );
204 
205         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
206                                            eq( "README.txt" ),
207                                            eq( TypeConversionUtils.modeToInt( "777",
208                                                                               logger ) ) );
209         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
210                                            eq( "LICENSE.txt" ),
211                                            eq( TypeConversionUtils.modeToInt( "777",
212                                                                               logger ) ) );
213         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
214                                            eq( "config/config.txt" ),
215                                            eq( TypeConversionUtils.modeToInt( "777",
216                                                                               logger ) ) );
217     
218     }
219 
220     @Test
221     public void testExecute_WithOutputDirectoryAndDestName()
222         throws Exception
223     {
224         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
225 
226         final File basedir = temporaryFolder.getRoot();
227 
228         final File readmeFile = temporaryFolder.newFile( "README.txt" );
229         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
230 
231         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
232         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
233 
234         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
235         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
236 
237         when( macCS.getBasedir() ).thenReturn( basedir );
238         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
239         when( macCS.getFinalName() ) .thenReturn( "final-name" );
240         prepareInterpolators( macCS );
241 
242         final Archiver macArchiver = mock( Archiver.class );
243 
244         final Assembly assembly = new Assembly();
245         assembly.setId( "test" );
246         assembly.setIncludeBaseDirectory( true );
247 
248         final FileItem readmeFileItem = new FileItem();
249         readmeFileItem.setSource( "README.txt" );
250         readmeFileItem.setOutputDirectory( "" );
251         readmeFileItem.setDestName( "README_renamed.txt" );
252         readmeFileItem.setFiltered( false );
253         readmeFileItem.setLineEnding( "keep" );
254         readmeFileItem.setFileMode( "777" );
255 
256         final FileItem licenseFileItem = new FileItem();
257         licenseFileItem.setSource( "LICENSE.txt" );
258         licenseFileItem.setOutputDirectory( "/" );
259         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
260         licenseFileItem.setFiltered( false );
261         licenseFileItem.setLineEnding( "keep" );
262         licenseFileItem.setFileMode( "777" );
263 
264         final FileItem configFileItem = new FileItem();
265         configFileItem.setSource( "config/config.txt" );
266         configFileItem.setDestName( "config_renamed.txt" );
267         configFileItem.setOutputDirectory( "config" );
268         configFileItem.setFiltered( false );
269         configFileItem.setLineEnding( "keep" );
270         configFileItem.setFileMode( "777" );
271 
272         assembly.addFile( readmeFileItem );
273         assembly.addFile( licenseFileItem );
274         assembly.addFile( configFileItem );
275 
276         new FileItemAssemblyPhase().execute( assembly, macArchiver, macCS );
277 
278         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
279                                            eq( "README_renamed.txt" ),
280                                            eq( TypeConversionUtils.modeToInt( "777",
281                                                                               logger ) ) );
282         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
283                                            eq( "LICENSE_renamed.txt" ),
284                                            eq( TypeConversionUtils.modeToInt( "777",
285                                                                               logger ) ) );
286         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
287                                            eq( "config/config_renamed.txt" ),
288                                            eq( TypeConversionUtils.modeToInt( "777",
289                                                                               logger ) ) );
290     }
291 
292     @Test
293     public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
294         throws Exception
295     {
296         final AssemblerConfigurationSource macCS = mock( AssemblerConfigurationSource.class );
297 
298         final File basedir = temporaryFolder.getRoot();
299 
300         final File readmeFile = temporaryFolder.newFile( "README.txt" );
301         Files.write( readmeFile.toPath(), Arrays.asList( "This is a test file for README.txt." ), StandardCharsets.UTF_8 );
302 
303         final File licenseFile = temporaryFolder.newFile( "LICENSE.txt" );
304         Files.write( licenseFile.toPath(), Arrays.asList( "This is a test file for LICENSE.txt." ), StandardCharsets.UTF_8 );
305 
306         final File configFile = new File( temporaryFolder.newFolder( "config" ), "config.txt" );
307         Files.write( configFile.toPath(), Arrays.asList( "This is a test file for config/config.txt" ), StandardCharsets.UTF_8 );
308 
309         when( macCS.getBasedir() ).thenReturn( basedir );
310         when( macCS.getProject() ).thenReturn( new MavenProject( new Model() ) );
311         when( macCS.getFinalName() ) .thenReturn( "final-name" );
312         prepareInterpolators( macCS );
313 
314         final Archiver macArchiver = mock( Archiver.class );
315 
316         final Assembly assembly = new Assembly();
317         assembly.setId( "test" );
318         assembly.setIncludeBaseDirectory( false );
319 
320         final FileItem readmeFileItem = new FileItem();
321         readmeFileItem.setSource( "README.txt" );
322         readmeFileItem.setDestName( "README_renamed.txt" );
323         readmeFileItem.setFiltered( false );
324         readmeFileItem.setLineEnding( "keep" );
325         readmeFileItem.setFileMode( "777" );
326 
327         final FileItem licenseFileItem = new FileItem();
328         licenseFileItem.setSource( "LICENSE.txt" );
329         licenseFileItem.setDestName( "LICENSE_renamed.txt" );
330         licenseFileItem.setFiltered( false );
331         licenseFileItem.setLineEnding( "keep" );
332         licenseFileItem.setFileMode( "777" );
333 
334         final FileItem configFileItem = new FileItem();
335         configFileItem.setSource( "config/config.txt" );
336         configFileItem.setDestName( "config_renamed.txt" );
337         configFileItem.setOutputDirectory( "config" );
338         configFileItem.setFiltered( false );
339         configFileItem.setLineEnding( "keep" );
340         configFileItem.setFileMode( "777" );
341 
342         assembly.addFile( readmeFileItem );
343         assembly.addFile( licenseFileItem );
344         assembly.addFile( configFileItem );
345 
346         new FileItemAssemblyPhase().execute( assembly, macArchiver, macCS );
347 
348         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
349                                            eq( "README_renamed.txt" ),
350                                            eq( TypeConversionUtils.modeToInt( "777",
351                                                                               logger ) ) );
352         verify( macArchiver ).addResource( any( PlexusIoResource.class ),
353                                            eq( "LICENSE_renamed.txt" ),
354                                            eq( TypeConversionUtils.modeToInt( "777",
355                                                                               logger ) ) );
356         verify( macArchiver ).addResource( any( PlexusIoResource.class ), 
357                                            eq( "config/config_renamed.txt" ),
358                                            eq( TypeConversionUtils.modeToInt( "777",
359                                                                               logger ) ) );
360     }
361 
362     private void prepareInterpolators( AssemblerConfigurationSource configSource )
363     {
364         when( configSource.getCommandLinePropsInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
365         when( configSource.getEnvInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
366         when( configSource.getMainProjectInterpolator() ).thenReturn( FixedStringSearchInterpolator.empty() );
367     }
368 
369 }