Return-Path: Delivered-To: apmail-maven-surefire-commits-archive@www.apache.org Received: (qmail 25886 invoked from network); 12 Dec 2005 06:31:11 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 12 Dec 2005 06:31:11 -0000 Received: (qmail 14539 invoked by uid 500); 12 Dec 2005 06:31:10 -0000 Delivered-To: apmail-maven-surefire-commits-archive@maven.apache.org Received: (qmail 14519 invoked by uid 500); 12 Dec 2005 06:31:10 -0000 Mailing-List: contact surefire-commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: surefire-dev@maven.apache.org Delivered-To: mailing list surefire-commits@maven.apache.org Received: (qmail 14510 invoked by uid 99); 12 Dec 2005 06:31:10 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 11 Dec 2005 22:31:10 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sun, 11 Dec 2005 22:31:09 -0800 Received: (qmail 25627 invoked by uid 65534); 12 Dec 2005 06:30:49 -0000 Message-ID: <20051212063049.25619.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r356178 - in /maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire: ForkedSurefireRunner.java SurefireBooter.java Date: Mon, 12 Dec 2005 06:30:48 -0000 To: surefire-commits@maven.apache.org From: jvanzyl@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jvanzyl Date: Sun Dec 11 22:30:46 2005 New Revision: 356178 URL: http://svn.apache.org/viewcvs?rev=356178&view=rev Log: o bit messy but checking in so that john can give it a whirl Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/ForkedSurefireRunner.java maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/SurefireBooter.java Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/ForkedSurefireRunner.java URL: http://svn.apache.org/viewcvs/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/ForkedSurefireRunner.java?rev=356178&r1=356177&r2=356178&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/ForkedSurefireRunner.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/ForkedSurefireRunner.java Sun Dec 11 22:30:46 2005 @@ -17,26 +17,35 @@ */ import java.io.File; +import java.io.FileInputStream; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; +import java.util.Iterator; import java.util.List; -import java.util.Map; +import java.util.Properties; /** * This class is executed when SurefireBooter forks surefire JUnit processes * - * @author Andy Glick + * @author Jason van Zyl * @version $Id$ */ public class ForkedSurefireRunner { - public static String FORK_ONCE = "once"; + public static final String FORK_ONCE = "once"; - public static String FORK_PERTEST = "pertest"; + public static final String FORK_PERTEST = "pertest"; - public static String FORK_NONE = "none"; + public static final String FORK_NONE = "none"; + + public static final String SUREFIRE_PROPERTIES = "surefire.properties"; + + public static final String SYSTEM_PROPERTIES = "surefire-system.properties"; + + public static final String CLASSLOADER_PROPERTIES = "surefire-classloader.properties"; + + static String basedir; static int TESTS_SUCCEEDED = 0; @@ -46,34 +55,71 @@ static int OTHER_EXCEPTION = 200; - private static Class thisClass = ForkedSurefireRunner.class; - private ForkedSurefireRunner() { super(); } - /** - * Constructs a Map from a set of strings of the form = - * - * @param args an array of strings composed of name/value pairs - * @return Map keyed by the names with the respective values - */ - private static Map getArgMap( String[] args ) + private static Properties getSurefireProperties() + throws Exception { - Map argMap = new LinkedHashMap(); + File f = new File( basedir, SUREFIRE_PROPERTIES ); + + f.deleteOnExit(); - for ( int i = 0; i < args.length; i++ ) + Properties p = new Properties(); + + p.load( new FileInputStream( f ) ); + + return p; + } + + private static void setSystemProperties() + throws Exception + { + File f = new File( basedir, SYSTEM_PROPERTIES ); + + f.deleteOnExit(); + + if ( !f.exists() ) { - String[] mapArgs = args[i].split( "=" ); + return; + } - argMap.put( mapArgs[0], mapArgs[1] ); - System.out.println( "mapArgs[0] = " + mapArgs[0] ); - System.out.println( "mapArgs[1] = " + mapArgs[1] ); + Properties p = new Properties(); + + p.load( new FileInputStream( f ) ); + + for ( Iterator i = p.keySet().iterator(); i.hasNext(); ) + { + String key = (String) i.next(); + + System.setProperty( key, p.getProperty( key ) ); + } + } + + private static ClassLoader createClassLoader() + throws Exception + { + File f = new File( basedir, CLASSLOADER_PROPERTIES ); + + f.deleteOnExit(); + + Properties p = new Properties(); + + p.load( new FileInputStream( f ) ); + + IsolatedClassLoader classLoader = new IsolatedClassLoader( ClassLoader.getSystemClassLoader() ); + + for ( Iterator i = p.values().iterator(); i.hasNext(); ) + { + String entry = (String) i.next(); + + classLoader.addURL( new File( entry ).toURL() ); } - return argMap; + return classLoader; } /** @@ -87,23 +133,25 @@ public static void main( String[] args ) throws Exception { - Map argMap = getArgMap( args ); + ClassLoader classLoader = createClassLoader(); - ClassLoader surefireClassLoader = thisClass.getClassLoader(); + setSystemProperties(); - String batteryExecutorName = (String) argMap.get( "batteryExecutorName" ); + Properties p = getSurefireProperties(); - Class batteryExecutorClass = surefireClassLoader.loadClass( batteryExecutorName ); + String batteryExecutorName = p.getProperty( "batteryExecutorName" ); + + Class batteryExecutorClass = classLoader.loadClass( batteryExecutorName ); Object batteryExecutor = batteryExecutorClass.newInstance(); - String reports = (String) argMap.get( "reportClassNames" ); + String reports = p.getProperty( "reportClassNames" ); String[] reportClasses = reports.split( "," ); List reportList = Arrays.asList( reportClasses ); - String batteryConfig = (String) argMap.get( "batteryConfig" ); + String batteryConfig = p.getProperty( "batteryConfig" ); String[] batteryParts = batteryConfig.split( "\\|" ); @@ -111,7 +159,7 @@ Object[] batteryParms; - String forkMode = (String) argMap.get( "forkMode" ); + String forkMode = p.getProperty( "forkMode" ); if ( forkMode.equals( FORK_ONCE ) ) { @@ -166,7 +214,7 @@ batteryHolders.add( new Object[]{batteryClassName, batteryParms} ); - String reportsDirectory = (String) argMap.get( "reportsDirectory" ); + String reportsDirectory = p.getProperty( "reportsDirectory" ); Method run = batteryExecutorClass.getMethod( "run", new Class[]{List.class, List.class, String.class} ); @@ -190,6 +238,8 @@ } catch ( Exception e ) { + e.printStackTrace(); + returnCode = OTHER_EXCEPTION; } Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/SurefireBooter.java URL: http://svn.apache.org/viewcvs/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/SurefireBooter.java?rev=356178&r1=356177&r2=356178&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/SurefireBooter.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/SurefireBooter.java Sun Dec 11 22:30:46 2005 @@ -25,17 +25,15 @@ import java.io.BufferedReader; import java.io.File; +import java.io.FileOutputStream; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Method; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; -import java.util.Enumeration; -import java.util.Arrays; /** * @author Jason van Zyl @@ -147,8 +145,6 @@ { boolean result = false; - System.out.println( ">>>>>>>>> forkMode = " + forkMode ); - if ( forkMode.equals( ForkedSurefireRunner.FORK_NONE ) ) { result = runTestsInProcess(); @@ -212,7 +208,9 @@ private boolean runTestsForkOnce() throws Exception { - return fork( getForkOnceArgs() ); + getForkOnceArgs(); + + return fork(); } private boolean runTestsForkEach() @@ -226,7 +224,9 @@ { String testClass = (String) i.next(); - boolean result = fork( getForkPerTestArgs( testClass ) ); + getForkPerTestArgs( testClass ); + + boolean result = fork(); if ( !result ) { @@ -237,7 +237,7 @@ return noFailures; } - private boolean fork( String[] args ) + private boolean fork() throws Exception { File workingDirectory = new File( "." ); @@ -250,7 +250,13 @@ cli.setExecutable( jvm ); - cli.addArguments( args ); + cli.createArgument().setValue( "-classpath" ); + + cli.createArgument().setValue( surefireBooterJar ); + + cli.createArgument().setValue( RUNNER ); + + cli.createArgument().setValue( basedir ); System.out.println( Commandline.toString( cli.getCommandline() ) ); @@ -328,67 +334,78 @@ return testClasses; } - private String[] getForkOnceArgs() + private void getForkOnceArgs() throws Exception { - return getForkArgs( getStringArrayFromBatteries()[0] ); + getForkArgs( getStringArrayFromBatteries()[0] ); } - private String[] getForkPerTestArgs( String testClass ) + private void getForkPerTestArgs( String testClass ) throws Exception { - return getForkArgs( SINGLE_TEST_BATTERY + "|" + testClass ); + getForkArgs( SINGLE_TEST_BATTERY + "|" + testClass ); } - private String[] getForkArgs( String batteryConfig ) + private String surefireBooterJar; + + private void getForkArgs( String batteryConfig ) throws Exception { String reportClassNames = getListOfStringsAsString( reports, "," ); - String classpathEntries = makeClasspath( classpathUrls ); + Properties p = new Properties(); - List args = new ArrayList(); + for ( int i = 0; i < classpathUrls.size(); i++ ) + { + String entry = (String) classpathUrls.get( i ); + + // Exclude the surefire booter + if ( entry.indexOf( "surefire-booter" ) > 0 ) + { + surefireBooterJar = entry; + } + else + { + p.setProperty( Integer.toString( i ), entry ); + } + + } - args.add( "-classpath" ); + FileOutputStream fos = new FileOutputStream( new File( basedir, ForkedSurefireRunner.CLASSLOADER_PROPERTIES ) ); - args.add( classpathEntries ); + p.store( fos, "classpath entries" ); - // ---------------------------------------------------------------------- - // Add some system propeties - // ---------------------------------------------------------------------- + fos.close(); if ( systemProperties != null ) { - Enumeration propertyKeys = systemProperties.propertyNames(); + File f = new File( basedir, ForkedSurefireRunner.SYSTEM_PROPERTIES ); - while ( propertyKeys.hasMoreElements() ) - { - String key = (String) propertyKeys.nextElement(); + fos = new FileOutputStream( f ); - args.add( "-D" + key + "=" + systemProperties.getProperty( key ) ); - } + systemProperties.store( fos, "system properties" ); + + fos.close(); } - args.add( RUNNER ); + p = new Properties(); - args.add( "reportClassNames=" + reportClassNames ); + p.setProperty( "reportClassNames", reportClassNames ); - args.add( "reportsDirectory=" + reportsDirectory ); + p.setProperty( "reportsDirectory", reportsDirectory ); - args.add( "batteryExecutorName=" + BATTERY_EXECUTOR ); + p.setProperty( "batteryExecutorName", BATTERY_EXECUTOR ); - args.add( "forkMode=" + forkMode ); + p.setProperty( "forkMode", forkMode ); - args.add( "batteryConfig=" + batteryConfig ); + p.setProperty( "batteryConfig", batteryConfig ); - String[] s = new String[args.size()]; + fos = new FileOutputStream( new File( basedir, ForkedSurefireRunner.SUREFIRE_PROPERTIES ) ); - for ( int i = 0; i < s.length; i++ ) - { - s[i] = (String) args.get( i ); - } + p.store( fos, "surefire properties" ); + + fos.close(); - return s; } public void reset() @@ -398,22 +415,6 @@ reports.clear(); classpathUrls.clear(); - } - - private String makeClasspath( List list ) - { - StringBuffer files = new StringBuffer(); - - for ( Iterator i = list.iterator(); i.hasNext(); ) - { - String classpathElement = (String) i.next(); - - files.append( classpathElement ); - - files.append( PS ); - } - - return files.toString(); } private String quotedPathArgument( String value )