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