Author: vmassol Date: Tue Aug 29 08:51:26 2006 New Revision: 438105 URL: http://svn.apache.org/viewvc?rev=438105&view=rev Log: MCLOVER-51: Clover plugin should use the original dependency if it's newer than the clovered one
Modified: maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java maven/plugins/trunk/maven-clover-plugin/src/test/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojoTest.java Modified: maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java?rev=438105&r1=438104&r2=438105&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/main/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojo.java Tue Aug 29 08:51:26 2006 @@ -19,6 +19,8 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.plugin.MojoExecutionException; @@ -256,7 +258,7 @@ swizzleCloverDependencies( getProject().getArtifacts() ) ); } - private Set swizzleCloverDependencies(Set artifacts) + protected Set swizzleCloverDependencies(Set artifacts) { Set resolvedArtifacts = new HashSet(); for ( Iterator i = artifacts.iterator(); i.hasNext(); ) @@ -281,9 +283,30 @@ // Set the same scope as the main artifact as this is not set by createArtifactWithClassifier. cloveredArtifact.setScope( artifact.getScope() ); - resolvedArtifacts.add( cloveredArtifact ); + // Check the timestamp of the artifact. If the found clovered version is older than the + // non-clovered one we need to use the non-clovered version. This is to handle use case such as: + // - Say you have a module B that depends on a module A + // - You run Clover on A + // - You make modifications on A such that B would fail if not built with the latest version of A + // - You try to run the Clover plugin on B. The build would fail if we didn't pick the latest + // version between the original A version and the clovered version. + if (cloveredArtifact.getFile().lastModified() < artifact.getFile().lastModified()) + { + getLog().warn("Using [" + artifact.getId() + "] even though a Clovered version exists " + + "but it's older and could fail the build. Please consider running Clover again on that " + + "dependency's project."); + resolvedArtifacts.add( artifact ); + } + else + { + resolvedArtifacts.add( cloveredArtifact ); + } } - catch ( Exception e ) + catch ( ArtifactResolutionException e ) + { + resolvedArtifacts.add( artifact ); + } + catch ( ArtifactNotFoundException e ) { resolvedArtifacts.add( artifact ); } @@ -457,5 +480,15 @@ } return (String[]) parameters.toArray(new String[0]); + } + + protected void setArtifactFactory(ArtifactFactory artifactFactory) + { + this.artifactFactory = artifactFactory; + } + + protected void setArtifactResolver(ArtifactResolver artifactResolver) + { + this.artifactResolver = artifactResolver; } } Modified: maven/plugins/trunk/maven-clover-plugin/src/test/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojoTest.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-clover-plugin/src/test/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojoTest.java?rev=438105&r1=438104&r2=438105&view=diff ============================================================================== --- maven/plugins/trunk/maven-clover-plugin/src/test/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojoTest.java (original) +++ maven/plugins/trunk/maven-clover-plugin/src/test/java/org/apache/maven/plugin/clover/CloverInstrumentInternalMojoTest.java Tue Aug 29 08:51:26 2006 @@ -18,8 +18,13 @@ import org.jmock.MockObjectTestCase; import org.jmock.Mock; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.plugin.logging.Log; import java.util.Collections; +import java.util.Set; +import java.io.File; /** * Unit tests for [EMAIL PROTECTED] org.apache.maven.plugin.clover.CloverInstrumentInternalMojo}. @@ -29,14 +34,41 @@ */ public class CloverInstrumentInternalMojoTest extends MockObjectTestCase { + private CloverInstrumentInternalMojo mojo; + + /** + * Class used to return a given value when lastModified is called. This is because File.getLastModified always + * return 0L if the file doesn't exist and our tests below do not point to existing files. + */ + public class MockFile extends File + { + private long lastModifiedDate; + + public MockFile(String file, long lastModifiedDate) + { + super(file); + this.lastModifiedDate = lastModifiedDate; + } + + public long lastModified() + { + return this.lastModifiedDate; + } + } + + protected void setUp() throws Exception + { + super.setUp(); + this.mojo = new CloverInstrumentInternalMojo(); + } + public void testFindCloverArtifactWithCorrectArtifactIdButWrongGroupId() { Mock mockArtifact = mock(Artifact.class); mockArtifact.stubs().method( "getArtifactId" ).will( returnValue( "clover" ) ); mockArtifact.stubs().method( "getGroupId" ).will( returnValue( "notcenquaid" ) ); - CloverInstrumentInternalMojo mojo = new CloverInstrumentInternalMojo(); - Artifact clover = mojo.findCloverArtifact( Collections.singletonList( mockArtifact.proxy() ) ); + Artifact clover = this.mojo.findCloverArtifact( Collections.singletonList( mockArtifact.proxy() ) ); assertNull( "Clover artifact should not have been found!", clover ); } @@ -47,9 +79,92 @@ mockArtifact.stubs().method( "getArtifactId" ).will( returnValue( "clover" ) ); mockArtifact.stubs().method( "getGroupId" ).will( returnValue( "com.cenqua.clover" ) ); - CloverInstrumentInternalMojo mojo = new CloverInstrumentInternalMojo(); - Artifact clover = mojo.findCloverArtifact( Collections.singletonList( mockArtifact.proxy() ) ); + Artifact clover = this.mojo.findCloverArtifact( Collections.singletonList( mockArtifact.proxy() ) ); assertNotNull( "Clover artifact should have been found!", clover ); + } + + public void testSwizzleCloverDependenciesWhenDependencyHasClassifier() + { + Artifact artifact = setUpMockArtifact( "some.groupId", "someArtifactId", "1.0", "jar", "compile", "whatever", + null ); + + Set resultSet = this.mojo.swizzleCloverDependencies( Collections.singleton( artifact ) ); + assertEquals( 1, resultSet.size() ); + assertTrue( "Resulting artifact should have been the original one", resultSet.contains( artifact ) ); + } + + public void testSwizzleCloverDependenciesWhenCloveredVersionOfDependencyIsNewerThanOriginal() + { + // Ensure that the original artifact is older than the clovered artifact so that the clovered artifact + // is picked. Note that that we use -500/-1000 to ensure not to set the time in the future as maybe + // this could cause some problems on some OS. + long now = System.currentTimeMillis(); + File artifactFile = new MockFile( "some/file/artifact", now - 1000L ); + File cloveredArtifactFile = new MockFile( "some/file/cloveredArtifact", now - 500L ); + + Artifact artifact = setUpMockArtifact( "some.groupId", "someArtifactId", "1.0", "jar", "compile", null, + artifactFile ); + Artifact cloveredArtifact = setUpMockArtifact( null, null, null, null, null, null, cloveredArtifactFile ); + + setUpCommonMocksForSwizzleCloverDependenciesTests(cloveredArtifact); + + Set resultSet = this.mojo.swizzleCloverDependencies( Collections.singleton( artifact ) ); + assertEquals( 1, resultSet.size() ); + assertTrue( "Resulting artifact should have been the clovered one", resultSet.contains( cloveredArtifact ) ); + } + + public void testSwizzleCloverDependenciesWhenOriginalVersionOfDependencyIsNewerThanCloveredOne() + { + // Ensure that the clovered artifact is older than the original artifact so that the original artifact + // is picked. Note that that we use -500/-1000 to ensure not to set the time in the future as maybe + // this could cause some problems on some OS. + long now = System.currentTimeMillis(); + File artifactFile = new MockFile( "some/file/artifact", now - 500L ); + File cloveredArtifactFile = new MockFile( "some/file/cloveredArtifact", now - 1000L ); + + Artifact artifact = setUpMockArtifact( "some.groupId", "someArtifactId", "1.0", "jar", "compile", null, + artifactFile ); + Artifact cloveredArtifact = setUpMockArtifact( null, null, null, null, null, null, cloveredArtifactFile ); + + setUpCommonMocksForSwizzleCloverDependenciesTests(cloveredArtifact); + + Set resultSet = this.mojo.swizzleCloverDependencies( Collections.singleton( artifact ) ); + assertEquals( 1, resultSet.size() ); + assertTrue( "Resulting artifact should have been the original one", resultSet.contains( artifact ) ); + } + + private void setUpCommonMocksForSwizzleCloverDependenciesTests(Artifact cloveredArtifact) + { + Mock mockArtifactFactory = mock( ArtifactFactory.class ); + mockArtifactFactory.stubs().method( "createArtifactWithClassifier" ).will(returnValue( cloveredArtifact ) ); + + Mock mockArtifactResolver = mock( ArtifactResolver.class ); + mockArtifactResolver.stubs().method( "resolve" ); + + Mock mockLog = mock( Log.class ); + mockLog.stubs().method( "warn" ); + + this.mojo.setArtifactFactory( ( ArtifactFactory ) mockArtifactFactory.proxy() ); + this.mojo.setArtifactResolver( ( ArtifactResolver ) mockArtifactResolver.proxy() ); + this.mojo.setLog( (Log) mockLog.proxy() ); + } + + private Artifact setUpMockArtifact(String groupId, String artifactId, String version, String type, String scope, + String classifier, File file) + { + Mock mockArtifact = mock( Artifact.class ); + mockArtifact.stubs().method( "getClassifier" ).will( returnValue( classifier ) ); + mockArtifact.stubs().method( "getGroupId" ).will( returnValue( groupId ) ); + mockArtifact.stubs().method( "getArtifactId" ).will( returnValue( artifactId ) ); + mockArtifact.stubs().method( "getVersion" ).will( returnValue( version ) ); + mockArtifact.stubs().method( "getType" ).will( returnValue( type ) ); + mockArtifact.stubs().method( "getScope" ).will( returnValue( scope ) ); + mockArtifact.stubs().method( "getFile" ).will( returnValue ( file ) ); + mockArtifact.stubs().method( "getId" ).will( returnValue ( + groupId + ":" + artifactId + ":" + version + ":" + classifier ) ); + mockArtifact.stubs().method( "setScope" ); + + return (Artifact) mockArtifact.proxy(); } }