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