1   package org.apache.maven.plugin.assembly.io;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import junit.framework.TestCase;
23  import org.apache.maven.artifact.Artifact;
24  import org.apache.maven.artifact.repository.ArtifactRepository;
25  import org.apache.maven.model.Model;
26  import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
27  import org.apache.maven.plugin.assembly.InvalidAssemblerConfigurationException;
28  import org.apache.maven.plugin.assembly.archive.DefaultAssemblyArchiverTest;
29  import org.apache.maven.plugin.assembly.interpolation.AssemblyInterpolator;
30  import org.apache.maven.plugin.assembly.model.Assembly;
31  import org.apache.maven.plugin.assembly.model.Component;
32  import org.apache.maven.plugin.assembly.model.ContainerDescriptorHandlerConfig;
33  import org.apache.maven.plugin.assembly.model.DependencySet;
34  import org.apache.maven.plugin.assembly.model.FileItem;
35  import org.apache.maven.plugin.assembly.model.FileSet;
36  import org.apache.maven.plugin.assembly.model.Repository;
37  import org.apache.maven.plugin.assembly.model.io.xpp3.AssemblyXpp3Writer;
38  import org.apache.maven.plugin.assembly.model.io.xpp3.ComponentXpp3Reader;
39  import org.apache.maven.plugin.assembly.model.io.xpp3.ComponentXpp3Writer;
40  import org.apache.maven.plugin.assembly.testutils.TestFileManager;
41  import org.apache.maven.project.MavenProject;
42  import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
43  import org.codehaus.plexus.interpolation.fixed.InterpolationState;
44  import org.codehaus.plexus.logging.Logger;
45  import org.codehaus.plexus.logging.console.ConsoleLogger;
46  import org.codehaus.plexus.util.IOUtil;
47  import org.easymock.classextension.EasyMockSupport;
48  
49  import java.io.File;
50  import java.io.FileOutputStream;
51  import java.io.IOException;
52  import java.io.OutputStreamWriter;
53  import java.io.StringReader;
54  import java.io.StringWriter;
55  import java.io.Writer;
56  import java.util.ArrayList;
57  import java.util.Collections;
58  import java.util.Iterator;
59  import java.util.List;
60  
61  import static org.easymock.EasyMock.expect;
62  
63  @SuppressWarnings("ResultOfMethodCallIgnored")
64  public class DefaultAssemblyReaderTest
65      extends TestCase
66  {
67  
68      private TestFileManager fileManager;
69  
70      private EasyMockSupport mockManager;
71  
72  
73      private AssemblerConfigurationSource configSource;
74  
75  
76      @Override
77      public void setUp()
78      {
79          fileManager = new TestFileManager( "assembly-reader.test.", ".xml" );
80          mockManager = new EasyMockSupport();
81  
82          configSource = mockManager.createMock(AssemblerConfigurationSource.class);
83  
84          ArtifactRepository localRepo = mockManager.createMock( ArtifactRepository.class );
85  
86          expect( localRepo.getBasedir()).andReturn("/path/to/local/repo").anyTimes();
87          expect(configSource.getLocalRepository()).andReturn( localRepo ).anyTimes();
88          expect( configSource.getRemoteRepositories()).andReturn( Collections.<ArtifactRepository>emptyList()).anyTimes();
89          expect(configSource.getMavenSession()).andReturn( null).anyTimes();
90      }
91  
92      @Override
93      public void tearDown()
94          throws IOException
95      {
96          fileManager.cleanUp();
97      }
98  
99      public void testIncludeSiteInAssembly_ShouldFailIfSiteDirectoryNonExistent()
100         throws IOException
101     {
102         final File siteDir = File.createTempFile( "assembly-reader.", ".test" );
103         siteDir.delete();
104 
105         expect( configSource.getSiteDirectory()).andReturn( siteDir ).anyTimes();
106 
107         final Assembly assembly = new Assembly();
108 
109         mockManager.replayAll();
110 
111         try
112         {
113             new DefaultAssemblyReader().includeSiteInAssembly( assembly, configSource );
114 
115             fail( "Should fail when site directory is non-existent." );
116         }
117         catch ( final InvalidAssemblerConfigurationException e )
118         {
119             
120         }
121 
122         mockManager.verifyAll();
123     }
124 
125     public void testIncludeSiteInAssembly_ShouldAddSiteDirFileSetWhenDirExists()
126         throws IOException, InvalidAssemblerConfigurationException
127     {
128         final File siteDir = fileManager.createTempDir();
129 
130         expect( configSource.getSiteDirectory()).andReturn( siteDir ).anyTimes();
131 
132         final Assembly assembly = new Assembly();
133 
134         mockManager.replayAll();
135 
136         new DefaultAssemblyReader().includeSiteInAssembly( assembly, configSource );
137 
138         final List<FileSet> fileSets = assembly.getFileSets();
139 
140         assertNotNull( fileSets );
141         assertEquals( 1, fileSets.size() );
142 
143         final FileSet fs = fileSets.get( 0 );
144 
145         assertEquals( siteDir.getPath(), fs.getDirectory() );
146 
147         mockManager.verifyAll();
148     }
149 
150     
151     
152     
153     
154     
155     
156     
157     
158     
159     
160     
161     
162     
163     
164     
165     
166     
167     
168     
169     
170     
171     
172     
173     
174     
175     
176     
177     
178     
179     
180     
181     
182     
183     
184     
185     
186     
187     
188     
189     
190     
191     
192     
193     
194     
195     
196     
197     
198     
199     
200     
201     
202     
203     
204     
205     
206     
207     
208     
209     
210     
211     
212     
213     
214     
215     
216     
217     
218     
219     
220     
221     
222     
223     
224     
225     
226 
227     public void testMergeComponentWithAssembly_ShouldAddOneFileSetToExistingListOfTwo()
228     {
229         final Assembly assembly = new Assembly();
230 
231         FileSet fs = new FileSet();
232         fs.setDirectory( "/dir" );
233 
234         assembly.addFileSet( fs );
235 
236         fs = new FileSet();
237         fs.setDirectory( "/other-dir" );
238         assembly.addFileSet( fs );
239 
240         fs = new FileSet();
241         fs.setDirectory( "/third-dir" );
242 
243         final Component component = new Component();
244 
245         component.addFileSet( fs );
246 
247         new DefaultAssemblyReader().mergeComponentWithAssembly( component, assembly );
248 
249         final List<FileSet> fileSets = assembly.getFileSets();
250 
251         assertNotNull( fileSets );
252         assertEquals( 3, fileSets.size() );
253 
254         final FileSet rfs1 = fileSets.get( 0 );
255         assertEquals( "/dir", rfs1.getDirectory() );
256 
257         final FileSet rfs2 = fileSets.get( 1 );
258         assertEquals( "/other-dir", rfs2.getDirectory() );
259 
260         final FileSet rfs3 = fileSets.get( 2 );
261         assertEquals( "/third-dir", rfs3.getDirectory() );
262 
263     }
264 
265     public void testMergeComponentWithAssembly_ShouldAddOneFileItemToExistingListOfTwo()
266     {
267         final Assembly assembly = new Assembly();
268 
269         FileItem fi = new FileItem();
270         fi.setSource( "file" );
271 
272         assembly.addFile( fi );
273 
274         fi = new FileItem();
275         fi.setSource( "file2" );
276 
277         assembly.addFile( fi );
278 
279         fi = new FileItem();
280         fi.setSource( "file3" );
281 
282         final Component component = new Component();
283 
284         component.addFile( fi );
285 
286         new DefaultAssemblyReader().mergeComponentWithAssembly( component, assembly );
287 
288         final List<FileItem> fileItems = assembly.getFiles();
289 
290         assertNotNull( fileItems );
291         assertEquals( 3, fileItems.size() );
292 
293         final FileItem rf1 = fileItems.get( 0 );
294         assertEquals( "file", rf1.getSource() );
295 
296         final FileItem rf2 = fileItems.get( 1 );
297         assertEquals( "file2", rf2.getSource() );
298 
299         final FileItem rf3 = fileItems.get( 2 );
300         assertEquals( "file3", rf3.getSource() );
301 
302     }
303 
304     public void testMergeComponentWithAssembly_ShouldAddOneDependencySetToExistingListOfTwo()
305     {
306         final Assembly assembly = new Assembly();
307 
308         DependencySet ds = new DependencySet();
309         ds.setScope( Artifact.SCOPE_RUNTIME );
310 
311         assembly.addDependencySet( ds );
312 
313         ds = new DependencySet();
314         ds.setScope( Artifact.SCOPE_COMPILE );
315 
316         assembly.addDependencySet( ds );
317 
318         final Component component = new Component();
319 
320         ds = new DependencySet();
321         ds.setScope( Artifact.SCOPE_SYSTEM );
322 
323         component.addDependencySet( ds );
324 
325         new DefaultAssemblyReader().mergeComponentWithAssembly( component, assembly );
326 
327         final List<DependencySet> depSets = assembly.getDependencySets();
328 
329         assertNotNull( depSets );
330         assertEquals( 3, depSets.size() );
331 
332         assertEquals( Artifact.SCOPE_RUNTIME, depSets.get( 0 )
333                                                      .getScope() );
334         assertEquals( Artifact.SCOPE_COMPILE, depSets.get( 1 )
335                                                      .getScope() );
336         assertEquals( Artifact.SCOPE_SYSTEM, depSets.get( 2 )
337                                                     .getScope() );
338     }
339 
340     public void testMergeComponentWithAssembly_ShouldAddOneRepositoryToExistingListOfTwo()
341     {
342         final Assembly assembly = new Assembly();
343 
344         Repository repo = new Repository();
345         repo.setScope( Artifact.SCOPE_RUNTIME );
346 
347         assembly.addRepository( repo );
348 
349         repo = new Repository();
350         repo.setScope( Artifact.SCOPE_COMPILE );
351 
352         assembly.addRepository( repo );
353 
354         final Component component = new Component();
355 
356         repo = new Repository();
357         repo.setScope( Artifact.SCOPE_SYSTEM );
358 
359         component.addRepository( repo );
360 
361         new DefaultAssemblyReader().mergeComponentWithAssembly( component, assembly );
362 
363         final List<Repository> depSets = assembly.getRepositories();
364 
365         assertNotNull( depSets );
366         assertEquals( 3, depSets.size() );
367 
368         assertEquals( Artifact.SCOPE_RUNTIME, depSets.get( 0 )
369                                                      .getScope() );
370         assertEquals( Artifact.SCOPE_COMPILE, depSets.get( 1 )
371                                                      .getScope() );
372         assertEquals( Artifact.SCOPE_SYSTEM, depSets.get( 2 )
373                                                     .getScope() );
374     }
375 
376     public void testMergeComponentWithAssembly_ShouldAddOneContainerDescriptorHandlerToExistingListOfTwo()
377     {
378         final Assembly assembly = new Assembly();
379 
380         ContainerDescriptorHandlerConfig cfg = new ContainerDescriptorHandlerConfig();
381         cfg.setHandlerName( "one" );
382 
383         assembly.addContainerDescriptorHandler( cfg );
384 
385         cfg = new ContainerDescriptorHandlerConfig();
386         cfg.setHandlerName( "two" );
387 
388         assembly.addContainerDescriptorHandler( cfg );
389 
390         final Component component = new Component();
391 
392         cfg = new ContainerDescriptorHandlerConfig();
393         cfg.setHandlerName( "three" );
394 
395         component.addContainerDescriptorHandler( cfg );
396 
397         new DefaultAssemblyReader().mergeComponentWithAssembly( component, assembly );
398 
399         final List<ContainerDescriptorHandlerConfig> result = assembly.getContainerDescriptorHandlers();
400 
401         assertNotNull( result );
402         assertEquals( 3, result.size() );
403 
404         final Iterator<ContainerDescriptorHandlerConfig> it = result.iterator();
405         assertEquals( "one", it.next()
406                                .getHandlerName() );
407         assertEquals( "two", it.next()
408                                .getHandlerName() );
409         assertEquals( "three", it.next()
410                                  .getHandlerName() );
411     }
412 
413     
414     
415     
416     
417     
418     
419     
420     
421     
422     
423     
424     
425     
426     
427     
428     
429     
430     
431     
432     
433     
434     
435     
436     
437     
438     
439     
440     
441     
442     
443     
444     
445     
446     
447     
448     
449     
450     
451     
452     
453     
454     
455     
456     
457     
458     
459 
460     public void testMergeComponentsWithMainAssembly_ShouldAddOneFileSetToAssembly()
461         throws IOException, AssemblyReadException
462     {
463         final Component component = new Component();
464 
465         final FileSet fileSet = new FileSet();
466         fileSet.setDirectory( "/dir" );
467 
468         component.addFileSet( fileSet );
469 
470         final File componentFile = fileManager.createTempFile();
471 
472         Writer writer = null;
473 
474         try
475         {
476             writer = new OutputStreamWriter( new FileOutputStream( componentFile ), "UTF-8" );
477 
478             final ComponentXpp3Writer componentWriter = new ComponentXpp3Writer();
479 
480             componentWriter.write( writer, component );
481             writer.flush();
482         }
483         finally
484         {
485             IOUtil.close( writer );
486         }
487 
488         final String filename = componentFile.getName();
489 
490         final Assembly assembly = new Assembly();
491         assembly.addComponentDescriptor( filename );
492 
493         final File basedir = componentFile.getParentFile();
494 
495 
496         final MavenProject project = new MavenProject();
497 
498         expect( configSource.getProject()).andReturn( project ).anyTimes();
499         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
500         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
501         InterpolationState is = new InterpolationState();
502         ComponentXpp3Reader.ContentTransformer componentIp = AssemblyInterpolator.componentInterpolator(
503             FixedStringSearchInterpolator.create(), is, new ConsoleLogger( Logger.LEVEL_DEBUG, "console" ) );
504 
505 
506         mockManager.replayAll();
507 
508         new DefaultAssemblyReader().mergeComponentsWithMainAssembly( assembly, null, configSource, componentIp );
509 
510         final List<FileSet> fileSets = assembly.getFileSets();
511 
512         assertNotNull( fileSets );
513         assertEquals( 1, fileSets.size() );
514 
515         final FileSet fs = fileSets.get( 0 );
516 
517         assertEquals( "/dir", fs.getDirectory() );
518 
519         mockManager.verifyAll();
520     }
521 
522     public void testReadAssembly_ShouldReadAssemblyWithoutComponentsInterpolationOrSiteDirInclusion()
523         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
524     {
525         final Assembly assembly = new Assembly();
526         assembly.setId( "test" );
527 
528         final StringReader sr = writeToStringReader( assembly );
529 
530         final File basedir = fileManager.createTempDir();
531 
532         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
533 
534         final Model model = new Model();
535         model.setGroupId( "group" );
536         model.setArtifactId( "artifact" );
537         model.setVersion( "version" );
538 
539         final MavenProject project = new MavenProject( model );
540 
541         expect( configSource.getProject()).andReturn( project ).anyTimes();
542 
543         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
544         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
545 
546         mockManager.replayAll();
547 
548         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
549 
550         assertEquals( assembly.getId(), result.getId() );
551 
552         mockManager.verifyAll();
553     }
554 
555     public void testReadAssembly_ShouldReadAssemblyWithSiteDirInclusionFromAssemblyWithoutComponentsOrInterpolation()
556         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
557     {
558         final Assembly assembly = new Assembly();
559         assembly.setId( "test" );
560 
561         assembly.setIncludeSiteDirectory( true );
562 
563         final StringReader sr = writeToStringReader( assembly );
564 
565         final File siteDir = fileManager.createTempDir();
566 
567         expect( configSource.getSiteDirectory()).andReturn( siteDir ).anyTimes();
568 
569         final File basedir = fileManager.createTempDir();
570 
571         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
572 
573         final Model model = new Model();
574         model.setGroupId( "group" );
575         model.setArtifactId( "artifact" );
576         model.setVersion( "version" );
577 
578         final MavenProject project = new MavenProject( model );
579 
580         expect(configSource.getProject()).andReturn( project ).anyTimes();
581 
582         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
583         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
584 
585         mockManager.replayAll();
586 
587         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
588 
589         assertEquals( assembly.getId(), result.getId() );
590 
591         final List<FileSet> fileSets = result.getFileSets();
592 
593         assertEquals( 1, fileSets.size() );
594 
595         assertEquals( "/site", fileSets.get( 0 )
596                                        .getOutputDirectory() );
597 
598         mockManager.verifyAll();
599     }
600 
601     public void testReadAssembly_ShouldReadAssemblyWithSiteDirInclusionFromConfigWithoutComponentsOrInterpolation()
602         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
603     {
604         final Assembly assembly = new Assembly();
605         assembly.setId( "test" );
606 
607         final StringReader sr = writeToStringReader( assembly );
608 
609         final File siteDir = fileManager.createTempDir();
610 
611         expect( configSource.getSiteDirectory()).andReturn( siteDir ).anyTimes();
612 
613         final File basedir = fileManager.createTempDir();
614 
615         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
616 
617         final Model model = new Model();
618         model.setGroupId( "group" );
619         model.setArtifactId( "artifact" );
620         model.setVersion( "version" );
621 
622         final MavenProject project = new MavenProject( model );
623 
624         expect( configSource.getProject()).andReturn( project ).anyTimes();
625 
626         expect( configSource.isSiteIncluded()).andReturn( true ).anyTimes();
627         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
628 
629         mockManager.replayAll();
630 
631         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
632 
633         assertEquals( assembly.getId(), result.getId() );
634 
635         final List<FileSet> fileSets = result.getFileSets();
636 
637         assertEquals( 1, fileSets.size() );
638 
639         assertEquals( "/site", fileSets.get( 0 )
640                                        .getOutputDirectory() );
641 
642         mockManager.verifyAll();
643     }
644 
645     public void testReadAssembly_ShouldReadAssemblyWithComponentWithoutSiteDirInclusionOrInterpolation()
646         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
647     {
648         final File componentsFile = fileManager.createTempFile();
649 
650         final File basedir = componentsFile.getParentFile();
651         final String componentsFilename = componentsFile.getName();
652 
653         final Component component = new Component();
654 
655         final FileSet fs = new FileSet();
656         fs.setDirectory( "/dir" );
657 
658         component.addFileSet( fs );
659 
660         Writer fw = null;
661 
662         try
663         {
664             fw = new OutputStreamWriter( new FileOutputStream( componentsFile ), "UTF-8" );
665             new ComponentXpp3Writer().write( fw, component );
666         }
667         finally
668         {
669             IOUtil.close( fw );
670         }
671 
672         final Assembly assembly = new Assembly();
673         assembly.setId( "test" );
674 
675         assembly.addComponentDescriptor( componentsFilename );
676 
677         final StringReader sr = writeToStringReader( assembly );
678 
679         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
680 
681         final Model model = new Model();
682         model.setGroupId( "group" );
683         model.setArtifactId( "artifact" );
684         model.setVersion( "version" );
685 
686         final MavenProject project = new MavenProject( model );
687         expect( configSource.getProject()).andReturn( project ).anyTimes();
688 
689         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
690         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
691 
692         mockManager.replayAll();
693 
694         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
695 
696         assertEquals( assembly.getId(), result.getId() );
697 
698         final List<FileSet> fileSets = result.getFileSets();
699 
700         assertEquals( 1, fileSets.size() );
701 
702         assertEquals( "/dir", fileSets.get( 0 )
703                                       .getDirectory() );
704 
705         mockManager.verifyAll();
706     }
707 
708     public void testReadAssembly_ShouldReadAssemblyWithComponentInterpolationWithoutSiteDirInclusionOrAssemblyInterpolation()
709         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
710     {
711         final File componentsFile = fileManager.createTempFile();
712 
713         final File basedir = componentsFile.getParentFile();
714         final String componentsFilename = componentsFile.getName();
715 
716         final Component component = new Component();
717 
718         final FileSet fs = new FileSet();
719         fs.setDirectory( "${groupId}-dir" );
720 
721         component.addFileSet( fs );
722 
723         Writer fw = null;
724 
725         try
726         {
727             fw = new OutputStreamWriter( new FileOutputStream( componentsFile ), "UTF-8" );
728             new ComponentXpp3Writer().write( fw, component );
729         }
730         finally
731         {
732             IOUtil.close( fw );
733         }
734 
735         final Assembly assembly = new Assembly();
736         assembly.setId( "test" );
737 
738         assembly.addComponentDescriptor( componentsFilename );
739 
740         final StringReader sr = writeToStringReader( assembly );
741 
742         expect( configSource.getBasedir()).andReturn( basedir ).atLeastOnce();
743 
744         final Model model = new Model();
745         model.setGroupId( "group" );
746         model.setArtifactId( "artifact" );
747         model.setVersion( "version" );
748 
749         final MavenProject project = new MavenProject( model );
750 
751         expect( configSource.getProject()).andReturn( project ).atLeastOnce();
752 
753         expect( configSource.isSiteIncluded()).andReturn( false );
754         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
755 
756         mockManager.replayAll();
757 
758         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
759 
760         assertEquals( assembly.getId(), result.getId() );
761 
762         final List<FileSet> fileSets = result.getFileSets();
763 
764         assertEquals( 1, fileSets.size() );
765 
766         assertEquals( "group-dir", fileSets.get( 0 )
767                                            .getDirectory() );
768 
769         mockManager.verifyAll();
770     }
771 
772     public static StringReader writeToStringReader( Assembly assembly )
773         throws IOException
774     {
775         final StringWriter sw = new StringWriter();
776         final AssemblyXpp3Writer assemblyWriter = new AssemblyXpp3Writer();
777 
778         assemblyWriter.write( sw, assembly );
779 
780         return new StringReader( sw.toString() );
781     }
782 
783     public void testReadAssembly_ShouldReadAssemblyWithInterpolationWithoutComponentsOrSiteDirInclusion()
784         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
785     {
786         final Assembly assembly = new Assembly();
787         assembly.setId( "${groupId}-assembly" );
788 
789         final StringReader sr = writeToStringReader( assembly );
790 
791         final File basedir = fileManager.createTempDir();
792 
793         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
794 
795         final Model model = new Model();
796         model.setGroupId( "group" );
797         model.setArtifactId( "artifact" );
798         model.setVersion( "version" );
799 
800         final MavenProject project = new MavenProject( model );
801 
802         expect( configSource.getProject()).andReturn( project ).anyTimes();
803 
804         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
805 
806         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
807 
808         mockManager.replayAll();
809 
810         final Assembly result = new DefaultAssemblyReader().readAssembly( sr, "testLocation", null, configSource );
811 
812         assertEquals( "group-assembly", result.getId() );
813 
814         mockManager.verifyAll();
815     }
816 
817     public void testGetAssemblyFromDescriptorFile_ShouldReadAssembly()
818         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
819     {
820         final Assembly assembly = new Assembly();
821         assembly.setId( "test" );
822 
823         final FileSet fs = new FileSet();
824         fs.setDirectory( "/dir" );
825 
826         assembly.addFileSet( fs );
827 
828         final File assemblyFile = fileManager.createTempFile();
829 
830         final File basedir = assemblyFile.getParentFile();
831 
832         expect( configSource.getBasedir()).andReturn( basedir).anyTimes();
833 
834         expect( configSource.getProject()).andReturn( new MavenProject( new Model() )).anyTimes();
835 
836         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
837 
838         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
839 
840         Writer writer = null;
841         try
842         {
843             writer = new OutputStreamWriter( new FileOutputStream( assemblyFile ), "UTF-8" );
844             new AssemblyXpp3Writer().write( writer, assembly );
845         }
846         finally
847         {
848             IOUtil.close( writer );
849         }
850 
851         mockManager.replayAll();
852 
853         final Assembly result = new DefaultAssemblyReader().getAssemblyFromDescriptorFile( assemblyFile, configSource );
854 
855         assertEquals( assembly.getId(), result.getId() );
856 
857         mockManager.verifyAll();
858     }
859 
860     public void testGetAssemblyForDescriptorReference_ShouldReadBinaryAssemblyRef()
861         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
862     {
863         final File basedir = fileManager.createTempDir();
864 
865         expect( configSource.getBasedir()).andReturn( basedir).anyTimes();
866 
867         expect( configSource.getProject()).andReturn( new MavenProject( new Model() )).anyTimes();
868 
869         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
870 
871         expect( configSource.isIgnoreMissingDescriptor()).andReturn( false ).anyTimes();
872 
873         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
874 
875         mockManager.replayAll();
876 
877         final Assembly result = new DefaultAssemblyReader().getAssemblyForDescriptorReference( "bin", configSource );
878 
879         assertEquals( "bin", result.getId() );
880 
881         mockManager.verifyAll();
882     }
883 
884     public void testReadAssemblies_ShouldGetAssemblyDescriptorFromSingleFile()
885         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
886     {
887         final Assembly assembly = new Assembly();
888         assembly.setId( "test" );
889 
890         final FileSet fs = new FileSet();
891         fs.setDirectory( "/dir" );
892 
893         assembly.addFileSet( fs );
894 
895         final File basedir = fileManager.createTempDir();
896 
897         final List<String> files = writeAssembliesToFile( Collections.singletonList( assembly ), basedir );
898 
899         final String assemblyFile = files.get( 0 );
900 
901         final List<Assembly> assemblies = performReadAssemblies( basedir, assemblyFile, null, null, null, null );
902 
903         assertNotNull( assemblies );
904         assertEquals( 1, assemblies.size() );
905 
906         final Assembly result = assemblies.get( 0 );
907 
908         assertEquals( assembly.getId(), result.getId() );
909     }
910 
911     public void testReadAssemblies_ShouldFailWhenSingleDescriptorFileMissing()
912         throws IOException, InvalidAssemblerConfigurationException
913     {
914         final File basedir = fileManager.createTempDir();
915 
916         final File assemblyFile = new File( basedir, "test.xml" );
917         assemblyFile.delete();
918 
919         try
920         {
921             performReadAssemblies( basedir, assemblyFile.getAbsolutePath(), null, null, null, null, false );
922 
923             fail( "Should fail when descriptor file is missing and ignoreDescriptors == false" );
924         }
925         catch ( final AssemblyReadException e )
926         {
927             
928         }
929     }
930 
931     public void testReadAssemblies_ShouldIgnoreMissingSingleDescriptorFileWhenIgnoreIsConfigured()
932         throws IOException, InvalidAssemblerConfigurationException
933     {
934         final File basedir = fileManager.createTempDir();
935 
936         final File assemblyFile = new File( basedir, "test.xml" );
937         assemblyFile.delete();
938 
939         try
940         {
941             performReadAssemblies( basedir, assemblyFile.getAbsolutePath(), null, null, null, null, true );
942         }
943         catch ( final AssemblyReadException e )
944         {
945             fail( "Setting ignoreMissingDescriptor == true (true flag in performReadAssemblies, above) should NOT produce an exception." );
946         }
947     }
948 
949     public void testReadAssemblies_ShouldGetAssemblyDescriptorFromSingleRef()
950         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
951     {
952         final File basedir = fileManager.createTempDir();
953 
954         final List<Assembly> assemblies = performReadAssemblies( basedir, null, "bin", null, null, null );
955 
956         assertNotNull( assemblies );
957         assertEquals( 1, assemblies.size() );
958 
959         final Assembly result = assemblies.get( 0 );
960 
961         assertEquals( "bin", result.getId() );
962     }
963 
964     public void testReadAssemblies_ShouldGetAssemblyDescriptorFromFileArray()
965         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
966     {
967         final Assembly assembly1 = new Assembly();
968         assembly1.setId( "test" );
969 
970         final Assembly assembly2 = new Assembly();
971         assembly2.setId( "test2" );
972 
973         final List<Assembly> assemblies = new ArrayList<Assembly>();
974         assemblies.add( assembly1 );
975         assemblies.add( assembly2 );
976 
977         final File basedir = fileManager.createTempDir();
978 
979         final List<String> files = writeAssembliesToFile( assemblies, basedir );
980 
981         final List<Assembly> results =
982             performReadAssemblies( basedir, null, null, files.toArray(new String[files.size()]), null, null );
983 
984         assertNotNull( results );
985         assertEquals( 2, results.size() );
986 
987         final Assembly result1 = assemblies.get( 0 );
988 
989         assertEquals( assembly1.getId(), result1.getId() );
990 
991         final Assembly result2 = assemblies.get( 1 );
992 
993         assertEquals( assembly2.getId(), result2.getId() );
994     }
995 
996     public void testReadAssemblies_ShouldGetAssemblyDescriptorFromMultipleRefs()
997         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
998     {
999         final File basedir = fileManager.createTempDir();
1000 
1001         final List<Assembly> assemblies =
1002             performReadAssemblies( basedir, null, null, null, new String[] { "bin", "src" }, null );
1003 
1004         assertNotNull( assemblies );
1005         assertEquals( 2, assemblies.size() );
1006 
1007         final Assembly result = assemblies.get( 0 );
1008 
1009         assertEquals( "bin", result.getId() );
1010 
1011         final Assembly result2 = assemblies.get( 1 );
1012 
1013         assertEquals( "src", result2.getId() );
1014     }
1015 
1016     public void testReadAssemblies_ShouldGetAssemblyDescriptorFromDirectory()
1017         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
1018     {
1019         final Assembly assembly1 = new Assembly();
1020         assembly1.setId( "test" );
1021 
1022         final Assembly assembly2 = new Assembly();
1023         assembly2.setId( "test2" );
1024 
1025         final List<Assembly> assemblies = new ArrayList<Assembly>();
1026         assemblies.add( assembly1 );
1027         assemblies.add( assembly2 );
1028 
1029         final File basedir = fileManager.createTempDir();
1030 
1031         writeAssembliesToFile( assemblies, basedir );
1032 
1033         final List<Assembly> results = performReadAssemblies( basedir, null, null, null, null, basedir );
1034 
1035         assertNotNull( results );
1036         assertEquals( 2, results.size() );
1037 
1038         final Assembly result1 = assemblies.get( 0 );
1039 
1040         assertEquals( assembly1.getId(), result1.getId() );
1041 
1042         final Assembly result2 = assemblies.get( 1 );
1043 
1044         assertEquals( assembly2.getId(), result2.getId() );
1045     }
1046 
1047     public void testReadAssemblies_ShouldGetTwoAssemblyDescriptorsFromDirectoryWithThreeFiles()
1048         throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException
1049     {
1050         final Assembly assembly1 = new Assembly();
1051         assembly1.setId( "test" );
1052 
1053         final Assembly assembly2 = new Assembly();
1054         assembly2.setId( "test2" );
1055 
1056         final List<Assembly> assemblies = new ArrayList<Assembly>();
1057         assemblies.add( assembly1 );
1058         assemblies.add( assembly2 );
1059 
1060         final File basedir = fileManager.createTempDir();
1061 
1062         writeAssembliesToFile( assemblies, basedir );
1063 
1064         fileManager.createFile( basedir, "readme.txt", "This is just a readme file, not a descriptor." );
1065 
1066         final List<Assembly> results = performReadAssemblies( basedir, null, null, null, null, basedir );
1067 
1068         assertNotNull( results );
1069         assertEquals( 2, results.size() );
1070 
1071         final Assembly result1 = assemblies.get( 0 );
1072 
1073         assertEquals( assembly1.getId(), result1.getId() );
1074 
1075         final Assembly result2 = assemblies.get( 1 );
1076 
1077         assertEquals( assembly2.getId(), result2.getId() );
1078     }
1079 
1080     private List<String> writeAssembliesToFile( final List<Assembly> assemblies, final File dir )
1081         throws IOException
1082     {
1083         final List<String> files = new ArrayList<String>();
1084 
1085         for (final Assembly assembly : assemblies) {
1086             final File assemblyFile = new File(dir, assembly.getId() + ".xml");
1087 
1088             Writer writer = null;
1089             try {
1090                 writer = new OutputStreamWriter(new FileOutputStream(assemblyFile), "UTF-8");
1091                 new AssemblyXpp3Writer().write(writer, assembly);
1092             } finally {
1093                 IOUtil.close(writer);
1094             }
1095 
1096             files.add(assemblyFile.getAbsolutePath());
1097         }
1098 
1099         return files;
1100     }
1101 
1102     private List<Assembly> performReadAssemblies( final File basedir, final String descriptor,
1103                                                   final String descriptorRef, final String[] descriptors,
1104                                                   final String[] descriptorRefs, final File descriptorDir )
1105         throws AssemblyReadException, InvalidAssemblerConfigurationException
1106     {
1107         return performReadAssemblies( basedir, descriptor, descriptorRef, descriptors, descriptorRefs, descriptorDir,
1108                                       false );
1109     }
1110 
1111     private List<Assembly> performReadAssemblies( final File basedir, final String descriptor,
1112                                                   final String descriptorRef, final String[] descriptors,
1113                                                   final String[] descriptorRefs, final File descriptorDir,
1114                                                   final boolean ignoreMissing )
1115         throws AssemblyReadException, InvalidAssemblerConfigurationException
1116     {
1117         expect( configSource.getDescriptor()).andReturn( descriptor );
1118 
1119         expect( configSource.getDescriptorId()).andReturn( descriptorRef );
1120 
1121         expect( configSource.getDescriptorReferences()).andReturn( descriptorRefs );
1122 
1123         expect( configSource.getDescriptors()).andReturn( descriptors );
1124 
1125         expect( configSource.getDescriptorSourceDirectory()).andReturn( descriptorDir );
1126 
1127         expect( configSource.getBasedir()).andReturn( basedir ).anyTimes();
1128 
1129         expect( configSource.getProject()).andReturn( new MavenProject( new Model() )).anyTimes();
1130 
1131         expect( configSource.isSiteIncluded()).andReturn( false ).anyTimes();
1132 
1133         expect( configSource.isIgnoreMissingDescriptor()).andReturn(  ignoreMissing).anyTimes();
1134         DefaultAssemblyArchiverTest.setupInterpolators( configSource );
1135 
1136         mockManager.replayAll();
1137 
1138         final List<Assembly> assemblies = new DefaultAssemblyReader().readAssemblies( configSource );
1139 
1140         mockManager.verifyAll();
1141 
1142         return assemblies;
1143     }
1144 
1145 }