Author: kenney Date: Tue Feb 27 13:51:50 2007 New Revision: 512437 URL: http://svn.apache.org/viewvc?view=rev&rev=512437 Log: * Added getMavenVersion call to the Verifier
* Added a flag to run maven internally instead of forked (using reflection), nice for in IDE's. * Added possibility to skip tests for certain maven versions, specified by a versionrange * made it26 and it31 only run for 2.0.x * added dependency to maven-artifact 2.0.5 on core-integration-tests for the VerionRange and DefaultArtifactVersion. Modified: maven/core-integration-testing/trunk/core-integration-tests/pom.xml maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/AbstractMavenIntegrationTestCase.java maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/IntegrationTestSuite.java maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0026Test.java maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0031Test.java maven/shared/trunk/maven-verifier/src/main/java/org/apache/maven/it/Verifier.java Modified: maven/core-integration-testing/trunk/core-integration-tests/pom.xml URL: http://svn.apache.org/viewvc/maven/core-integration-testing/trunk/core-integration-tests/pom.xml?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/core-integration-testing/trunk/core-integration-tests/pom.xml (original) +++ maven/core-integration-testing/trunk/core-integration-tests/pom.xml Tue Feb 27 13:51:50 2007 @@ -34,10 +34,16 @@ </plugins> </build> <dependencies> + <!-- needed for VersionRange and Version --> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact</artifactId> + <version>2.0.5</version> + </dependency> <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-verifier</artifactId> - <version>1.0</version> + <version>1.1-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> Modified: maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/AbstractMavenIntegrationTestCase.java URL: http://svn.apache.org/viewvc/maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/AbstractMavenIntegrationTestCase.java?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/AbstractMavenIntegrationTestCase.java (original) +++ maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/AbstractMavenIntegrationTestCase.java Tue Feb 27 13:51:50 2007 @@ -1,5 +1,8 @@ package org.apache.maven.integrationtests; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.it.util.FileUtils; import java.io.File; @@ -15,18 +18,57 @@ public abstract class AbstractMavenIntegrationTestCase extends TestCase { + /** + * Save System.out for progress reports etc. + */ + private static PrintStream out = System.out; + + private boolean skip; + + private DefaultArtifactVersion version; + + private VersionRange versionRange; + + protected AbstractMavenIntegrationTestCase() + { + } + + protected AbstractMavenIntegrationTestCase( String versionRangeStr ) + throws InvalidVersionSpecificationException + { + this.versionRange = VersionRange.createFromVersionSpec( versionRangeStr ); + + String v = System.getProperty( "maven.version" ); + if ( v != null ) + { + this.version = new DefaultArtifactVersion( v ); + if ( !versionRange.containsVersion( this.version ) ) + { + skip = true; + } + } + else + { + out.print( "WARNING: " + getITName() + ": version range '" + versionRange + + "' supplied but no maven version - not skipping test." ); + } + } + protected void runTest() throws Throwable { + out.print( getITName() + "(" + getName() + ").." ); + + if ( skip ) + { + out.println( " Skipping (version " + version + " not in range " + versionRange + ")" ); + return; + } + if ( "true".equals( System.getProperty( "useEmptyLocalRepository", "false" ) ) ) { setupLocalRepo(); } - - // save System.out since running the test will replace it - PrintStream out = System.out; - - out.print( getITName() + "(" + getName() + ").." ); try { Modified: maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/IntegrationTestSuite.java URL: http://svn.apache.org/viewvc/maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/IntegrationTestSuite.java?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/IntegrationTestSuite.java (original) +++ maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/IntegrationTestSuite.java Tue Feb 27 13:51:50 2007 @@ -1,13 +1,26 @@ package org.apache.maven.integrationtests; +import org.apache.maven.it.VerificationException; +import org.apache.maven.it.Verifier; + +import java.io.PrintStream; + import junit.framework.Test; import junit.framework.TestSuite; public class IntegrationTestSuite extends AbstractMavenIntegrationTestCase { - public static Test suite() + private static PrintStream out = System.out; + + public static Test suite() throws VerificationException { + String mavenVersion = new Verifier( "" ).getMavenVersion(); + + out.println( "Running integration tests for Maven " + mavenVersion ); + + System.setProperty( "maven.version", mavenVersion ); + TestSuite suite = new TestSuite(); suite.addTestSuite( MavenIT0000Test.class ); suite.addTestSuite( MavenIT0001Test.class ); Modified: maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0026Test.java URL: http://svn.apache.org/viewvc/maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0026Test.java?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0026Test.java (original) +++ maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0026Test.java Tue Feb 27 13:51:50 2007 @@ -1,5 +1,6 @@ package org.apache.maven.integrationtests; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.it.Verifier; import org.apache.maven.it.util.ResourceExtractor; @@ -9,6 +10,11 @@ public class MavenIT0026Test extends AbstractMavenIntegrationTestCase { + public MavenIT0026Test() + throws InvalidVersionSpecificationException + { + super( "[,2.1-SNAPSHOT)" ); + } /** * Test merging of global- and user-level settings.xml files. @@ -29,4 +35,3 @@ } } - Modified: maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0031Test.java URL: http://svn.apache.org/viewvc/maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0031Test.java?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0031Test.java (original) +++ maven/core-integration-testing/trunk/core-integration-tests/src/test/java/org/apache/maven/integrationtests/MavenIT0031Test.java Tue Feb 27 13:51:50 2007 @@ -1,5 +1,6 @@ package org.apache.maven.integrationtests; +import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.it.Verifier; import org.apache.maven.it.util.ResourceExtractor; @@ -9,11 +10,15 @@ public class MavenIT0031Test extends AbstractMavenIntegrationTestCase { + public MavenIT0031Test() + throws InvalidVersionSpecificationException + { + super( "[,2.1-SNAPSHOT)" ); + } /** - * Test usage of plugins.xml mapping file on the repository to resolve - * plugin artifactId from it's prefix using the pluginGroups in - * the provided settings.xml. + * Test usage of plugins.xml mapping file on the repository to resolve plugin artifactId from it's prefix using the + * pluginGroups in the provided settings.xml. */ public void testit0031() throws Exception @@ -30,9 +35,8 @@ verifier.setVerifierProperties( verifierProperties ); verifier.executeGoal( "modello:java" ); verifier.assertFilePresent( "target/generated-sources/modello/org/apache/maven/it/it0031/Root.java" ); -// don't verify error free log + // don't verify error free log verifier.resetStreams(); } -} - +} \ No newline at end of file Modified: maven/shared/trunk/maven-verifier/src/main/java/org/apache/maven/it/Verifier.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-verifier/src/main/java/org/apache/maven/it/Verifier.java?view=diff&rev=512437&r1=512436&r2=512437 ============================================================================== --- maven/shared/trunk/maven-verifier/src/main/java/org/apache/maven/it/Verifier.java (original) +++ maven/shared/trunk/maven-verifier/src/main/java/org/apache/maven/it/Verifier.java Tue Feb 27 13:51:50 2007 @@ -1,6 +1,5 @@ package org.apache.maven.it; -import junit.framework.Assert; import org.apache.maven.it.util.FileUtils; import org.apache.maven.it.util.StringUtils; import org.apache.maven.it.util.cli.CommandLineException; @@ -16,11 +15,13 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; + import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.FilenameFilter; @@ -28,8 +29,13 @@ import java.io.InputStream; import java.io.PrintStream; import java.io.Writer; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLClassLoader; +import java.security.AccessControlException; +import java.security.Permission; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; @@ -41,6 +47,8 @@ import java.util.Properties; import java.util.StringTokenizer; +import junit.framework.Assert; + /** * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl </a> * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a> @@ -74,6 +82,8 @@ private boolean debug; + private boolean forkJvm = true; + public Verifier( String basedir, String settingsFile ) throws VerificationException { @@ -83,10 +93,18 @@ public Verifier( String basedir, String settingsFile, boolean debug ) throws VerificationException { + this( basedir, settingsFile, debug, true ); + } + + public Verifier( String basedir, String settingsFile, boolean debug, boolean forkJvm ) + throws VerificationException + { this.basedir = basedir; this.debug = debug; + this.forkJvm = forkJvm; + if ( !debug ) { originalOut = System.out; @@ -786,11 +804,35 @@ executeGoals( goals, Collections.EMPTY_MAP ); } - public void executeGoals( List goals, Map envVars ) - throws VerificationException + private String getExecutable() { + // Use a strategy for finding the maven executable, John has a simple method like this + // but a little strategy + chain of command would be nicer. + String mavenHome = System.getProperty( "maven.home" ); + if ( mavenHome != null ) + { + return mavenHome + "/bin/mvn"; + } + else + { + File f = new File( System.getProperty( "user.home" ), "m2/bin/mvn" ); + + if ( f.exists() ) + { + return f.getAbsolutePath(); + } + else + { + return "mvn"; + } + } + } + + public void executeGoals( List goals, Map envVars ) + throws VerificationException + { if ( goals.size() == 0 ) { throw new VerificationException( "No goals specified" ); @@ -827,32 +869,14 @@ System.out.println(); } - cli.setWorkingDirectory( getBasedir() ); - - String executable; - - // Use a strategy for finding the maven executable, John has a simple method like this - // but a little strategy + chain of command would be nicer. - - if ( mavenHome != null ) + if ( System.getenv( "JAVA_HOME" ) == null && envVars.get( "JAVA_HOME" ) == null ) { - executable = mavenHome + "/bin/mvn"; + cli.addEnvironment( "JAVA_HOME", System.getProperty( "java.home" )); } - else - { - File f = new File( System.getProperty( "user.home" ), "m2/bin/mvn" ); - if ( f.exists() ) - { - executable = f.getAbsolutePath(); - } - else - { - executable = "mvn"; - } - } + cli.setWorkingDirectory( getBasedir() ); - cli.setExecutable( executable ); + cli.setExecutable( getExecutable() ); for ( Iterator it = cliOptions.iterator(); it.hasNext(); ) { @@ -890,17 +914,9 @@ cli.createArgument().setValue( (String) i.next() ); } - Writer logWriter = new FileWriter( logFile ); - - StreamConsumer out = new WriterStreamConsumer( logWriter ); - - StreamConsumer err = new WriterStreamConsumer( logWriter ); - System.out.println( "Command: " + Commandline.toString( cli.getCommandline() ) ); - ret = CommandLineUtils.executeCommandLine( cli, out, err ); - - logWriter.close(); + ret = runCommandLine( System.getProperty( "maven.home" ), cli, logFile ); } catch ( CommandLineException e ) { @@ -917,6 +933,223 @@ throw new VerificationException( "Exit code was non-zero: " + ret + "; log = \n" + getLogContents( logFile ) ); + } + } + + public String getMavenVersion() + throws VerificationException + { + Commandline cmd = new Commandline(); + cmd.setExecutable( getExecutable() ); + cmd.addArguments( new String[] { "--version" } ); + + File log; + try + { + log = File.createTempFile( "maven", "log" ); + } + catch ( IOException e ) + { + throw new VerificationException( "Error creating temp file", e ); + } + + try + { + runCommandLine( System.getProperty( "maven.home" ), cmd, log ); + } + catch ( CommandLineException e ) + { + throw new VerificationException( "Error running commandline " + cmd.toString(), e ); + } + catch ( IOException e ) + { + throw new VerificationException( "IO Error communicating with commandline " + cmd.toString(), e ); + } + + List l = loadFile( log, false ); + + String first = (String) l.get( 0 ); + if ( !first.startsWith( "Maven version: " ) ) + { + throw new VerificationException( "Illegal maven output: expecting 'Maven version: ' but got " + first ); + } + + return first.substring( "Maven version: ".length() ).trim(); + } + + + private int runCommandLine( String mavenHome, Commandline cli, File logFile ) + throws CommandLineException, IOException + { + if ( forkJvm ) + { + Writer logWriter = new FileWriter( logFile ); + + StreamConsumer out = new WriterStreamConsumer( logWriter ); + + StreamConsumer err = new WriterStreamConsumer( logWriter ); + + try + { + return CommandLineUtils.executeCommandLine( cli, out, err ); + } + finally + { + logWriter.close(); + } + } + + if ( mavenHome == null ) + { + mavenHome = System.getenv( "M2_HOME" ); + } + + if ( mavenHome == null ) + { + mavenHome = System.getProperty( "user.home" ) + "/local/maven-2.1-SNAPSHOT"; + } + + File coreDir = new File( mavenHome, "core/boot" ); + File[] files = coreDir.listFiles(); + File classWorldFile = null; + for ( int i = 0; files != null && i < files.length; i++ ) + { + if ( files[i].getName().indexOf( "plexus-classworlds" ) >= 0 ) + { + classWorldFile = files[i]; + break; + } + } + + if ( classWorldFile == null ) + { + throw new CommandLineException( "Cannot find plexus-classworlds in " + coreDir ); + } + + URLClassLoader cl; + + try + { + cl = new URLClassLoader( new URL[] { classWorldFile.toURI().toURL() }, null ); + } + catch ( MalformedURLException e ) + { + throw new CommandLineException( "Cannot conver to url: " + classWorldFile, e ); + } + + class ExitSecurityException + extends SecurityException + { + + private int status; + + public ExitSecurityException( int status ) + { + this.status = status; + } + + public int getStatus() + { + return status; + } + } + ; + + try + { + Class c = cl.loadClass( "org.codehaus.plexus.classworlds.launcher.Launcher" ); + + Method m = c.getMethod( "mainWithExitCode", new Class[] { String[].class } ); + + SecurityManager oldSm = System.getSecurityManager(); + + try + { + System.setSecurityManager( new SecurityManager() + { + public void checkPermission( Permission perm ) + { + // ok + } + + public void checkExit( int status ) + { + throw new ExitSecurityException( status ); + } + } ); + } + catch ( AccessControlException e ) + { + throw new CommandLineException( "Error isntalling securitymanager", e ); + } + + cli.createArgument().setValue( "-f" ); + cli.createArgument().setValue( cli.getWorkingDirectory().getAbsolutePath() + "/pom.xml" ); + + PrintStream oldOut = System.out; + PrintStream oldErr = System.err; + + String oldCwConf = System.getProperty( "classworlds.conf" ); + String oldMavenHome = System.getProperty( "maven.home" ); + + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + + try + { + Thread.currentThread().setContextClassLoader( cl );// ClassLoader.getSystemClassLoader() ); + FileOutputStream logWriter = new FileOutputStream( logFile ); + System.setOut( new PrintStream( logWriter ) ); + System.setErr( new PrintStream( logWriter ) ); + + System.setProperty( "classworlds.conf", new File( mavenHome, "bin/m2.conf" ).getAbsolutePath() ); + System.setProperty( "maven.home", mavenHome ); + + return ( (Integer) m.invoke( null, new Object[] { cli.getArguments() } ) ).intValue(); + } + catch ( ExitSecurityException e ) + { + oldOut.println( "exit security exception caught: status=" + e.getStatus() ); + return e.getStatus(); + } + finally + { + System.setOut( oldOut ); + System.setErr( oldErr ); + if ( oldCwConf == null ) + System.getProperties().remove( "classworlds.conf" ); + else + System.setProperty( "classworlds.conf", oldCwConf ); + if ( oldMavenHome == null ) + System.getProperties().remove( "maven.home" ); + else + System.setProperty( "maven.home", oldMavenHome ); + Thread.currentThread().setContextClassLoader( oldCl ); + System.setSecurityManager( oldSm ); + } + } + catch ( ClassNotFoundException e ) + { + throw new CommandLineException( "Cannot load classworlds launcher", e ); + } + catch ( NoSuchMethodException e ) + { + throw new CommandLineException( "Cannot find classworlds launcher's main method", e ); + } + catch ( IllegalArgumentException e ) + { + throw new CommandLineException( "Error executing classworlds launcher's main method", e ); + } + catch ( InvocationTargetException e ) + { + if ( e.getCause() instanceof ExitSecurityException ) + { + return ( (ExitSecurityException) e.getCause() ).getStatus(); + } + throw new CommandLineException( "Error executing classworlds launcher's main method", e ); + } + catch ( IllegalAccessException e ) + { + throw new CommandLineException( "Error executing classworlds launcher's main method", e ); } }