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