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