1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
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
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
253
254
255
256
257
258
259
260
261
262
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 }