Author: brett Date: Mon Apr 3 00:33:47 2006 New Revision: 390972 URL: http://svn.apache.org/viewcvs?rev=390972&view=rev Log: [ARCHETYPE-13] make the test case useful Submitted by: Eric Redmond
Modified: maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java Modified: maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java URL: http://svn.apache.org/viewcvs/maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java?rev=390972&r1=390971&r2=390972&view=diff ============================================================================== --- maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java (original) +++ maven/archetype/trunk/maven-archetype-core/src/test/java/org/apache/maven/archetype/ArchetypeTest.java Mon Apr 3 00:33:47 2006 @@ -16,14 +16,33 @@ * limitations under the License. */ +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.DefaultArtifactRepository; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactResolver; +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.context.Context; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.util.FileUtils; +import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.codehaus.plexus.velocity.VelocityComponent; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -74,9 +93,137 @@ remoteRepositories.add( remoteRepository ); - archetype.createArchetype( "org.apache.maven.archetypes", "maven-archetype-quickstart", "1.0-alpha-1-SNAPSHOT", - localRepository, remoteRepositories, parameters ); + String archetypeGroupId = "org.apache.maven.archetypes"; + String archetypeArtifactId = "maven-archetype-quickstart"; + String archetypeVersion = "1.0-alpha-1-SNAPSHOT"; + archetype.createArchetype( archetypeGroupId, archetypeArtifactId, archetypeVersion, localRepository, + remoteRepositories, parameters ); - // TODO: validate output + // ---------------------------------------------------------------------- + // Set up the Velocity context + // ---------------------------------------------------------------------- + + Context context = new VelocityContext(); + + for ( Iterator iterator = parameters.keySet().iterator(); iterator.hasNext(); ) + { + String key = (String) iterator.next(); + + Object value = parameters.get( key ); + + context.put( key, value ); + } + + // ---------------------------------------------------------------------- + // Validate POM generation + // ---------------------------------------------------------------------- + + ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() ); + Artifact archetypeArtifact = artifactFactory.createArtifact( archetypeGroupId, archetypeArtifactId, + archetypeVersion, Artifact.SCOPE_RUNTIME, "jar" ); + + StringWriter writer = new StringWriter(); + + ClassLoader old = Thread.currentThread().getContextClassLoader(); + + Thread.currentThread().setContextClassLoader( + getContextClassloader( archetypeArtifact, localRepository, remoteRepositories ) ); + + try + { + VelocityComponent velocity = (VelocityComponent) lookup( VelocityComponent.class.getName() ); + + velocity.getEngine().mergeTemplate( Archetype.ARCHETYPE_RESOURCES + "/" + Archetype.ARCHETYPE_POM, context, + writer ); + } + finally + { + Thread.currentThread().setContextClassLoader( old ); + } + + Model generatedModel, templateModel; + try + { + StringReader strReader = new StringReader( writer.toString() ); + + MavenXpp3Reader reader = new MavenXpp3Reader(); + + templateModel = reader.read( strReader ); + } + catch ( IOException e ) + { + throw new ArchetypeTemplateProcessingException( "Error reading template POM", e ); + } + + File artifactDir = getTestFile( "target", (String) parameters.get( "artifactId" ) ); + File pomFile = getTestFile( artifactDir.getAbsolutePath(), Archetype.ARCHETYPE_POM ); + + try + { + FileReader pomReader = new FileReader( pomFile ); + + MavenXpp3Reader reader = new MavenXpp3Reader(); + + generatedModel = reader.read( pomReader ); + } + catch ( IOException e ) + { + throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e ); + } + catch ( XmlPullParserException e ) + { + throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e ); + } + assertEquals( "Generated POM ArtifactId is not equivalent to expected result.", generatedModel.getArtifactId(), + templateModel.getArtifactId() ); + assertEquals( "Generated POM GroupId is not equivalent to expected result.", generatedModel.getGroupId(), + templateModel.getGroupId() ); + assertEquals( "Generated POM Id is not equivalent to expected result.", generatedModel.getId(), + templateModel.getId() ); + assertEquals( "Generated POM Version is not equivalent to expected result.", generatedModel.getVersion(), + templateModel.getVersion() ); + assertEquals( "Generated POM Packaging is not equivalent to expected result.", generatedModel.getPackaging(), + templateModel.getPackaging() ); + assertEquals( "Generated POM Developers is not equivalent to expected result.", generatedModel.getDevelopers(), + templateModel.getDevelopers() ); + assertEquals( "Generated POM Scm is not equivalent to expected result.", generatedModel.getScm(), + templateModel.getScm() ); + } + + // Gets the classloader for this artifact's file. + private ClassLoader getContextClassloader( Artifact archetypeArtifact, ArtifactRepository localRepository, + List remoteRepositories ) + throws Exception + { + ArtifactResolver artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() ); + try + { + artifactResolver.resolve( archetypeArtifact, remoteRepositories, localRepository ); + } + catch ( ArtifactResolutionException e ) + { + throw new ArchetypeDescriptorException( "Error attempting to download archetype: " + e.getMessage(), e ); + } + catch ( ArtifactNotFoundException e ) + { + throw new ArchetypeNotFoundException( "Archetype does not exist: " + e.getMessage(), e ); + } + + URLClassLoader archetypeJarLoader; + try + { + URL[] urls = new URL[1]; + + urls[0] = archetypeArtifact.getFile().toURL(); + + archetypeJarLoader = new URLClassLoader( urls ); + } + catch ( IOException e ) + { + throw new ArchetypeDescriptorException( + "Error reading the " + Archetype.ARCHETYPE_DESCRIPTOR + " descriptor.", e ); + } + + return archetypeJarLoader; } }