View Javadoc
1   package org.apache.maven.plugins.assembly.utils;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import junit.framework.TestCase;
23  import org.apache.maven.execution.MavenSession;
24  import org.apache.maven.model.Build;
25  import org.apache.maven.model.Model;
26  import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
27  import org.apache.maven.plugins.assembly.archive.DefaultAssemblyArchiverTest;
28  import org.apache.maven.plugins.assembly.archive.task.testutils.ArtifactMock;
29  import org.apache.maven.plugins.assembly.format.AssemblyFormattingException;
30  import org.apache.maven.plugins.assembly.model.Assembly;
31  import org.apache.maven.project.MavenProject;
32  import org.easymock.classextension.EasyMockSupport;
33  
34  import java.util.Properties;
35  
36  import static org.easymock.EasyMock.expect;
37  
38  public class AssemblyFormatUtilsTest
39      extends TestCase
40  {
41  
42      private final EasyMockSupport mockManager = new EasyMockSupport();
43  
44      public void testFixRelativePathRefs_ShouldRemoveRelativeRefToCurrentDir()
45          throws AssemblyFormattingException
46      {
47          assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "./path/" ) );
48      }
49  
50      public void testFixRelativePathRefs_ShouldRemoveEmbeddedSameDirRef()
51          throws AssemblyFormattingException
52      {
53          assertEquals( "some/path/", AssemblyFormatUtils.fixRelativeRefs( "some/./path/" ) );
54          assertEquals( "some\\path\\", AssemblyFormatUtils.fixRelativeRefs( "some\\.\\path\\" ) );
55      }
56  
57      public void testFixRelativePathRefs_ShouldRemoveEmbeddedParentDirRef()
58          throws AssemblyFormattingException
59      {
60          assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "some/../path/" ) );
61      }
62  
63      public void testFixRelativePathRefs_ShouldTruncateRelativeRefToParentDir()
64          throws AssemblyFormattingException
65      {
66          assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "../path/" ) );
67      }
68  
69      public void testGetDistroName_ShouldUseJustFinalNameWithNoAppendAssemblyIdOrClassifier()
70      {
71          verifyDistroName( "assembly", "finalName", false, "finalName" );
72      }
73  
74      public void testGetDistroName_ShouldUseFinalNamePlusAssemblyIdIsNull()
75      {
76          verifyDistroName( "assembly", "finalName", true, "finalName-assembly" );
77      }
78  
79      public void testGetOutputDir_ShouldResolveGroupIdInOutDir_UseArtifactInfo()
80          throws AssemblyFormattingException
81      {
82          verifyOutputDirUsingArtifactProject( "${artifact.groupId}", null, "group", null, null, null, null, "group/" );
83      }
84  
85      public void testGetOutputDir_ShouldResolveArtifactIdInOutDir_UseArtifactInfo()
86          throws AssemblyFormattingException
87      {
88          verifyOutputDirUsingArtifactProject( "${artifact.artifactId}", null, null, "artifact", null, null, null,
89                                               "artifact/" );
90      }
91  
92      public void testGetOutputDir_ShouldResolveVersionInOutDir_UseArtifactInfo()
93          throws AssemblyFormattingException
94      {
95          verifyOutputDirUsingArtifactProject( "${artifact.version}", null, null, null, "version", null, null,
96                                               "version/" );
97      }
98  
99      public void testGetOutputDir_ShouldResolveBuildFinalNameInOutDir_UseArtifactInfo()
100         throws AssemblyFormattingException
101     {
102         verifyOutputDirUsingArtifactProject( "${artifact.build.finalName}", null, null, null, null, "finalName", null,
103                                              "finalName/" );
104     }
105 
106     public void testGetOutputDir_ShouldResolveGroupIdInOutDir_UseModuleInfo()
107         throws AssemblyFormattingException
108     {
109         verifyOutputDirUsingModuleProject( "${module.groupId}", null, "group", null, null, null, null, "group/" );
110     }
111 
112     public void testGetOutputDir_ShouldResolveArtifactIdInOutDir_UseModuleInfo()
113         throws AssemblyFormattingException
114     {
115         verifyOutputDirUsingModuleProject( "${module.artifactId}", null, null, "artifact", null, null, null,
116                                            "artifact/" );
117     }
118 
119     public void testGetOutputDir_ShouldResolveVersionInOutDir_UseModuleInfo()
120         throws AssemblyFormattingException
121     {
122         verifyOutputDirUsingModuleProject( "${module.version}", null, null, null, "version", null, null, "version/" );
123     }
124 
125     public void testGetOutputDir_ShouldResolveBuildFinalNameInOutDir_UseModuleInfo()
126         throws AssemblyFormattingException
127     {
128         verifyOutputDirUsingModuleProject( "${module.build.finalName}", null, null, null, null, "finalName", null,
129                                            "finalName/" );
130     }
131 
132     public void testGetOutputDir_ShouldResolveGroupIdInOutDir_UseExplicitMainProject()
133         throws AssemblyFormattingException
134     {
135         verifyOutputDirUsingMainProject( "${pom.groupId}", null, "group", null, null, null, null, "group/" );
136     }
137 
138     public void testGetOutputDir_ShouldResolveArtifactIdInOutDir_UseExplicitMainProject()
139         throws AssemblyFormattingException
140     {
141         verifyOutputDirUsingMainProject( "${pom.artifactId}", null, null, "artifact", null, null, null, "artifact/" );
142     }
143 
144     public void testGetOutputDir_ShouldResolveVersionInOutDir_UseExplicitMainProject()
145         throws AssemblyFormattingException
146     {
147         verifyOutputDirUsingMainProject( "${pom.version}", null, null, null, "version", null, null, "version/" );
148     }
149 
150     public void testGetOutputDir_ShouldResolveBuildFinalNameInOutDir_UseExplicitMainProject()
151         throws AssemblyFormattingException
152     {
153         verifyOutputDirUsingMainProject( "${pom.build.finalName}", null, null, null, null, "finalName", null,
154                                          "finalName/" );
155     }
156 
157     public void testGetOutputDir_ShouldResolveGroupIdInOutDir_UseExplicitMainProject_projectRef()
158         throws AssemblyFormattingException
159     {
160         verifyOutputDirUsingMainProject( "${project.groupId}", null, "group", null, null, null, null, "group/" );
161     }
162 
163     public void testGetOutputDir_ShouldResolveArtifactIdInOutDir_UseExplicitMainProject_projectRef()
164         throws AssemblyFormattingException
165     {
166         verifyOutputDirUsingMainProject( "${project.artifactId}", null, null, "artifact", null, null, null,
167                                          "artifact/" );
168     }
169 
170     public void testGetOutputDir_ShouldResolveVersionInOutDir_UseExplicitMainProject_projectRef()
171         throws AssemblyFormattingException
172     {
173         verifyOutputDirUsingMainProject( "${project.version}", null, null, null, "version", null, null, "version/" );
174     }
175 
176     public void testGetOutputDir_ShouldResolveBuildFinalNameInOutDir_UseExplicitMainProject_projectRef()
177         throws AssemblyFormattingException
178     {
179         verifyOutputDir( "${project.build.finalName}", null, "finalName", "finalName/" );
180     }
181 
182     public void testGetOutputDir_ShouldNotAlterOutDirWhenIncludeBaseFalseAndNoExpressions()
183         throws AssemblyFormattingException
184     {
185         verifyOutputDir( "dir/", "finalName", null, "dir/" );
186     }
187 
188     public void testGetOutputDir_ShouldNotAlterOutDirWhenIncludeBaseFalseAndNoExpressions_CheckWithBackslash()
189         throws AssemblyFormattingException
190     {
191         verifyOutputDir( "dir\\", "finalName", null, "dir\\" );
192     }
193 
194     public void testGetOutputDir_ShouldAppendSlashToOutDirWhenMissingAndIncludeBaseFalseAndNoExpressions()
195         throws AssemblyFormattingException
196     {
197         verifyOutputDir( "dir", "finalName", null, "dir/" );
198     }
199 
200     public void testGetOutputDir_ShouldResolveGroupIdInOutDir()
201         throws AssemblyFormattingException
202     {
203         verifyOutputDirUsingMainProject( "${groupId}", "finalName", "group", null, null, null, null, "group/" );
204     }
205 
206     public void testGetOutputDir_ShouldResolveArtifactIdInOutDir()
207         throws AssemblyFormattingException
208     {
209         verifyOutputDirUsingMainProject( "${artifactId}", "finalName", null, "artifact", null, null, null,
210                                          "artifact/" );
211     }
212 
213     public void testGetOutputDir_ShouldResolveVersionInOutDir()
214         throws AssemblyFormattingException
215     {
216         verifyOutputDirUsingMainProject( "${version}", "finalName", null, null, "version", null, null, "version/" );
217     }
218 
219     public void testGetOutputDir_ShouldResolveVersionInLargerOutDirExpr()
220         throws AssemblyFormattingException
221     {
222         verifyOutputDirUsingMainProject( "my-special-${version}", "finalName", null, null, "99", null, null,
223                                          "my-special-99/" );
224     }
225 
226     public void testGetOutputDir_ShouldResolveFinalNameInOutDir()
227         throws AssemblyFormattingException
228     {
229         verifyOutputDir( "${finalName}", "finalName", null, "finalName/" );
230     }
231 
232     public void testGetOutputDir_ShouldResolveBuildFinalNameInOutDir()
233         throws AssemblyFormattingException
234     {
235         verifyOutputDir( "${build.finalName}", "finalName", null, "finalName/" );
236     }
237 
238     public void testGetOutputDir_ShouldReturnEmptyPathWhenAllInputIsEmptyAndIncludeBaseFalse()
239         throws AssemblyFormattingException
240     {
241         verifyOutputDir( null, null, null, "" );
242     }
243 
244     public void testGetOutputDir_ShouldRemoveRelativeRefToCurrentDir()
245         throws AssemblyFormattingException
246     {
247         verifyOutputDir( "./path/", null, null, "path/" );
248     }
249 
250     public void testGetOutputDir_ShouldRemoveEmbeddedSameDirRef()
251         throws AssemblyFormattingException
252     {
253         verifyOutputDir( "some/./path/", null, null, "some/path/" );
254     }
255 
256     public void testGetOutputDir_ShouldRemoveEmbeddedParentDirRef()
257         throws AssemblyFormattingException
258     {
259         verifyOutputDir( "some/../path/", null, null, "path/" );
260     }
261 
262     public void testGetOutputDir_ShouldTruncateRelativeRefToParentDir()
263         throws AssemblyFormattingException
264     {
265         verifyOutputDir( "../path/", null, null, "path/" );
266     }
267 
268     public void testGetOutputDir_ShouldResolveProjectProperty()
269         throws AssemblyFormattingException
270     {
271         final Properties props = new Properties();
272         props.setProperty( "myProperty", "value" );
273 
274         verifyOutputDirUsingMainProject( "file.${myProperty}", null, null, null, null, null, props, "file.value/" );
275     }
276 
277     public void testGetOutputDir_ShouldResolveProjectPropertyAltExpr()
278         throws AssemblyFormattingException
279     {
280         final Properties props = new Properties();
281         props.setProperty( "myProperty", "value" );
282 
283         verifyOutputDirUsingMainProject( "file.${pom.properties.myProperty}", null, null, null, null, null, props,
284                                          "file.value/" );
285     }
286 
287     public void
288     testEvalFileNameMapping_ShouldResolveArtifactIdAndBaseVersionInOutDir_UseArtifactInfo_WithValidMainProject()
289         throws AssemblyFormattingException
290     {
291         final MavenProject mainProject = createProject( "group", "main", "1", null );
292 
293         final String artifactVersion = "2-20070807.112233-1";
294         final String artifactBaseVersion = "2-SNAPSHOT";
295         final MavenProject artifactProject = createProject( "group", "artifact", artifactVersion, null );
296         final ArtifactMock artifactMock =
297             new ArtifactMock( mockManager, "group", "artifact", artifactVersion, "jar", true, artifactBaseVersion );
298 
299         artifactProject.setArtifact( artifactMock.getArtifact() );
300 
301         final MavenSession session = mockManager.createMock( MavenSession.class );
302         expect( session.getExecutionProperties() ).andReturn( null ).anyTimes();
303 
304         expect( session.getUserProperties() ).andReturn( new Properties() ).anyTimes();
305 
306         final AssemblerConfigurationSource cs = mockManager.createMock( AssemblerConfigurationSource.class );
307         expect( cs.getMavenSession() ).andReturn( session ).anyTimes();
308         DefaultAssemblyArchiverTest.setupInterpolators( cs );
309 
310         mockManager.replayAll();
311 
312         final String result =
313             AssemblyFormatUtils.evaluateFileNameMapping( "${artifact.artifactId}-${artifact.baseVersion}",
314                                                          artifactMock.getArtifact(), mainProject, null, cs,
315                                                          AssemblyFormatUtils.moduleProjectInterpolator( null ),
316                                                          AssemblyFormatUtils.artifactProjectInterpolator(
317                                                              artifactProject ) );
318 
319 /*
320         final Artifact artifact = artifactMock.getArtifact();
321         final String result =
322             AssemblyFormatUtils.evaluateFileNameMapping( "${artifact.artifactId}-${artifact.baseVersion}",
323                                                          moduleArtifactInterpolator( null ),
324                                                          moduleProjectInterpolator( null ),
325                                                          artifactInterpolator( artifact ),
326                                                          artifactProjectInterpolator( artifactProject ),
327                                                          mainArtifactPropsOnly( mainProject ),
328                                                          classifierRules( artifact ),
329                                                          FixedStringSearchInterpolator.empty() );
330 
331          */
332         assertEquals( "artifact-2-SNAPSHOT", result );
333 
334         mockManager.verifyAll();
335 
336         // clear out for next call.
337         mockManager.resetAll();
338     }
339 
340     public void testEvalFileNameMapping_ShouldResolveGroupIdInOutDir_UseArtifactInfo()
341         throws AssemblyFormattingException
342     {
343         verifyEvalFileNameMappingUsingArtifactProject( "${artifact.groupId}", null, "group", null, null, null, "group",
344                                                        null );
345     }
346 
347     public void testEvalFileNameMapping_ShouldResolveArtifactIdInOutDir_UseArtifactInfo()
348         throws AssemblyFormattingException
349     {
350         verifyEvalFileNameMappingUsingArtifactProject( "${artifact.artifactId}", null, null, "artifact", null, null,
351                                                        "artifact", null );
352     }
353 
354     public void testEvalFileNameMapping_ShouldResolveVersionInOutDir_UseArtifactInfo()
355         throws AssemblyFormattingException
356     {
357         verifyEvalFileNameMappingUsingArtifactProject( "${artifact.version}", null, null, null, "version", null,
358                                                        "version", null );
359     }
360 
361     public void testEvalFileNameMapping_ShouldResolveGroupIdInOutDir_UseArtifactInfoAndModulePrefix()
362         throws AssemblyFormattingException
363     {
364         verifyEvalFileNameMappingUsingModuleProject( "${module.groupId}", null, "group", null, null, null, "group",
365                                                      null );
366     }
367 
368     public void testEvalFileNameMapping_ShouldResolveArtifactIdInOutDir_UseArtifactInfoAndModulePrefix()
369         throws AssemblyFormattingException
370     {
371         verifyEvalFileNameMappingUsingModuleProject( "${module.artifactId}", null, null, "artifact", null, null,
372                                                      "artifact", null );
373     }
374 
375     public void testEvalFileNameMapping_ShouldResolveVersionInOutDir_UseArtifactInfoAndModulePrefix()
376         throws AssemblyFormattingException
377     {
378         verifyEvalFileNameMappingUsingModuleProject( "${module.version}", null, null, null, "version", null, "version",
379                                                      null );
380     }
381 
382     public void testEvalFileNameMapping_ShouldResolveGroupIdInOutDir_UseExplicitMainProject()
383         throws AssemblyFormattingException
384     {
385         verifyEvalFileNameMappingUsingMainProject( "${pom.groupId}", null, "group", null, null, null, "group", null );
386     }
387 
388     public void testEvalFileNameMapping_ShouldResolveArtifactIdInOutDir_UseExplicitMainProject()
389         throws AssemblyFormattingException
390     {
391         verifyEvalFileNameMappingUsingMainProject( "${pom.artifactId}", null, null, "artifact", null, null, "artifact",
392                                                    null );
393     }
394 
395     public void testEvalFileNameMapping_ShouldResolveVersionInOutDir_UseExplicitMainProject()
396         throws AssemblyFormattingException
397     {
398         verifyEvalFileNameMappingUsingMainProject( "${pom.version}", null, null, null, "version", null, "version",
399                                                    null );
400     }
401 
402     public void testEvalFileNameMapping_ShouldResolveGroupIdInOutDir_UseExplicitMainProject_projectRef()
403         throws AssemblyFormattingException
404     {
405         verifyEvalFileNameMappingUsingMainProject( "${project.groupId}", null, "group", null, null, null, "group",
406                                                    null );
407     }
408 
409     public void testEvalFileNameMapping_ShouldResolveArtifactIdInOutDir_UseExplicitMainProject_projectRef()
410         throws AssemblyFormattingException
411     {
412         verifyEvalFileNameMappingUsingMainProject( "${project.artifactId}", null, null, "artifact", null, null,
413                                                    "artifact", null );
414     }
415 
416     public void testEvalFileNameMapping_ShouldResolveVersionInOutDir_UseExplicitMainProject_projectRef()
417         throws AssemblyFormattingException
418     {
419         verifyEvalFileNameMappingUsingMainProject( "${project.version}", null, null, null, "version", null, "version",
420                                                    null );
421     }
422 
423     public void testEvalFileNameMapping_ShouldRemoveRelativeRefToCurrentDir()
424         throws AssemblyFormattingException
425     {
426         verifyEvalFileNameMappingUsingMainProject( "./path/", null, null, null, null, null, "path/", null );
427     }
428 
429     public void testEvalFileNameMapping_ShouldRemoveEmbeddedSameDirRef()
430         throws AssemblyFormattingException
431     {
432         verifyEvalFileNameMappingUsingMainProject( "some/./path/", null, null, null, null, null, "some/path/", null );
433     }
434 
435     public void testEvalFileNameMapping_ShouldRemoveEmbeddedParentDirRef()
436         throws AssemblyFormattingException
437     {
438         verifyEvalFileNameMappingUsingMainProject( "some/../path/", null, null, null, null, null, "path/", null );
439     }
440 
441     public void testEvalFileNameMapping_ShouldTruncateRelativeRefToParentDir()
442         throws AssemblyFormattingException
443     {
444         verifyEvalFileNameMappingUsingMainProject( "../path/", null, null, null, null, null, "path/", null );
445     }
446 
447     public void testEvalFileNameMapping_ShouldPassExpressionThroughUnchanged()
448         throws AssemblyFormattingException
449     {
450         verifyEvalFileNameMapping( "filename", null, null, "filename", null );
451     }
452 
453     public void testEvalFileNameMapping_ShouldInsertClassifierAheadOfExtension()
454         throws AssemblyFormattingException
455     {
456         verifyEvalFileNameMapping( "filename-${artifact.classifier}.ext", "classifier", null, "filename-classifier.ext",
457                                    null );
458     }
459 
460     public void testEvalFileNameMapping_ShouldAppendDashClassifierWhenClassifierPresent()
461         throws AssemblyFormattingException
462     {
463         verifyEvalFileNameMapping( "filename${dashClassifier?}", "classifier", null, "filename-classifier", null );
464     }
465 
466     public void testEvalFileNameMapping_ShouldNotAppendDashClassifierWhenClassifierMissing()
467         throws AssemblyFormattingException
468     {
469         verifyEvalFileNameMapping( "filename${dashClassifier?}", null, null, "filename", null );
470     }
471 
472     public void testEvalFileNameMapping_ShouldNotAppendDashClassifierWhenClassifierEmpty()
473         throws AssemblyFormattingException
474     {
475         verifyEvalFileNameMapping( "filename${dashClassifier?}", "", null, "filename", null );
476     }
477 
478     public void testEvalFileNameMapping_ShouldResolveGroupId()
479         throws AssemblyFormattingException
480     {
481         verifyEvalFileNameMappingUsingMainProject( "${groupId}", null, "group", null, null, null, "group", null );
482     }
483 
484     public void testEvalFileNameMapping_ShouldResolveArtifactId()
485         throws AssemblyFormattingException
486     {
487         verifyEvalFileNameMappingUsingMainProject( "${artifactId}", null, null, "artifact", null, null, "artifact",
488                                                    null );
489     }
490 
491     public void testEvalFileNameMapping_ShouldResolveVersion()
492         throws AssemblyFormattingException
493     {
494         verifyEvalFileNameMappingUsingMainProject( "${version}", null, null, null, "version", null, "version", null );
495     }
496 
497     public void testEvalFileNameMapping_ShouldResolveExtension()
498         throws AssemblyFormattingException
499     {
500         verifyEvalFileNameMapping( "file.${artifact.extension}", null, "ext", "file.ext", null );
501     }
502 
503     public void testEvalFileNameMapping_ShouldResolveProjectProperty()
504         throws AssemblyFormattingException
505     {
506         final Properties props = new Properties();
507         props.setProperty( "myProperty", "value" );
508 
509         verifyEvalFileNameMapping( "file.${myProperty}", null, null, "file.value", props );
510     }
511 
512     public void testEvalFileNameMapping_ShouldResolveProjectPropertyAltExpr()
513         throws AssemblyFormattingException
514     {
515         final Properties props = new Properties();
516         props.setProperty( "myProperty", "value" );
517 
518         verifyEvalFileNameMapping( "file.${pom.properties.myProperty}", null, null, "file.value", props );
519     }
520 
521     public void testEvalFileNameMapping_ShouldResolveSystemPropertyWithoutMainProjectPresent()
522         throws AssemblyFormattingException
523     {
524         verifyEvalFileNameMapping( "file.${java.version}", null, null, "file." + System.getProperty( "java.version" ),
525                                    null );
526     }
527 
528     private void verifyEvalFileNameMapping( final String expression, final String classifier, final String extension,
529                                             final String checkValue, final Properties projectProperties )
530         throws AssemblyFormattingException
531     {
532         verifyEvalFileNameMappingUsingMainProject( expression, classifier, null, null, null, extension, checkValue,
533                                                    projectProperties );
534     }
535 
536     private void verifyEvalFileNameMappingUsingMainProject( final String expression, final String classifier,
537                                                             final String groupId, final String artifactId,
538                                                             final String version, final String extension,
539                                                             final String checkValue,
540                                                             final Properties projectProperties )
541         throws AssemblyFormattingException
542     {
543         final MavenProject mainProject = createProject( groupId, artifactId, version, projectProperties );
544 
545         final MavenProject artifactProject = createProject( "unknown", "unknown", "unknown", null );
546         final MavenProject moduleProject = createProject( "unknown", "unknown", "unknown", null );
547 
548         verifyEvalFileNameMapping( expression, classifier, extension, mainProject, moduleProject, artifactProject,
549                                    checkValue );
550     }
551 
552     private void verifyEvalFileNameMappingUsingArtifactProject( final String expression, final String classifier,
553                                                                 final String groupId, final String artifactId,
554                                                                 final String version, final String extension,
555                                                                 final String checkValue,
556                                                                 final Properties projectProperties )
557         throws AssemblyFormattingException
558     {
559         final MavenProject artifactProject = createProject( groupId, artifactId, version, projectProperties );
560 
561         final MavenProject mainProject = createProject( "unknown", "unknown", "unknown", null );
562         final MavenProject moduleProject = createProject( "unknown", "unknown", "unknown", null );
563 
564         verifyEvalFileNameMapping( expression, classifier, extension, mainProject, moduleProject, artifactProject,
565                                    checkValue );
566     }
567 
568     private void verifyEvalFileNameMappingUsingModuleProject( final String expression, final String classifier,
569                                                               final String groupId, final String artifactId,
570                                                               final String version, final String extension,
571                                                               final String checkValue,
572                                                               final Properties projectProperties )
573         throws AssemblyFormattingException
574     {
575         final MavenProject moduleProject = createProject( groupId, artifactId, version, projectProperties );
576 
577         final MavenProject mainProject = createProject( "unknown", "unknown", "unknown", null );
578         final MavenProject artifactProject = createProject( "unknown", "unknown", "unknown", null );
579 
580         verifyEvalFileNameMapping( expression, classifier, extension, mainProject, moduleProject, artifactProject,
581                                    checkValue );
582     }
583 
584     private MavenProject createProject( String groupId, String artifactId, String version,
585                                         final Properties projectProperties )
586     {
587         if ( artifactId == null )
588         {
589             artifactId = "artifact";
590         }
591 
592         if ( groupId == null )
593         {
594             groupId = "group";
595         }
596 
597         if ( version == null )
598         {
599             version = "version";
600         }
601 
602         final Model model = new Model();
603         model.setGroupId( groupId );
604         model.setArtifactId( artifactId );
605         model.setVersion( version );
606 
607         model.setProperties( projectProperties );
608 
609         return new MavenProject( model );
610     }
611 
612     private void verifyEvalFileNameMapping( final String expression, final String classifier, final String extension,
613                                             final MavenProject mainProject, final MavenProject moduleProject,
614                                             final MavenProject artifactProject, final String checkValue )
615         throws AssemblyFormattingException
616     {
617         final ArtifactMock artifactMock =
618             new ArtifactMock( mockManager, artifactProject.getGroupId(), artifactProject.getArtifactId(),
619                               artifactProject.getVersion(), extension, classifier, false, null );
620 
621         final ArtifactMock moduleArtifactMock =
622             new ArtifactMock( mockManager, moduleProject.getGroupId(), moduleProject.getArtifactId(),
623                               moduleProject.getVersion(), "jar", false, null );
624 
625         final MavenSession session = mockManager.createMock( MavenSession.class );
626         expect( session.getExecutionProperties() ).andReturn( System.getProperties() ).anyTimes();
627 
628         expect( session.getUserProperties() ).andReturn( new Properties() ).anyTimes();
629 
630         final AssemblerConfigurationSource cs = mockManager.createMock( AssemblerConfigurationSource.class );
631         expect( cs.getMavenSession() ).andReturn( session ).anyTimes();
632         DefaultAssemblyArchiverTest.setupInterpolators( cs, mainProject );
633 
634         mockManager.replayAll();
635 
636         final String result =
637             AssemblyFormatUtils.evaluateFileNameMapping( expression, artifactMock.getArtifact(), mainProject,
638                                                          moduleArtifactMock.getArtifact(), cs,
639                                                          AssemblyFormatUtils.moduleProjectInterpolator( moduleProject ),
640                                                          AssemblyFormatUtils.artifactProjectInterpolator(
641                                                              artifactProject ) );
642 
643         /*
644                 final String result =
645             AssemblyFormatUtils.evaluateFileNameMapping( expression,
646                                                          moduleArtifactInterpolator( moduleArtifactMock.getArtifact() ),
647                                                          moduleProjectInterpolator( moduleProject ),
648                                                          artifactInterpolator( artifactMock.getArtifact() ),
649                                                          artifactProjectInterpolator( artifactProject ),
650                                                          mainArtifactPropsOnly( mainProject ),
651                                                          classifierRules( artifactMock.getArtifact() ),
652                                                          FixedStringSearchInterpolator.create( new
653                                                          PropertiesBasedValueSource( System.getProperties()  )) );
654 
655          */
656         assertEquals( checkValue, result );
657 
658         mockManager.verifyAll();
659 
660         // clear out for next call.
661         mockManager.resetAll();
662     }
663 
664     private void verifyOutputDir( final String outDir, final String finalName, final String projectFinalName,
665                                   final String checkValue )
666         throws AssemblyFormattingException
667     {
668         verifyOutputDirUsingMainProject( outDir, finalName, null, null, null, projectFinalName, null, checkValue );
669     }
670 
671     private void verifyOutputDirUsingMainProject( final String outDir, final String finalName, final String groupId,
672                                                   final String artifactId, final String version,
673                                                   final String projectFinalName, final Properties properties,
674                                                   final String checkValue )
675         throws AssemblyFormattingException
676     {
677         final MavenProject project = createProject( groupId, artifactId, version, properties );
678 
679         if ( projectFinalName != null )
680         {
681             final Build build = new Build();
682             build.setFinalName( projectFinalName );
683 
684             project.getModel().setBuild( build );
685         }
686 
687         final MavenProject moduleProject = createProject( "unknown", "unknown", "unknown", null );
688         final MavenProject artifactProject = createProject( "unknown", "unknown", "unknown", null );
689 
690         verifyOutputDir( outDir, finalName, project, moduleProject, artifactProject, checkValue );
691     }
692 
693     private void verifyOutputDirUsingModuleProject( final String outDir, final String finalName, final String groupId,
694                                                     final String artifactId, final String version,
695                                                     final String projectFinalName, final Properties properties,
696                                                     final String checkValue )
697         throws AssemblyFormattingException
698     {
699         final MavenProject project = createProject( groupId, artifactId, version, properties );
700 
701         if ( projectFinalName != null )
702         {
703             final Build build = new Build();
704             build.setFinalName( projectFinalName );
705 
706             project.getModel().setBuild( build );
707         }
708 
709         final MavenProject mainProject = createProject( "unknown", "unknown", "unknown", null );
710         final MavenProject artifactProject = createProject( "unknown", "unknown", "unknown", null );
711 
712         verifyOutputDir( outDir, finalName, mainProject, project, artifactProject, checkValue );
713     }
714 
715     private void verifyOutputDirUsingArtifactProject( final String outDir, final String finalName, final String groupId,
716                                                       final String artifactId, final String version,
717                                                       final String projectFinalName, final Properties properties,
718                                                       final String checkValue )
719         throws AssemblyFormattingException
720     {
721         final MavenProject project = createProject( groupId, artifactId, version, properties );
722 
723         if ( projectFinalName != null )
724         {
725             final Build build = new Build();
726             build.setFinalName( projectFinalName );
727 
728             project.getModel().setBuild( build );
729         }
730 
731         final MavenProject moduleProject = createProject( "unknown", "unknown", "unknown", null );
732         final MavenProject mainProject = createProject( "unknown", "unknown", "unknown", null );
733 
734         verifyOutputDir( outDir, finalName, mainProject, moduleProject, project, checkValue );
735     }
736 
737     private void verifyOutputDir( final String outDir, final String finalName, final MavenProject mainProject,
738                                   final MavenProject moduleProject, final MavenProject artifactProject,
739                                   final String checkValue )
740         throws AssemblyFormattingException
741     {
742 
743         final MavenSession session = mockManager.createMock( MavenSession.class );
744         expect( session.getExecutionProperties() ).andReturn( System.getProperties() ).anyTimes();
745 
746         expect( session.getUserProperties() ).andReturn( new Properties() ).anyTimes();
747 
748         final AssemblerConfigurationSource cs = mockManager.createMock( AssemblerConfigurationSource.class );
749         expect( cs.getMavenSession() ).andReturn( session ).anyTimes();
750         DefaultAssemblyArchiverTest.setupInterpolators( cs, mainProject );
751 
752         String result;
753 
754         mockManager.replayAll();
755         result = AssemblyFormatUtils.getOutputDirectory( outDir, finalName, cs,
756                                                          AssemblyFormatUtils.moduleProjectInterpolator( moduleProject ),
757                                                          AssemblyFormatUtils.artifactProjectInterpolator(
758                                                              artifactProject ) );
759 
760         assertEquals( checkValue, result );
761 
762         mockManager.verifyAll();
763 
764         mockManager.resetAll();
765     }
766 
767     private void verifyDistroName( final String assemblyId, final String finalName, final boolean appendAssemblyId,
768                                    final String checkValue )
769     {
770         final MockAndControlForGetDistroName mac =
771             new MockAndControlForGetDistroName( finalName, appendAssemblyId );
772 
773         mockManager.replayAll();
774 
775         final Assembly assembly = new Assembly();
776         assembly.setId( assemblyId );
777 
778         final String result = AssemblyFormatUtils.getDistributionName( assembly, mac.configSource );
779 
780         assertEquals( checkValue, result );
781 
782         mockManager.verifyAll();
783 
784         // clear it out for the next call.
785         mockManager.resetAll();
786     }
787 
788     public void testWindowsPath()
789     {
790         assertTrue( AssemblyFormatUtils.isWindowsPath( "C:\foobar" ) );
791     }
792 
793     public void testLinuxRootReferencePath()
794     {
795         assertTrue( AssemblyFormatUtils.isLinuxRootReference( "/etc/home" ) );
796     }
797 
798 
799     private final class MockAndControlForGetDistroName
800     {
801         final AssemblerConfigurationSource configSource;
802 
803         private final boolean isAssemblyIdAppended;
804 
805         private final String finalName;
806 
807         public MockAndControlForGetDistroName( final String finalName, final boolean isAssemblyIdAppended )
808         {
809             this.finalName = finalName;
810             this.isAssemblyIdAppended = isAssemblyIdAppended;
811 
812             configSource = mockManager.createMock( AssemblerConfigurationSource.class );
813 
814             enableExpectations();
815         }
816 
817         private void enableExpectations()
818         {
819             expect( configSource.isAssemblyIdAppended() ).andReturn( isAssemblyIdAppended ).atLeastOnce();
820 
821             expect( configSource.getFinalName() ).andReturn( finalName ).atLeastOnce();
822         }
823 
824 
825     }
826 
827 }