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