1 package org.apache.maven.plugins.assembly.archive.phase;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 }