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.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 }