1 package org.apache.maven.plugins.assembly.archive;
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 org.apache.maven.artifact.repository.ArtifactRepository;
24 import org.apache.maven.model.Model;
25 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
26 import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
27 import org.apache.maven.plugins.assembly.archive.phase.AssemblyArchiverPhase;
28 import org.apache.maven.plugins.assembly.artifact.DependencyResolutionException;
29 import org.apache.maven.plugins.assembly.artifact.DependencyResolver;
30 import org.apache.maven.plugins.assembly.format.AssemblyFormattingException;
31 import org.apache.maven.plugins.assembly.model.Assembly;
32 import org.apache.maven.plugins.assembly.mojos.AbstractAssemblyMojo;
33 import org.apache.maven.plugins.assembly.testutils.TestFileManager;
34 import org.apache.maven.project.MavenProject;
35 import org.codehaus.plexus.DefaultPlexusContainer;
36 import org.codehaus.plexus.PlexusContainer;
37 import org.codehaus.plexus.PlexusContainerException;
38 import org.codehaus.plexus.archiver.Archiver;
39 import org.codehaus.plexus.archiver.ArchiverException;
40 import org.codehaus.plexus.archiver.diags.NoOpArchiver;
41 import org.codehaus.plexus.archiver.manager.ArchiverManager;
42 import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
43 import org.codehaus.plexus.archiver.tar.TarArchiver;
44 import org.codehaus.plexus.archiver.tar.TarLongFileMode;
45 import org.codehaus.plexus.archiver.war.WarArchiver;
46 import org.codehaus.plexus.archiver.zip.ZipArchiver;
47 import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
48 import org.codehaus.plexus.logging.Logger;
49 import org.codehaus.plexus.logging.console.ConsoleLogger;
50 import org.codehaus.plexus.util.FileUtils;
51 import org.easymock.classextension.EasyMockSupport;
52 import org.junit.AfterClass;
53 import org.junit.Before;
54 import org.junit.Test;
55
56 import java.io.File;
57 import java.io.IOException;
58 import java.util.ArrayList;
59 import java.util.Collections;
60 import java.util.List;
61
62 import static org.easymock.EasyMock.anyBoolean;
63 import static org.easymock.EasyMock.anyObject;
64 import static org.easymock.EasyMock.expect;
65 import static org.easymock.EasyMock.expectLastCall;
66 import static org.junit.Assert.assertEquals;
67 import static org.junit.Assert.assertFalse;
68 import static org.junit.Assert.assertNull;
69 import static org.junit.Assert.fail;
70
71 public class DefaultAssemblyArchiverTest
72 {
73
74 private static final TestFileManager fileManager = new TestFileManager( "def-assy-archiver.test.", "" );
75
76 private PlexusContainer container;
77
78 @AfterClass
79 public static void tearDown()
80 throws Exception
81 {
82 fileManager.cleanUp();
83 }
84
85 public static void setupInterpolators( AssemblerConfigurationSource configSource )
86 {
87 expect( configSource.getRepositoryInterpolator() ).andReturn(
88 FixedStringSearchInterpolator.create() ).anyTimes();
89 expect( configSource.getCommandLinePropsInterpolator() ).andReturn(
90 FixedStringSearchInterpolator.create() ).anyTimes();
91 expect( configSource.getEnvInterpolator() ).andReturn( FixedStringSearchInterpolator.create() ).anyTimes();
92 expect( configSource.getMainProjectInterpolator() ).andReturn(
93 FixedStringSearchInterpolator.create() ).anyTimes();
94
95 }
96
97 public static void setupInterpolators( AssemblerConfigurationSource configSource, MavenProject mavenProject )
98 {
99 expect( configSource.getRepositoryInterpolator() ).andReturn(
100 FixedStringSearchInterpolator.create() ).anyTimes();
101 expect( configSource.getCommandLinePropsInterpolator() ).andReturn(
102 FixedStringSearchInterpolator.create() ).anyTimes();
103 expect( configSource.getEnvInterpolator() ).andReturn( FixedStringSearchInterpolator.create() ).anyTimes();
104 expect( configSource.getMainProjectInterpolator() ).andReturn(
105 AbstractAssemblyMojo.mainProjectInterpolator( mavenProject ) ).anyTimes();
106
107 }
108
109 @Before
110 public void setup()
111 throws PlexusContainerException
112 {
113 container = new DefaultPlexusContainer();
114 }
115
116 @Test( expected = InvalidAssemblerConfigurationException.class )
117 public void failWhenAssemblyIdIsNull()
118 throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException
119 {
120 final EasyMockSupport mm = new EasyMockSupport();
121
122 final MockAndControlForAssemblyArchiver macMgr = new MockAndControlForAssemblyArchiver( mm );
123
124 final AssemblerConfigurationSource configSource =
125 mm.createControl().createMock( AssemblerConfigurationSource.class );
126
127 mm.replayAll();
128
129 final DefaultAssemblyArchiver archiver = createSubject( macMgr, null, null );
130 archiver.createArchive( new Assembly(), "full-name", "zip", configSource, false, null );
131
132 mm.verifyAll();
133 }
134
135 @Test
136 public void testCreateArchive()
137 throws ArchiveCreationException, AssemblyFormattingException, InvalidAssemblerConfigurationException,
138 IOException, DependencyResolutionException
139 {
140 final EasyMockSupport mm = new EasyMockSupport();
141
142 final MockAndControlForAssemblyArchiver macMgr = new MockAndControlForAssemblyArchiver( mm );
143
144 macMgr.expectGetArchiver( "zip", Archiver.class );
145 macMgr.expectGetDestFile( new File( "test" ) );
146
147 final AssemblyArchiverPhase phase = mm.createControl().createMock( AssemblyArchiverPhase.class );
148
149 phase.execute( (Assembly) anyObject(), (Archiver) anyObject(), (AssemblerConfigurationSource) anyObject() );
150
151 final AssemblerConfigurationSource configSource =
152 mm.createControl().createMock( AssemblerConfigurationSource.class );
153
154 final File tempDir = fileManager.createTempDir();
155 FileUtils.deleteDirectory( tempDir );
156
157 expect( configSource.getTemporaryRootDirectory() ).andReturn( tempDir ).anyTimes();
158 expect( configSource.isDryRun() ).andReturn( false ).anyTimes();
159 expect( configSource.isIgnoreDirFormatExtensions() ).andReturn( false ).anyTimes();
160
161 final File outDir = fileManager.createTempDir();
162
163 macMgr.archiver.setDestFile( new File( outDir, "full-name.zip" ) );
164
165 try
166 {
167 macMgr.archiver.createArchive();
168 }
169 catch ( final ArchiverException e )
170 {
171 fail( "Should never happen" );
172 }
173 catch ( final IOException e )
174 {
175 fail( "Should never happen" );
176 }
177
178 expect( configSource.getOutputDirectory() ).andReturn( outDir );
179 expect( configSource.getFinalName() ).andReturn( "finalName" );
180 expect( configSource.getArchiverConfig() ).andReturn( null ).anyTimes();
181 expect( configSource.getWorkingDirectory() ).andReturn( new File( "." ) ).anyTimes();
182 expect( configSource.isUpdateOnly() ).andReturn( false ).anyTimes();
183 expect( configSource.isIgnorePermissions() ).andReturn( false ).anyTimes();
184
185 final Assembly assembly = new Assembly();
186 assembly.setId( "id" );
187
188
189
190
191
192
193
194
195
196
197
198
199 mm.replayAll();
200
201 final DefaultAssemblyArchiver subject = createSubject( macMgr, Collections.singletonList( phase ), null );
202
203 subject.createArchive( assembly, "full-name", "zip", configSource, false, null );
204
205 mm.verifyAll();
206 }
207
208 @Test
209 public void testCreateArchiver_ShouldConfigureArchiver()
210 throws NoSuchArchiverException, ArchiverException
211 {
212 final EasyMockSupport mm = new EasyMockSupport();
213
214 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
215
216 final TestArchiverWithConfig archiver = new TestArchiverWithConfig();
217
218 macArchiverManager.expectGetArchiver( "dummy", archiver );
219
220 final AssemblerConfigurationSource configSource = mm.createMock( AssemblerConfigurationSource.class );
221
222 final String simpleConfig = "value";
223
224 expect( configSource.getArchiverConfig() ).andReturn(
225 "<configuration><simpleConfig>" + simpleConfig + "</simpleConfig></configuration>" ).anyTimes();
226
227 final MavenProject project = new MavenProject( new Model() );
228
229 expect( configSource.getProject() ).andReturn( project ).anyTimes();
230
231 expect( configSource.getMavenSession() ).andReturn( null ).anyTimes();
232
233 expect( configSource.isDryRun() ).andReturn( false ).anyTimes();
234
235 expect( configSource.getWorkingDirectory() ).andReturn( new File( "." ) ).anyTimes();
236
237 expect( configSource.isUpdateOnly() ).andReturn( false ).anyTimes();
238
239 final ArtifactRepository lr = mm.createMock( ArtifactRepository.class );
240
241 expect( lr.getBasedir() ).andReturn( "/path/to/local/repo" ).anyTimes();
242
243 expect( configSource.getLocalRepository() ).andReturn( lr ).anyTimes();
244 expect( configSource.isIgnorePermissions() ).andReturn( true );
245 setupInterpolators( configSource, project );
246
247 mm.replayAll();
248
249 final DefaultAssemblyArchiver subject =
250 createSubject( macArchiverManager, new ArrayList<AssemblyArchiverPhase>(), null );
251
252 subject.createArchiver( "dummy", false, "finalName", configSource, null, false, null );
253
254 assertEquals( simpleConfig, archiver.getSimpleConfig() );
255
256 mm.verifyAll();
257 }
258
259 @Test
260 public void testCreateArchiver_ShouldCreateTarArchiverWithNoCompression()
261 throws NoSuchArchiverException, ArchiverException
262 {
263 final EasyMockSupport mm = new EasyMockSupport();
264
265 final TestTarArchiver ttArchiver = new TestTarArchiver();
266
267 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
268
269 macArchiverManager.expectGetArchiver( "tar", ttArchiver );
270
271 final AssemblerConfigurationSource configSource = mm.createMock( AssemblerConfigurationSource.class );
272
273 expect( configSource.getTarLongFileMode() ).andReturn( TarLongFileMode.fail.toString() ).anyTimes();
274 expect( configSource.isDryRun() ).andReturn( false ).anyTimes();
275
276 expect( configSource.getArchiverConfig() ).andReturn( null ).anyTimes();
277
278 final DefaultAssemblyArchiver subject = setupStdExpectations( mm, macArchiverManager, configSource );
279
280 subject.createArchiver( "tar", false, "finalName", configSource, null, false, null );
281
282 assertNull( ttArchiver.compressionMethod );
283 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
284
285 mm.verifyAll();
286 }
287
288 private DefaultAssemblyArchiver setupStdExpectations( EasyMockSupport mm,
289 MockAndControlForAssemblyArchiver macArchiverManager,
290 AssemblerConfigurationSource configSource )
291 {
292 expect( configSource.getProject() ).andReturn( new MavenProject( new Model() ) ).anyTimes();
293
294 expect( configSource.getJarArchiveConfiguration() ).andReturn( null ).anyTimes();
295
296 expect( configSource.getWorkingDirectory() ).andReturn( new File( "." ) ).anyTimes();
297
298 expect( configSource.isUpdateOnly() ).andReturn( false ).anyTimes();
299
300 expect( configSource.isIgnorePermissions() ).andReturn( true ).anyTimes();
301
302 mm.replayAll();
303
304 return createSubject( macArchiverManager, new ArrayList<AssemblyArchiverPhase>(), null );
305 }
306
307 @Test
308 public void testCreateArchiver_ShouldCreateWarArchiverWithIgnoreWebxmlSetToFalse()
309 throws NoSuchArchiverException, ArchiverException
310 {
311 final EasyMockSupport mm = new EasyMockSupport();
312
313 final TestWarArchiver twArchiver = new TestWarArchiver();
314
315 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
316
317 macArchiverManager.expectGetArchiver( "war", twArchiver );
318
319 final AssemblerConfigurationSource configSource = mm.createMock( AssemblerConfigurationSource.class );
320
321 expect( configSource.isDryRun() ).andReturn( false ).anyTimes();
322 expect( configSource.getArchiverConfig() ).andReturn( null ).anyTimes();
323 expect( configSource.getMavenSession() ).andReturn( null ).anyTimes();
324 final DefaultAssemblyArchiver subject = setupStdExpectations( mm, macArchiverManager, configSource );
325
326 subject.createArchiver( "war", false, null, configSource, null, false, null );
327
328 assertFalse( twArchiver.ignoreWebxml );
329 }
330
331 @Test
332 public void testCreateArchiver_ShouldCreateZipArchiver()
333 throws NoSuchArchiverException, ArchiverException
334 {
335 final EasyMockSupport mm = new EasyMockSupport();
336
337 final ZipArchiver archiver = new ZipArchiver();
338
339 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
340
341 macArchiverManager.expectGetArchiver( "zip", archiver );
342
343 final AssemblerConfigurationSource configSource = mm.createMock( AssemblerConfigurationSource.class );
344
345 expect( configSource.isDryRun() ).andReturn( false ).anyTimes();
346 expect( configSource.getArchiverConfig() ).andReturn( null ).anyTimes();
347 expect( configSource.getWorkingDirectory() ).andReturn( new File( "." ) ).anyTimes();
348 expect( configSource.isUpdateOnly() ).andReturn( false ).anyTimes();
349 expect( configSource.getJarArchiveConfiguration() ).andReturn( null ).anyTimes();
350 expect( configSource.isIgnorePermissions() ).andReturn( true ).anyTimes();
351
352 mm.replayAll();
353
354 final DefaultAssemblyArchiver subject =
355 createSubject( macArchiverManager, new ArrayList<AssemblyArchiverPhase>(), null );
356
357 subject.createArchiver( "zip", false, null, configSource, null, false, null );
358 }
359
360 @Test
361 public void testCreateWarArchiver_ShouldDisableIgnoreWebxmlOption()
362 throws NoSuchArchiverException
363 {
364 final EasyMockSupport mm = new EasyMockSupport();
365
366 final TestWarArchiver twArchiver = new TestWarArchiver();
367
368 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
369
370 macArchiverManager.expectGetArchiver( "war", twArchiver );
371
372 mm.replayAll();
373
374 final DefaultAssemblyArchiver subject =
375 createSubject( macArchiverManager, new ArrayList<AssemblyArchiverPhase>(), null );
376
377 subject.createWarArchiver();
378
379 assertFalse( twArchiver.ignoreWebxml );
380 }
381
382 @Test
383 public void testCreateTarArchiver_ShouldNotInitializeCompression()
384 throws NoSuchArchiverException, ArchiverException
385 {
386 final EasyMockSupport mm = new EasyMockSupport();
387
388 final TestTarArchiver ttArchiver = new TestTarArchiver();
389
390 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
391
392 subject.createTarArchiver( "tar", TarLongFileMode.fail );
393
394 assertNull( ttArchiver.compressionMethod );
395 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
396
397 mm.verifyAll();
398 }
399
400 private DefaultAssemblyArchiver createSubject( EasyMockSupport mm, TestTarArchiver ttArchiver )
401 throws NoSuchArchiverException
402 {
403 final MockAndControlForAssemblyArchiver macArchiverManager = new MockAndControlForAssemblyArchiver( mm );
404
405 macArchiverManager.expectGetArchiver( "tar", ttArchiver );
406
407 mm.replayAll();
408
409 return createSubject( macArchiverManager, new ArrayList<AssemblyArchiverPhase>(), null );
410 }
411
412 @Test
413 public void testCreateTarArchiver_TarGzFormat_ShouldInitializeGZipCompression()
414 throws NoSuchArchiverException, ArchiverException
415 {
416 final EasyMockSupport mm = new EasyMockSupport();
417
418 final TestTarArchiver ttArchiver = new TestTarArchiver();
419
420 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
421
422 subject.createTarArchiver( "tar.gz", TarLongFileMode.fail );
423
424 assertEquals( TarArchiver.TarCompressionMethod.gzip, ttArchiver.compressionMethod );
425 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
426
427 mm.verifyAll();
428 }
429
430 @Test
431 public void testCreateTarArchiver_TgzFormat_ShouldInitializeGZipCompression()
432 throws NoSuchArchiverException, ArchiverException
433 {
434 final EasyMockSupport mm = new EasyMockSupport();
435
436 final TestTarArchiver ttArchiver = new TestTarArchiver();
437
438 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
439
440 subject.createTarArchiver( "tgz", TarLongFileMode.fail );
441
442 assertEquals( TarArchiver.TarCompressionMethod.gzip, ttArchiver.compressionMethod );
443 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
444
445 mm.verifyAll();
446 }
447
448 @Test
449 public void testCreateTarArchiver_TarBz2Format_ShouldInitializeBZipCompression()
450 throws NoSuchArchiverException, ArchiverException
451 {
452 final EasyMockSupport mm = new EasyMockSupport();
453
454 final TestTarArchiver ttArchiver = new TestTarArchiver();
455
456 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
457
458 subject.createTarArchiver( "tar.bz2", TarLongFileMode.fail );
459
460 assertEquals( TarArchiver.TarCompressionMethod.bzip2, ttArchiver.compressionMethod );
461 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
462
463 mm.verifyAll();
464 }
465
466 @Test
467 public void testCreateTarArchiver_Tbz2Format_ShouldInitializeBZipCompression()
468 throws NoSuchArchiverException, ArchiverException
469 {
470 final EasyMockSupport mm = new EasyMockSupport();
471
472 final TestTarArchiver ttArchiver = new TestTarArchiver();
473
474 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
475
476 subject.createTarArchiver( "tbz2", TarLongFileMode.fail );
477
478 assertEquals( TarArchiver.TarCompressionMethod.bzip2, ttArchiver.compressionMethod );
479 assertEquals( TarLongFileMode.fail, ttArchiver.longFileMode );
480
481 mm.verifyAll();
482 }
483
484 @Test
485 public void testCreateTarArchiver_InvalidFormat_ShouldFailWithInvalidCompression()
486 throws NoSuchArchiverException, ArchiverException
487 {
488 final EasyMockSupport mm = new EasyMockSupport();
489
490 final TestTarArchiver ttArchiver = new TestTarArchiver();
491
492 final DefaultAssemblyArchiver subject = createSubject( mm, ttArchiver );
493
494 try
495 {
496 subject.createTarArchiver( "tar.Z", null );
497
498 fail( "Invalid compression formats should throw an error." );
499 }
500 catch ( final IllegalArgumentException e )
501 {
502
503 }
504
505 mm.verifyAll();
506 }
507
508 private DefaultAssemblyArchiver createSubject( final MockAndControlForAssemblyArchiver macMgr,
509 final List<AssemblyArchiverPhase> phases, Logger logger )
510 {
511 final DefaultAssemblyArchiver subject = new DefaultAssemblyArchiver( macMgr.archiverManager, phases );
512
513 subject.setContainer( container );
514
515 if ( logger == null )
516 {
517 logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
518 }
519
520 subject.enableLogging( logger );
521
522 return subject;
523 }
524
525 private static final class TestTarArchiver
526 extends TarArchiver
527 {
528
529 TarCompressionMethod compressionMethod;
530
531 TarLongFileMode longFileMode;
532
533 @Override
534 protected void execute()
535 throws ArchiverException, IOException
536 {
537 super.createArchive();
538 }
539
540 @Override
541 public void setCompression( final TarCompressionMethod mode )
542 {
543 compressionMethod = mode;
544 super.setCompression( mode );
545 }
546
547 @Override
548 public void setLongfile( final TarLongFileMode mode )
549 {
550 longFileMode = mode;
551 super.setLongfile( mode );
552 }
553
554 }
555
556 private static final class TestWarArchiver
557 extends WarArchiver
558 {
559
560 boolean ignoreWebxml;
561
562 @Override
563 public void setIgnoreWebxml( final boolean ignore )
564 {
565 ignoreWebxml = ignore;
566 super.setIgnoreWebxml( ignore );
567 }
568
569 }
570
571 public static final class TestArchiverWithConfig
572 extends NoOpArchiver
573 {
574
575 private String simpleConfig;
576
577 public String getSimpleConfig()
578 {
579 return simpleConfig;
580 }
581
582
583 public String getDuplicateBehavior()
584 {
585 return Archiver.DUPLICATES_ADD;
586 }
587 }
588
589 private final class MockAndControlForAssemblyArchiver
590 {
591 final ArchiverManager archiverManager;
592
593 final DependencyResolver dependencyResolver;
594
595 private final EasyMockSupport mm;
596
597 Archiver archiver;
598
599 public MockAndControlForAssemblyArchiver( final EasyMockSupport mm )
600 {
601 this.mm = mm;
602 archiverManager = mm.createControl().createMock( ArchiverManager.class );
603
604 dependencyResolver = mm.createControl().createMock( DependencyResolver.class );
605
606 }
607
608 void expectGetDestFile( final File file )
609 {
610 expect( archiver.getDestFile() ).andReturn( file ).anyTimes();
611 }
612
613 void createArchiver( final Class<? extends Archiver> archiverClass )
614 {
615 archiver = mm.createControl().createMock( archiverClass );
616
617 archiver.setForced( anyBoolean() );
618 expectLastCall().anyTimes();
619
620 archiver.setIgnorePermissions( false );
621 expectLastCall().anyTimes();
622 }
623
624 void expectGetArchiver( final String format, final Class<? extends Archiver> archiverClass )
625 {
626 createArchiver( archiverClass );
627
628 try
629 {
630 expect( archiverManager.getArchiver( format ) ).andReturn( archiver );
631 }
632 catch ( final NoSuchArchiverException e )
633 {
634 Assert.fail( "should never happen" );
635 }
636
637 }
638
639 void expectGetArchiver( final String format, final Archiver archiver )
640 throws NoSuchArchiverException
641 {
642 expect( archiverManager.getArchiver( format ) ).andReturn( archiver );
643 }
644 }
645
646 }