1 package org.apache.maven.plugin.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 junit.framework.Assert;
23 import junit.framework.TestCase;
24
25 import org.apache.maven.model.Model;
26 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
27 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
28 import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
29 import org.apache.maven.plugin.assembly.model.Assembly;
30 import org.apache.maven.plugin.assembly.model.FileItem;
31 import org.apache.maven.plugin.assembly.testutils.TestFileManager;
32 import org.apache.maven.plugin.assembly.utils.TypeConversionUtils;
33 import org.apache.maven.project.MavenProject;
34 import org.apache.maven.shared.utils.Os;
35 import org.codehaus.plexus.archiver.Archiver;
36 import org.codehaus.plexus.archiver.ArchiverException;
37 import org.codehaus.plexus.components.io.resources.PlexusIoResource;
38 import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
39 import org.codehaus.plexus.logging.Logger;
40 import org.codehaus.plexus.logging.console.ConsoleLogger;
41 import org.easymock.classextension.EasyMockSupport;
42
43 import java.io.File;
44 import java.io.IOException;
45
46 import static org.easymock.EasyMock.anyInt;
47 import static org.easymock.EasyMock.anyObject;
48 import static org.easymock.EasyMock.expect;
49
50 public class FileItemAssemblyPhaseTest
51 extends TestCase
52 {
53
54 private final TestFileManager fileManager = new TestFileManager( "file-item-phase.test.", "" );
55
56 @Override
57 public void tearDown()
58 throws IOException
59 {
60 fileManager.cleanUp();
61 }
62
63 public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
64 throws ArchiveCreationException, AssemblyFormattingException
65 {
66 final EasyMockSupport mm = new EasyMockSupport();
67
68 final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
69
70 final File basedir = fileManager.createTempDir();
71
72 macCS.expectGetBasedir( basedir );
73
74 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
75
76 final Assembly assembly = new Assembly();
77 assembly.setId( "test" );
78
79 mm.replayAll();
80
81 createPhase( macLogger.logger ).execute( assembly, null, macCS.configSource );
82
83 mm.verifyAll();
84 }
85
86 public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion()
87 throws ArchiveCreationException, AssemblyFormattingException, IOException
88 {
89 final EasyMockSupport mm = new EasyMockSupport();
90
91 final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
92
93 final File basedir = fileManager.createTempDir();
94
95 final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
96
97 macCS.expectGetBasedir( basedir );
98
99 macCS.expectGetProject( new MavenProject( new Model() ) );
100
101 macCS.expectGetFinalName( "final-name" );
102 macCS.expectInterpolators();
103
104 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
105
106 final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
107
108 final Assembly assembly = new Assembly();
109 assembly.setId( "test" );
110
111 final FileItem fi = new FileItem();
112 fi.setSource( file.getAbsolutePath() );
113 fi.setFiltered( false );
114 fi.setLineEnding( "keep" );
115 fi.setFileMode( "777" );
116
117 macArchiver.expectAddFile( file,
118 "file.txt",
119 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
120
121 assembly.addFile( fi );
122
123 mm.replayAll();
124
125 createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
126
127 mm.verifyAll();
128 }
129
130 public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
131 throws ArchiveCreationException, AssemblyFormattingException, IOException
132 {
133 final EasyMockSupport mm = new EasyMockSupport();
134
135 final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
136
137 final File basedir = fileManager.createTempDir();
138
139 final File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
140
141 macCS.expectGetBasedir( basedir );
142
143 macCS.expectGetProject( new MavenProject( new Model() ) );
144
145 macCS.expectGetFinalName( "final-name" );
146 macCS.expectInterpolators();
147
148 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
149
150 final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
151
152 final Assembly assembly = new Assembly();
153 assembly.setId( "test" );
154
155 final FileItem fi = new FileItem();
156 fi.setSource( "file.txt" );
157 fi.setFiltered( false );
158 fi.setLineEnding( "keep" );
159 fi.setFileMode( "777" );
160
161 macArchiver.expectAddFile( file,
162 "file.txt",
163 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
164
165 assembly.addFile( fi );
166
167 mm.replayAll();
168
169 createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
170
171 mm.verifyAll();
172 }
173
174 public void testExecute_WithOutputDirectory()
175 throws Exception
176 {
177 final EasyMockSupport mm = new EasyMockSupport();
178
179 final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
180
181 final File basedir = fileManager.createTempDir();
182
183 final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
184 final File licenseFile =
185 fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
186 final File configFile =
187 fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
188
189 macCS.expectGetBasedir( basedir );
190
191 macCS.expectGetProject( new MavenProject( new Model() ) );
192
193 macCS.expectGetFinalName( "final-name" );
194 macCS.expectInterpolators();
195
196 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
197 if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
198 {
199 macLogger.logger.error( "OS=Windows and the assembly descriptor contains a *nix-specific "
200 + "root-relative-reference (starting with slash) /" );
201 }
202 else
203 {
204 macLogger.logger.warn( (String)anyObject() );
205 }
206
207 final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
208
209 final Assembly assembly = new Assembly();
210 assembly.setId( "test" );
211 assembly.setIncludeBaseDirectory( true );
212
213 final FileItem readmeFileItem = new FileItem();
214 readmeFileItem.setSource( "README.txt" );
215 readmeFileItem.setOutputDirectory( "" );
216 readmeFileItem.setFiltered( false );
217 readmeFileItem.setLineEnding( "keep" );
218 readmeFileItem.setFileMode( "777" );
219
220 final FileItem licenseFileItem = new FileItem();
221 licenseFileItem.setSource( "LICENSE.txt" );
222 licenseFileItem.setOutputDirectory( "/" );
223 licenseFileItem.setFiltered( false );
224 licenseFileItem.setLineEnding( "keep" );
225 licenseFileItem.setFileMode( "777" );
226
227 final FileItem configFileItem = new FileItem();
228 configFileItem.setSource( "config/config.txt" );
229 configFileItem.setOutputDirectory( "config" );
230 configFileItem.setFiltered( false );
231 configFileItem.setLineEnding( "keep" );
232 configFileItem.setFileMode( "777" );
233
234 macArchiver.expectAddFile( readmeFile,
235 "README.txt",
236 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
237 macArchiver.expectAddFile( licenseFile,
238 "LICENSE.txt",
239 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
240 macArchiver.expectAddFile( configFile,
241 "config/config.txt",
242 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
243
244 assembly.addFile( readmeFileItem );
245 assembly.addFile( licenseFileItem );
246 assembly.addFile( configFileItem );
247
248 mm.replayAll();
249
250 createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
251
252 mm.verifyAll();
253 }
254
255 public void testExecute_WithOutputDirectoryAndDestName()
256 throws Exception
257 {
258 final EasyMockSupport mm = new EasyMockSupport();
259
260 final MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
261
262 final File basedir = fileManager.createTempDir();
263
264 final File readmeFile = fileManager.createFile( basedir, "README.txt", "This is a test file for README.txt." );
265 final File licenseFile =
266 fileManager.createFile( basedir, "LICENSE.txt", "This is a test file for LICENSE.txt." );
267 final File configFile =
268 fileManager.createFile( basedir, "config/config.txt", "This is a test file for config/config.txt" );
269
270 macCS.expectGetBasedir( basedir );
271
272 macCS.expectGetProject( new MavenProject( new Model() ) );
273
274 macCS.expectGetFinalName( "final-name" );
275 macCS.expectInterpolators();
276
277
278 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
279 if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
280 {
281 macLogger.logger.error( "OS=Windows and the assembly descriptor contains a *nix-specific "
282 + "root-relative-reference (starting with slash) /" );
283 }
284 else
285 {
286 macLogger.logger.warn( (String)anyObject() );
287 }
288
289 final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
290
291 final Assembly assembly = new Assembly();
292 assembly.setId( "test" );
293 assembly.setIncludeBaseDirectory( true );
294
295 final FileItem readmeFileItem = new FileItem();
296 readmeFileItem.setSource( "README.txt" );
297 readmeFileItem.setOutputDirectory( "" );
298 readmeFileItem.setDestName( "README_renamed.txt" );
299 readmeFileItem.setFiltered( false );
300 readmeFileItem.setLineEnding( "keep" );
301 readmeFileItem.setFileMode( "777" );
302
303 final FileItem licenseFileItem = new FileItem();
304 licenseFileItem.setSource( "LICENSE.txt" );
305 licenseFileItem.setOutputDirectory( "/" );
306 licenseFileItem.setDestName( "LICENSE_renamed.txt" );
307 licenseFileItem.setFiltered( false );
308 licenseFileItem.setLineEnding( "keep" );
309 licenseFileItem.setFileMode( "777" );
310
311 final FileItem configFileItem = new FileItem();
312 configFileItem.setSource( "config/config.txt" );
313 configFileItem.setDestName( "config_renamed.txt" );
314 configFileItem.setOutputDirectory( "config" );
315 configFileItem.setFiltered( false );
316 configFileItem.setLineEnding( "keep" );
317 configFileItem.setFileMode( "777" );
318
319 macArchiver.expectAddFile( readmeFile,
320 "README_renamed.txt",
321 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
322 macArchiver.expectAddFile( licenseFile,
323 "LICENSE_renamed.txt",
324 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
325 macArchiver.expectAddFile( configFile,
326 "config/config_renamed.txt",
327 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
328
329 assembly.addFile( readmeFileItem );
330 assembly.addFile( licenseFileItem );
331 assembly.addFile( configFileItem );
332
333 mm.replayAll();
334
335 createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
336
337 mm.verifyAll();
338 }
339
340 public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse()
341 throws Exception
342 {
343 final EasyMockSupport mm = new EasyMockSupport();
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 macCS.expectGetProject( new MavenProject( new Model() ) );
358
359 macCS.expectGetFinalName( "final-name" );
360 macCS.expectInterpolators();
361
362 final MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
363
364 final MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
365
366 final Assembly assembly = new Assembly();
367 assembly.setId( "test" );
368 assembly.setIncludeBaseDirectory( false );
369
370 final FileItem readmeFileItem = new FileItem();
371 readmeFileItem.setSource( "README.txt" );
372 readmeFileItem.setDestName( "README_renamed.txt" );
373 readmeFileItem.setFiltered( false );
374 readmeFileItem.setLineEnding( "keep" );
375 readmeFileItem.setFileMode( "777" );
376
377 final FileItem licenseFileItem = new FileItem();
378 licenseFileItem.setSource( "LICENSE.txt" );
379 licenseFileItem.setDestName( "LICENSE_renamed.txt" );
380 licenseFileItem.setFiltered( false );
381 licenseFileItem.setLineEnding( "keep" );
382 licenseFileItem.setFileMode( "777" );
383
384 final FileItem configFileItem = new FileItem();
385 configFileItem.setSource( "config/config.txt" );
386 configFileItem.setDestName( "config_renamed.txt" );
387 configFileItem.setOutputDirectory( "config" );
388 configFileItem.setFiltered( false );
389 configFileItem.setLineEnding( "keep" );
390 configFileItem.setFileMode( "777" );
391
392 macArchiver.expectAddFile( readmeFile,
393 "README_renamed.txt",
394 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
395 macArchiver.expectAddFile( licenseFile,
396 "LICENSE_renamed.txt",
397 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
398 macArchiver.expectAddFile( configFile,
399 "config/config_renamed.txt",
400 TypeConversionUtils.modeToInt( "777", new ConsoleLogger( Logger.LEVEL_DEBUG, "test" ) ) );
401
402 assembly.addFile( readmeFileItem );
403 assembly.addFile( licenseFileItem );
404 assembly.addFile( configFileItem );
405
406 mm.replayAll();
407
408 createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
409
410 mm.verifyAll();
411 }
412
413 private FileItemAssemblyPhase createPhase( final Logger logger )
414 {
415 final FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
416 phase.enableLogging( logger );
417
418 return phase;
419 }
420
421 private final class MockAndControlForArchiver
422 {
423 final Archiver archiver;
424
425 public MockAndControlForArchiver( final EasyMockSupport mockManager )
426 {
427 archiver = mockManager.createMock(Archiver.class);
428 }
429
430 public void expectAddFile( final File file, final String outputLocation, final int fileMode )
431 {
432 try
433 {
434 archiver.addResource( ( PlexusIoResource) anyObject(), (String) anyObject(), anyInt() );
435 }
436 catch ( final ArchiverException e )
437 {
438 Assert.fail( "Should never happen." );
439 }
440 }
441 }
442
443 private final class MockAndControlForConfigSource
444 {
445 final AssemblerConfigurationSource configSource;
446
447 public MockAndControlForConfigSource( final EasyMockSupport mockManager )
448 {
449
450 configSource = mockManager.createMock(AssemblerConfigurationSource.class);
451
452 expect(configSource.getMavenSession()).andReturn( null ).anyTimes();
453 }
454
455 public void expectGetProject( final MavenProject project )
456 {
457 expect(configSource.getProject()).andReturn( project ).atLeastOnce();
458 }
459
460 public void expectGetFinalName( final String finalName )
461 {
462 expect( configSource.getFinalName()).andReturn( finalName ).atLeastOnce();
463 }
464
465 public void expectInterpolators( )
466 {
467 expect(configSource.getCommandLinePropsInterpolator()).andReturn( FixedStringSearchInterpolator.empty() ).anyTimes();
468 expect(configSource.getEnvInterpolator()).andReturn( FixedStringSearchInterpolator.empty() ).anyTimes();
469 expect(configSource.getMainProjectInterpolator()).andReturn( FixedStringSearchInterpolator.empty() ).anyTimes();
470 }
471
472
473 public void expectGetTemporaryRootDirectory( final File tempRoot )
474 {
475 expect( configSource.getTemporaryRootDirectory()).andReturn( tempRoot ).atLeastOnce();
476 }
477
478 public void expectGetBasedir( final File basedir )
479 {
480 expect( configSource.getBasedir()).andReturn( basedir ).atLeastOnce();
481 }
482
483 public void expectGetEncoding( )
484 {
485 expect( configSource.getEncoding()).andReturn( "UTF-8").atLeastOnce();
486 }
487 }
488
489 private final class MockAndControlForLogger
490 {
491 final Logger logger;
492
493 public MockAndControlForLogger( final EasyMockSupport mockManager )
494 {
495
496 logger = mockManager.createMock (Logger.class);
497 }
498 }
499
500 }