001 package org.apache.maven.model.interpolation; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import org.apache.maven.model.Build; 023 import org.apache.maven.model.Dependency; 024 import org.apache.maven.model.Model; 025 import org.apache.maven.model.Organization; 026 import org.apache.maven.model.Repository; 027 import org.apache.maven.model.Resource; 028 import org.apache.maven.model.Scm; 029 import org.apache.maven.model.building.DefaultModelBuildingRequest; 030 import org.apache.maven.model.building.ModelBuildingRequest; 031 import org.apache.maven.model.building.SimpleProblemCollector; 032 import org.apache.maven.model.path.PathTranslator; 033 import org.codehaus.plexus.PlexusTestCase; 034 035 import java.io.File; 036 import java.text.SimpleDateFormat; 037 import java.util.Calendar; 038 import java.util.Date; 039 import java.util.Iterator; 040 import java.util.List; 041 import java.util.Properties; 042 043 /** 044 * @author jdcasey 045 */ 046 public abstract class AbstractModelInterpolatorTest 047 extends PlexusTestCase 048 { 049 private Properties context; 050 051 protected void setUp() 052 throws Exception 053 { 054 super.setUp(); 055 056 context = new Properties(); 057 context.put( "basedir", "myBasedir" ); 058 context.put( "project.baseUri", "myBaseUri" ); 059 } 060 061 062 protected void assertProblemFree( SimpleProblemCollector collector ) 063 { 064 assertEquals( "Expected no errors", 0, collector.getErrors().size() ); 065 assertEquals( "Expected no warnings", 0, collector.getWarnings().size() ); 066 assertEquals( "Expected no fatals", 0, collector.getFatals().size() ); 067 } 068 069 protected void assertColllectorState( int numFatals, int numErrors, int numWarnings, 070 SimpleProblemCollector collector ) 071 { 072 assertEquals( "Errors", numErrors, collector.getErrors().size() ); 073 assertEquals( "Warnings", numWarnings, collector.getWarnings().size() ); 074 assertEquals( "Fatals", numFatals, collector.getFatals().size() ); 075 } 076 077 private ModelBuildingRequest createModelBuildingRequest( Properties p ) 078 { 079 ModelBuildingRequest config = new DefaultModelBuildingRequest(); 080 if ( p != null ) 081 { 082 config.setSystemProperties( p ); 083 } 084 return config; 085 } 086 087 public void testDefaultBuildTimestampFormatShouldParseTimeIn24HourFormat() 088 { 089 Calendar cal = Calendar.getInstance(); 090 cal.set( Calendar.HOUR, 12 ); 091 cal.set( Calendar.AM_PM, Calendar.AM ); 092 093 // just to make sure all the bases are covered... 094 cal.set( Calendar.HOUR_OF_DAY, 0 ); 095 cal.set( Calendar.MINUTE, 16 ); 096 cal.set( Calendar.YEAR, 1976 ); 097 cal.set( Calendar.MONTH, Calendar.NOVEMBER ); 098 cal.set( Calendar.DATE, 11 ); 099 100 Date firstTestDate = cal.getTime(); 101 102 cal.set( Calendar.HOUR, 11 ); 103 cal.set( Calendar.AM_PM, Calendar.PM ); 104 105 // just to make sure all the bases are covered... 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 // This is the desired behaviour, however there are too many crappy poms in the repo and an issue with the 239 // timing of executing the interpolation 240 241 try 242 { 243 new RegexBasedModelInterpolator().interpolate( model, context ); 244 fail( "Should have failed to interpolate with invalid reference" ); 245 } 246 catch ( ModelInterpolationException expected ) 247 { 248 assertTrue( true ); 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 }