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.model.interpolation;
20  
21  import java.io.File;
22  import java.text.SimpleDateFormat;
23  import java.util.Calendar;
24  import java.util.Date;
25  import java.util.Iterator;
26  import java.util.List;
27  import java.util.Properties;
28  import java.util.TimeZone;
29  
30  import org.apache.maven.model.Build;
31  import org.apache.maven.model.Dependency;
32  import org.apache.maven.model.Model;
33  import org.apache.maven.model.Organization;
34  import org.apache.maven.model.Repository;
35  import org.apache.maven.model.Resource;
36  import org.apache.maven.model.Scm;
37  import org.apache.maven.model.building.DefaultModelBuildingRequest;
38  import org.apache.maven.model.building.ModelBuildingRequest;
39  import org.apache.maven.model.building.SimpleProblemCollector;
40  import org.apache.maven.model.path.PathTranslator;
41  import org.junit.jupiter.api.Test;
42  
43  import static org.junit.jupiter.api.Assertions.assertEquals;
44  import static org.junit.jupiter.api.Assertions.assertNotNull;
45  
46  /**
47   * @author jdcasey
48   */
49  public abstract class AbstractModelInterpolatorTest {
50      private Properties context;
51  
52      protected void setUp() throws Exception {
53          context = new Properties();
54          context.put("basedir", "myBasedir");
55          context.put("project.baseUri", "myBaseUri");
56      }
57  
58      protected void assertProblemFree(SimpleProblemCollector collector) {
59          assertEquals(0, collector.getErrors().size(), "Expected no errors");
60          assertEquals(0, collector.getWarnings().size(), "Expected no warnings");
61          assertEquals(0, collector.getFatals().size(), "Expected no fatals");
62      }
63  
64      /**
65       * @deprecated instead use {@link #assertCollectorState(int, int, int, SimpleProblemCollector)}
66       */
67      @Deprecated
68      protected void assertColllectorState(
69              int numFatals, int numErrors, int numWarnings, SimpleProblemCollector collector) {
70          assertEquals(numErrors, collector.getErrors().size(), "Errors");
71          assertEquals(numWarnings, collector.getWarnings().size(), "Warnings");
72          assertEquals(numFatals, collector.getFatals().size(), "Fatals");
73      }
74  
75      protected void assertCollectorState(
76              int numFatals, int numErrors, int numWarnings, SimpleProblemCollector collector) {
77          assertColllectorState(numFatals, numErrors, numWarnings, collector);
78      }
79  
80      private ModelBuildingRequest createModelBuildingRequest(Properties p) {
81          ModelBuildingRequest config = new DefaultModelBuildingRequest();
82          if (p != null) {
83              config.setSystemProperties(p);
84          }
85          return config;
86      }
87  
88      @Test
89      public void testDefaultBuildTimestampFormatShouldFormatTimeIn24HourFormat() {
90          Calendar cal = Calendar.getInstance();
91          cal.setTimeZone(MavenBuildTimestamp.DEFAULT_BUILD_TIME_ZONE);
92          cal.set(Calendar.HOUR, 12);
93          cal.set(Calendar.AM_PM, Calendar.AM);
94  
95          // just to make sure all the bases are covered...
96          cal.set(Calendar.HOUR_OF_DAY, 0);
97          cal.set(Calendar.MINUTE, 16);
98          cal.set(Calendar.SECOND, 0);
99          cal.set(Calendar.YEAR, 1976);
100         cal.set(Calendar.MONTH, Calendar.NOVEMBER);
101         cal.set(Calendar.DATE, 11);
102 
103         Date firstTestDate = cal.getTime();
104 
105         cal.set(Calendar.HOUR, 11);
106         cal.set(Calendar.AM_PM, Calendar.PM);
107 
108         // just to make sure all the bases are covered...
109         cal.set(Calendar.HOUR_OF_DAY, 23);
110 
111         Date secondTestDate = cal.getTime();
112 
113         SimpleDateFormat format = new SimpleDateFormat(MavenBuildTimestamp.DEFAULT_BUILD_TIMESTAMP_FORMAT);
114         format.setTimeZone(MavenBuildTimestamp.DEFAULT_BUILD_TIME_ZONE);
115         assertEquals("1976-11-11T00:16:00Z", format.format(firstTestDate));
116         assertEquals("1976-11-11T23:16:00Z", format.format(secondTestDate));
117     }
118 
119     @Test
120     public void testDefaultBuildTimestampFormatWithLocalTimeZoneMidnightRollover() {
121         Calendar cal = Calendar.getInstance();
122         cal.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
123 
124         cal.set(Calendar.HOUR_OF_DAY, 1);
125         cal.set(Calendar.MINUTE, 16);
126         cal.set(Calendar.SECOND, 0);
127         cal.set(Calendar.YEAR, 2014);
128         cal.set(Calendar.MONTH, Calendar.JUNE);
129         cal.set(Calendar.DATE, 16);
130 
131         Date firstTestDate = cal.getTime();
132 
133         cal.set(Calendar.MONTH, Calendar.NOVEMBER);
134 
135         Date secondTestDate = cal.getTime();
136 
137         SimpleDateFormat format = new SimpleDateFormat(MavenBuildTimestamp.DEFAULT_BUILD_TIMESTAMP_FORMAT);
138         format.setTimeZone(MavenBuildTimestamp.DEFAULT_BUILD_TIME_ZONE);
139         assertEquals("2014-06-15T23:16:00Z", format.format(firstTestDate));
140         assertEquals("2014-11-16T00:16:00Z", format.format(secondTestDate));
141     }
142 
143     @Test
144     public void testShouldNotThrowExceptionOnReferenceToNonExistentValue() throws Exception {
145         Model model = new Model();
146 
147         Scm scm = new Scm();
148         scm.setConnection("${test}/somepath");
149 
150         model.setScm(scm);
151 
152         ModelInterpolator interpolator = createInterpolator();
153 
154         final SimpleProblemCollector collector = new SimpleProblemCollector();
155         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
156 
157         assertProblemFree(collector);
158         assertEquals("${test}/somepath", out.getScm().getConnection());
159     }
160 
161     @Test
162     public void testShouldThrowExceptionOnRecursiveScmConnectionReference() throws Exception {
163         Model model = new Model();
164 
165         Scm scm = new Scm();
166         scm.setConnection("${project.scm.connection}/somepath");
167 
168         model.setScm(scm);
169 
170         try {
171             ModelInterpolator interpolator = createInterpolator();
172 
173             final SimpleProblemCollector collector = new SimpleProblemCollector();
174             interpolator.interpolateModel(model, null, createModelBuildingRequest(context), collector);
175             assertCollectorState(0, 1, 0, collector);
176         } catch (Exception e) {
177 
178         }
179     }
180 
181     @Test
182     public void testShouldNotThrowExceptionOnReferenceToValueContainingNakedExpression() throws Exception {
183         Model model = new Model();
184 
185         Scm scm = new Scm();
186         scm.setConnection("${test}/somepath");
187 
188         model.setScm(scm);
189 
190         model.addProperty("test", "test");
191 
192         ModelInterpolator interpolator = createInterpolator();
193 
194         final SimpleProblemCollector collector = new SimpleProblemCollector();
195         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
196 
197         assertProblemFree(collector);
198 
199         assertEquals("test/somepath", out.getScm().getConnection());
200     }
201 
202     @Test
203     public void testShouldInterpolateOrganizationNameCorrectly() throws Exception {
204         String orgName = "MyCo";
205 
206         Model model = new Model();
207         model.setName("${pom.organization.name} Tools");
208 
209         Organization org = new Organization();
210         org.setName(orgName);
211 
212         model.setOrganization(org);
213 
214         ModelInterpolator interpolator = createInterpolator();
215 
216         Model out = interpolator.interpolateModel(
217                 model, new File("."), createModelBuildingRequest(context), new SimpleProblemCollector());
218 
219         assertEquals(orgName + " Tools", out.getName());
220     }
221 
222     @Test
223     public void testShouldInterpolateDependencyVersionToSetSameAsProjectVersion() throws Exception {
224         Model model = new Model();
225         model.setVersion("3.8.1");
226 
227         Dependency dep = new Dependency();
228         dep.setVersion("${version}");
229 
230         model.addDependency(dep);
231 
232         ModelInterpolator interpolator = createInterpolator();
233 
234         final SimpleProblemCollector collector = new SimpleProblemCollector();
235         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
236         assertCollectorState(0, 0, 1, collector);
237 
238         assertEquals("3.8.1", (out.getDependencies().get(0)).getVersion());
239     }
240 
241     @Test
242     public void testShouldNotInterpolateDependencyVersionWithInvalidReference() throws Exception {
243         Model model = new Model();
244         model.setVersion("3.8.1");
245 
246         Dependency dep = new Dependency();
247         dep.setVersion("${something}");
248 
249         model.addDependency(dep);
250 
251         /*
252         // This is the desired behaviour, however there are too many crappy poms in the repo and an issue with the
253         // timing of executing the interpolation
254 
255         try
256         {
257         new RegexBasedModelInterpolator().interpolate( model, context );
258         fail( "Should have failed to interpolate with invalid reference" );
259         }
260         catch ( ModelInterpolationException expected )
261         {
262         assertTrue( true );
263         }
264         */
265 
266         ModelInterpolator interpolator = createInterpolator();
267 
268         final SimpleProblemCollector collector = new SimpleProblemCollector();
269         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
270         assertProblemFree(collector);
271 
272         assertEquals("${something}", (out.getDependencies().get(0)).getVersion());
273     }
274 
275     @Test
276     public void testTwoReferences() throws Exception {
277         Model model = new Model();
278         model.setVersion("3.8.1");
279         model.setArtifactId("foo");
280 
281         Dependency dep = new Dependency();
282         dep.setVersion("${artifactId}-${version}");
283 
284         model.addDependency(dep);
285 
286         ModelInterpolator interpolator = createInterpolator();
287 
288         final SimpleProblemCollector collector = new SimpleProblemCollector();
289         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
290         assertCollectorState(0, 0, 2, collector);
291 
292         assertEquals("foo-3.8.1", (out.getDependencies().get(0)).getVersion());
293     }
294 
295     @Test
296     public void testBasedir() throws Exception {
297         Model model = new Model();
298         model.setVersion("3.8.1");
299         model.setArtifactId("foo");
300 
301         Repository repository = new Repository();
302 
303         repository.setUrl("file://localhost/${basedir}/temp-repo");
304 
305         model.addRepository(repository);
306 
307         ModelInterpolator interpolator = createInterpolator();
308 
309         final SimpleProblemCollector collector = new SimpleProblemCollector();
310         Model out = interpolator.interpolateModel(model, null, createModelBuildingRequest(context), collector);
311         assertProblemFree(collector);
312 
313         assertEquals(
314                 "file://localhost/myBasedir/temp-repo", (out.getRepositories().get(0)).getUrl());
315     }
316 
317     @Test
318     public void testBaseUri() throws Exception {
319         Model model = new Model();
320         model.setVersion("3.8.1");
321         model.setArtifactId("foo");
322 
323         Repository repository = new Repository();
324 
325         repository.setUrl("${project.baseUri}/temp-repo");
326 
327         model.addRepository(repository);
328 
329         ModelInterpolator interpolator = createInterpolator();
330 
331         final SimpleProblemCollector collector = new SimpleProblemCollector();
332         Model out = interpolator.interpolateModel(model, null, createModelBuildingRequest(context), collector);
333         assertProblemFree(collector);
334 
335         assertEquals("myBaseUri/temp-repo", (out.getRepositories().get(0)).getUrl());
336     }
337 
338     @Test
339     public void testEnvars() throws Exception {
340         Properties context = new Properties();
341 
342         context.put("env.HOME", "/path/to/home");
343 
344         Model model = new Model();
345 
346         Properties modelProperties = new Properties();
347 
348         modelProperties.setProperty("outputDirectory", "${env.HOME}");
349 
350         model.setProperties(modelProperties);
351 
352         ModelInterpolator interpolator = createInterpolator();
353 
354         final SimpleProblemCollector collector = new SimpleProblemCollector();
355         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
356         assertProblemFree(collector);
357 
358         assertEquals("/path/to/home", out.getProperties().getProperty("outputDirectory"));
359     }
360 
361     @Test
362     public void testEnvarExpressionThatEvaluatesToNullReturnsTheLiteralString() throws Exception {
363         Model model = new Model();
364 
365         Properties modelProperties = new Properties();
366 
367         modelProperties.setProperty("outputDirectory", "${env.DOES_NOT_EXIST}");
368 
369         model.setProperties(modelProperties);
370 
371         ModelInterpolator interpolator = createInterpolator();
372 
373         final SimpleProblemCollector collector = new SimpleProblemCollector();
374         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
375         assertProblemFree(collector);
376 
377         assertEquals(out.getProperties().getProperty("outputDirectory"), "${env.DOES_NOT_EXIST}");
378     }
379 
380     @Test
381     public void testExpressionThatEvaluatesToNullReturnsTheLiteralString() throws Exception {
382         Model model = new Model();
383 
384         Properties modelProperties = new Properties();
385 
386         modelProperties.setProperty("outputDirectory", "${DOES_NOT_EXIST}");
387 
388         model.setProperties(modelProperties);
389 
390         ModelInterpolator interpolator = createInterpolator();
391 
392         final SimpleProblemCollector collector = new SimpleProblemCollector();
393         Model out = interpolator.interpolateModel(model, new File("."), createModelBuildingRequest(context), collector);
394         assertProblemFree(collector);
395 
396         assertEquals(out.getProperties().getProperty("outputDirectory"), "${DOES_NOT_EXIST}");
397     }
398 
399     @Test
400     public void testShouldInterpolateSourceDirectoryReferencedFromResourceDirectoryCorrectly() throws Exception {
401         Model model = new Model();
402 
403         Build build = new Build();
404         build.setSourceDirectory("correct");
405 
406         Resource res = new Resource();
407         res.setDirectory("${project.build.sourceDirectory}");
408 
409         build.addResource(res);
410 
411         Resource res2 = new Resource();
412         res2.setDirectory("${pom.build.sourceDirectory}");
413 
414         build.addResource(res2);
415 
416         Resource res3 = new Resource();
417         res3.setDirectory("${build.sourceDirectory}");
418 
419         build.addResource(res3);
420 
421         model.setBuild(build);
422 
423         ModelInterpolator interpolator = createInterpolator();
424 
425         final SimpleProblemCollector collector = new SimpleProblemCollector();
426         Model out = interpolator.interpolateModel(model, null, createModelBuildingRequest(context), collector);
427         assertCollectorState(0, 0, 2, collector);
428 
429         List<Resource> outResources = out.getBuild().getResources();
430         Iterator<Resource> resIt = outResources.iterator();
431 
432         assertEquals(build.getSourceDirectory(), resIt.next().getDirectory());
433         assertEquals(build.getSourceDirectory(), resIt.next().getDirectory());
434         assertEquals(build.getSourceDirectory(), resIt.next().getDirectory());
435     }
436 
437     @Test
438     public void testShouldInterpolateUnprefixedBasedirExpression() throws Exception {
439         File basedir = new File("/test/path");
440         Model model = new Model();
441         Dependency dep = new Dependency();
442         dep.setSystemPath("${basedir}/artifact.jar");
443 
444         model.addDependency(dep);
445 
446         ModelInterpolator interpolator = createInterpolator();
447 
448         final SimpleProblemCollector collector = new SimpleProblemCollector();
449         Model result = interpolator.interpolateModel(model, basedir, createModelBuildingRequest(context), collector);
450         assertProblemFree(collector);
451 
452         List<Dependency> rDeps = result.getDependencies();
453         assertNotNull(rDeps);
454         assertEquals(1, rDeps.size());
455         assertEquals(
456                 new File(basedir, "artifact.jar").getAbsolutePath(),
457                 new File(rDeps.get(0).getSystemPath()).getAbsolutePath());
458     }
459 
460     protected abstract ModelInterpolator createInterpolator(PathTranslator translator) throws Exception;
461 
462     protected abstract ModelInterpolator createInterpolator() throws Exception;
463 }