You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jk...@apache.org on 2007/05/05 19:21:36 UTC

svn commit: r535549 - in /maven/sandbox/branches/surefire/surefire-collaboration: maven-surefire-plugin/src/it/test4/ maven-surefire-plugin/src/it/test4/src/test-data/ maven-surefire-plugin/src/it/test4/src/test/java/ maven-surefire-plugin/src/it/test6...

Author: jkuhnert
Date: Sat May  5 10:21:35 2007
New Revision: 535549

URL: http://svn.apache.org/viewvc?view=rev&rev=535549
Log:
First pass at adding support for TestNG 5.6 and the supposed "future compatibility" features which rely on using a java.util.Properties map to configure testng.

Added:
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java   (with props)
Modified:
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/pom.xml
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test-data/testng.xml
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/pom.xml
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/src/test/java/TestNGTest.java
    maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
    maven/sandbox/branches/surefire/surefire-collaboration/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
    maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
    maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
    maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGReporter.java
    maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java

Modified: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/pom.xml?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/pom.xml (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/pom.xml Sat May  5 10:21:35 2007
@@ -33,7 +33,7 @@
         <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
-            <version>5.5</version>
+            <version>5.6</version>
             <classifier>jdk15</classifier>
             <scope>test</scope>
         </dependency>
@@ -45,9 +45,29 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
+                    <!--
                     <suiteXmlFiles>
                         <file>src/test-data/testng.xml</file>
                     </suiteXmlFiles>
+                    -->
+                    <properties>
+                        <property>
+                            <name>log</name>
+                            <value>0</value>
+                        </property>
+                        <property>
+                            <name>testng.suite.definitions</name>
+                            <value>src/test-data/testng.xml</value>
+                        </property>
+                    </properties>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
                 </configuration>
             </plugin>
 
@@ -69,5 +89,13 @@
         </plugins>
     </build>
 
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-report-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </reporting>
 
 </project>

Modified: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test-data/testng.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test-data/testng.xml?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test-data/testng.xml (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test-data/testng.xml Sat May  5 10:21:35 2007
@@ -21,10 +21,11 @@
 
 <suite name="Suite 1 Test" verbose="4">
 
-  <test name="Sample Test">
-    <classes>
-      <class name="TestNGSuiteTest"/>
-    </classes>
-  </test>
+    <test name="Sample Test">
+        <classes>
+            <class name="TestNGSuiteTest" />
+            <class name="TestSuiteRun" />
+        </classes>
+    </test>
 
 </suite>

Added: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java?view=auto&rev=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java (added)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java Sat May  5 10:21:35 2007
@@ -0,0 +1,13 @@
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+@Test
+public class TestSuiteRun {
+
+    public void test_Run()
+    {
+        assert true;
+    }
+}

Propchange: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test4/src/test/java/TestSuiteRun.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/pom.xml?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/pom.xml (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/pom.xml Sat May  5 10:21:35 2007
@@ -21,44 +21,44 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+    <modelVersion>4.0.0</modelVersion>
 
-  <groupId>org.apache.maven.plugins.surefire</groupId>
-  <artifactId>test6</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <name>TestNG group/parallel thread tests</name>
-  <description>Tests group/thread/parallel functionality of TestNG</description>
+    <groupId>org.apache.maven.plugins.surefire</groupId>
+    <artifactId>test6</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>TestNG group/parallel thread tests</name>
+    <description>Tests group/thread/parallel functionality of TestNG</description>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.testng</groupId>
-      <artifactId>testng</artifactId>
-      <version>5.5</version>
-      <classifier>jdk15</classifier>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
+    <dependencies>
+        <dependency>
+            <groupId>org.testng</groupId>
+            <artifactId>testng</artifactId>
+            <version>5.5</version>
+            <classifier>jdk15</classifier>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <groups>functional</groups>
-          <threadCount>3</threadCount>
-          <parallel>methods</parallel>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <groups>functional</groups>
+                    <threadCount>3</threadCount>
+                    <parallel>methods</parallel>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

Modified: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/src/test/java/TestNGTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/src/test/java/TestNGTest.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/src/test/java/TestNGTest.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/it/test6/src/test/java/TestNGTest.java Sat May  5 10:21:35 2007
@@ -25,7 +25,7 @@
 	public void check_Test_Count()
 	{
 		assert m_testCount == 3 : "Expected 3 tests to be run but local count was " + m_testCount;
-	}
+    }
 	
 	Object testObject;
 	

Modified: maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java Sat May  5 10:21:35 2007
@@ -170,6 +170,14 @@
     private Properties systemProperties;
 
     /**
+     * List of properties for configuring all TestNG related configurations. This is the new
+     * preferred method of configuring TestNG.
+     *
+     * @parameter
+     */
+    private Properties properties;
+
+    /**
      * Map of of plugin artifacts.
      *
      * @parameter expression="${plugin.artifactMap}"
@@ -309,7 +317,7 @@
      *
      * @parameter expression="${parallel}"
      * default-value="false"
-     * 
+     *
      * @todo test how this works with forking, and console/file output parallelism
      */
     private String parallel;
@@ -446,6 +454,44 @@
         return true;
     }
 
+    /**
+     * Converts old TestNG configuration parameters over to new properties based configuration
+     * method. (if any are defined the old way)
+     */
+    void convertTestNGParameters()
+    {
+        if ( properties == null )
+        {
+            properties = new Properties();
+        }
+
+        if (this.parallel != null)
+            properties.put("parallel", this.parallel);
+        if (this.excludedGroups != null)
+            properties.put("excludegroups", this.excludedGroups);
+        if (this.groups != null)
+            properties.put("groups", this.groups);
+        if (this.threadCount > 0)
+            properties.put("threadcount", Integer.valueOf(this.threadCount));
+
+        if (this.suiteXmlFiles != null) {
+            String list = "";
+            for (int i=0; i < this.suiteXmlFiles.length; i++) {
+                list += this.suiteXmlFiles[i].getAbsolutePath();
+
+                if ((i + 1) < this.suiteXmlFiles.length)
+                    list += ",";
+            }
+            
+            properties.put("testng.suite.definitions", list);
+        }
+
+        if (this.testSourceDirectory != null)
+            properties.put("sourcedir", testSourceDirectory.getAbsolutePath());
+        if (this.testClassesDirectory != null)
+            properties.put("testng.test.classpath", testClassesDirectory.getAbsolutePath());
+    }
+
     private SurefireBooter constructSurefireBooter()
         throws MojoExecutionException, MojoFailureException
     {
@@ -484,7 +530,10 @@
 
                 // The plugin uses a JDK based profile to select the right testng. We might be explicity using a
                 // different one since its based on the source level, not the JVM. Prune using the filter.
+
                 addProvider( surefireBooter, "surefire-testng", surefireArtifact.getBaseVersion(), testNgArtifact );
+
+                convertTestNGParameters();
             }
             else if ( junitArtifact != null && junitArtifact.getBaseVersion().startsWith( "4" ) )
             {
@@ -511,24 +560,45 @@
             throw new MojoExecutionException( "Error to resolving surefire provider dependency: " + e.getMessage(), e );
         }
 
-        if ( suiteXmlFiles != null && suiteXmlFiles.length > 0 )
+        if ( testNgArtifact != null && properties != null && properties.get("testng.suite.definitions") != null)
         {
-            if ( testNgArtifact == null )
+            try {
+
+                VersionRange range = VersionRange.createFromVersionSpec( "[5.6,)" );
+                if ( !range.containsVersion( testNgArtifact.getSelectedVersion() ) && suiteXmlFiles != null)
+                {
+                    // if earlier than 5.6 need to construct and execute the old non-properties way
+
+                    for ( int i = 0; i < suiteXmlFiles.length; i++ )
+                    {
+                        File file = suiteXmlFiles[i];
+                        if ( file.exists() )
+                        {
+                            surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGXmlTestSuite",
+                                                         new Object[]{file, testSourceDirectory.getAbsolutePath()} );
+                        }
+                    }
+                } else {
+
+                    // do it the new way
+
+                    surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGXmlTestSuite", new Object[]{ properties } );
+                }
+
+            }
+            catch ( InvalidVersionSpecificationException e )
             {
-                throw new MojoExecutionException( "suiteXmlFiles is configured, but there is no TestNG dependency" );
+                throw new MojoExecutionException( "Error determining the TestNG version requested: " + e.getMessage(), e );
             }
-            for ( int i = 0; i < suiteXmlFiles.length; i++ )
+            catch ( ArtifactResolutionException e )
             {
-                File file = suiteXmlFiles[i];
-                if ( file.exists() )
-                {
-                    surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGXmlTestSuite",
-                                                 new Object[]{file, testSourceDirectory.getAbsolutePath()} );
-                }
+                throw new MojoExecutionException( "Error to resolving surefire provider dependency: " + e.getMessage(), e );
             }
         }
+
         else
         {
+
             List includes;
             List excludes;
 
@@ -561,20 +631,44 @@
                 if ( includes == null || includes.size() == 0 )
                 {
                     includes = new ArrayList(
-                        Arrays.asList( new String[]{"**/*Test*.java", "**/*Test.java", "**/*TestCase.java"} ) );
+                            Arrays.asList( new String[]{"**/*Test*.java", "**/*Test.java", "**/*TestCase.java"} ) );
                 }
                 if ( excludes == null || excludes.size() == 0 )
                 {
                     excludes = new ArrayList(
-                        Arrays.asList( new String[]{"**/Abstract*Test.java", "**/Abstract*TestCase.java", "**/*$*"} ) );
+                            Arrays.asList( new String[]{"**/Abstract*Test.java", "**/Abstract*TestCase.java", "**/*$*"} ) );
                 }
             }
 
             if ( testNgArtifact != null )
             {
-                surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGDirectoryTestSuite", new Object[]{
-                    testClassesDirectory, includes, excludes, groups, excludedGroups, parallel,
-                    new Integer( threadCount ), testSourceDirectory.getAbsolutePath()} );
+
+                try {
+
+                    VersionRange range = VersionRange.createFromVersionSpec( "[5.6,)" );
+                    if ( !range.containsVersion( testNgArtifact.getSelectedVersion() ))
+                    {
+                        // if earlier than 5.6 need to construct and execute the old non-properties way
+
+                        surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGDirectoryTestSuite", new Object[]{
+                                testClassesDirectory, includes, excludes, groups, excludedGroups, Boolean.valueOf( parallel ),
+                                new Integer( threadCount ), testSourceDirectory.getAbsolutePath()} );
+
+                    } else {
+
+                        surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGDirectoryTestSuite",
+                                new Object[] { testClassesDirectory, includes, excludes, properties });
+                    }
+
+                }
+                catch ( InvalidVersionSpecificationException e )
+                {
+                    throw new MojoExecutionException( "Error determining the TestNG version requested: " + e.getMessage(), e );
+                }
+                catch ( ArtifactResolutionException e )
+                {
+                    throw new MojoExecutionException( "Error to resolving surefire provider dependency: " + e.getMessage(), e );
+                }
             }
             else
             {
@@ -591,8 +685,9 @@
                 // fall back to JUnit, which also contains POJO support. Also it can run
                 // classes compiled against JUnit since it has a dependency on JUnit itself.
                 surefireBooter.addTestSuite( junitDirectoryTestSuite,
-                                             new Object[]{testClassesDirectory, includes, excludes} );
+                        new Object[]{testClassesDirectory, includes, excludes} );
             }
+
         }
 
         // ----------------------------------------------------------------------

Modified: maven/sandbox/branches/surefire/surefire-collaboration/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java Sat May  5 10:21:35 2007
@@ -20,12 +20,7 @@
  */
 
 import org.apache.maven.surefire.Surefire;
-import org.apache.maven.surefire.booter.output.FileOutputConsumerProxy;
-import org.apache.maven.surefire.booter.output.ForkingStreamConsumer;
-import org.apache.maven.surefire.booter.output.OutputConsumer;
-import org.apache.maven.surefire.booter.output.StandardOutputConsumer;
-import org.apache.maven.surefire.booter.output.SupressFooterOutputConsumerProxy;
-import org.apache.maven.surefire.booter.output.SupressHeaderOutputConsumerProxy;
+import org.apache.maven.surefire.booter.output.*;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 import org.apache.maven.surefire.util.NestedRuntimeException;
 import org.apache.maven.surefire.util.UrlUtils;
@@ -35,22 +30,12 @@
 import org.codehaus.plexus.util.cli.CommandLineUtils;
 import org.codehaus.plexus.util.cli.StreamConsumer;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
 
 /**
  * @author Jason van Zyl
@@ -655,6 +640,31 @@
         return list;
     }
 
+    private static Properties processPropertiesList( String propertiesList )
+    {
+        String sl = propertiesList;
+
+        if ( sl.startsWith( "{" ) && sl.endsWith( "}" ) )
+        {
+            sl = sl.substring( 1, sl.length() - 1 );
+        }
+
+        Properties props = new Properties();
+
+        String[] stringArray = StringUtils.split( sl, "," );
+
+        for ( int i = 0; i < stringArray.length; i++ )
+        {
+            String[] keyValue = StringUtils.split( stringArray[i], "=");
+            if (keyValue.length != 2)
+                throw new IllegalStateException("Expected to find key/value pair in configuration string: " + stringArray[i]);
+
+            props.put(keyValue[0].trim(), keyValue[1].trim());
+        }
+        
+        return props;
+    }
+
     private static Properties loadProperties( File file )
         throws IOException
     {
@@ -728,10 +738,14 @@
                 {
                     paramObjects[i] = Integer.valueOf( params[i] );
                 }
+                else if ( types[i].equals( Properties.class.getName() ) )
+                {
+                    paramObjects[i] = processPropertiesList(params[i]);
+                }
                 else
                 {
                     // TODO: could attempt to construct with a String constructor if needed
-                    throw new IllegalArgumentException( "Unknown parameter type: " + types[i] );
+                    throw new IllegalArgumentException( "Unknown parameter type: " + types[i]);
                 }
             }
         }

Modified: maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java Sat May  5 10:21:35 2007
@@ -51,7 +51,16 @@
     private int threadCount;
 
     private String testSourceDirectory;
-
+    
+    private Properties config;
+    
+    public TestNGDirectoryTestSuite( File basedir, ArrayList includes, ArrayList excludes, Properties config)
+    {
+        super( basedir, includes, excludes );
+        
+        this.config = config;
+    }
+    
     public TestNGDirectoryTestSuite( File basedir, ArrayList includes, ArrayList excludes, String groups,
                                      String excludedGroups, String parallel, Integer threadCount,
                                      String testSourceDirectory )
@@ -70,12 +79,31 @@
 
     }
 
+    public TestNGDirectoryTestSuite( File basedir, ArrayList includes, ArrayList excludes, String groups,
+                                     String excludedGroups, Boolean parallel, Integer threadCount,
+                                     String testSourceDirectory )
+    {
+        super( basedir, includes, excludes );
+
+        this.groups = groups;
+
+        this.excludedGroups = excludedGroups;
+
+        this.parallel = parallel.toString();
+
+        this.threadCount = threadCount.intValue();
+
+        this.testSourceDirectory = testSourceDirectory;
+
+    }
+
     public Map locateTestSets( ClassLoader classLoader )
         throws TestSetFailedException
     {
         // TODO: fix
         // override classloader. That keeps us all together for now, which makes it work, but could pose problems of
         // classloader separation if the tests use plexus-utils.
+        
         return super.locateTestSets( classLoader );
     }
 
@@ -98,6 +126,22 @@
             throw new TestSetFailedException( "Unable to find test set '" + testSetName + "' in suite" );
         }
 
+        if ( config != null )
+        {
+            config.put("classloader", classLoader);
+            config.put("testclass", testSet.getTestClass() );
+            config.put("suitename", "Single Test");
+            config.put("testname", testSet.getName() );
+
+            TestNGExecutor.executeTestNG( this, config, reporterManager );
+
+            config.remove("classloader");
+            config.remove("testclass");
+            config.remove("suitename");
+            config.remove("testname");
+            return;
+        }
+        
         XmlSuite suite = new XmlSuite();
         
         suite.setThreadCount(threadCount);
@@ -125,6 +169,36 @@
             throw new IllegalStateException( "You must call locateTestSets before calling execute" );
         }
 
+        if ( config != null )
+        {
+            StringBuffer classNames = new StringBuffer();
+            for ( Iterator i = testSets.values().iterator(); i.hasNext(); )
+            {
+                SurefireTestSet testSet = (SurefireTestSet) i.next();
+
+                classNames.append(testSet.getTestClass().getName());
+
+                if (i.hasNext())
+                {
+                    classNames.append(",");
+                }
+            }
+
+            config.put("classloader", classLoader);
+            config.put("testclass", classNames.toString() );
+            config.put("suitename", "Directory Suite");
+            config.put("testname", "Directory tests");
+
+            TestNGExecutor.executeTestNG( this, config, reporterManager );
+            
+            config.remove("classloader");
+            config.remove("testclass");
+            config.remove("suitename");
+            config.remove("testname");
+
+            return;
+        }
+
         XmlSuite suite = new XmlSuite();
         
         suite.setThreadCount(threadCount);
@@ -165,8 +239,6 @@
             xmlTest.setExcludedGroups( Arrays.asList( excludedGroups.split( "," ) ) );
         }
 
-        // if ( !TestNGClassFinder.isTestNGClass( testSet.getTestClass(), annotationFinder ) )
-        // TODO: this is a bit dodgy, but isTestNGClass wasn't working
         try
         {
             Class junitClass = Class.forName( "junit.framework.Test" );
@@ -198,9 +270,7 @@
         TestNGReporter reporter = new TestNGReporter( reporterManager, this );
         testNG.addListener( (ITestListener) reporter );
         testNG.addListener( (ISuiteListener) reporter );
-        
-        TestNGExecutor.configureJreType(testNG, testSourceDirectory);
-        
+
         // Set source path so testng can find javadoc annotations if not in 1.5 jvm
         if ( testSourceDirectory != null )
         {
@@ -210,10 +280,12 @@
         // workaround for SUREFIRE-49
         // TestNG always creates an output directory, and if not set the name for the directory is "null"
         testNG.setOutputDirectory( System.getProperty( "java.io.tmpdir" ) );
-        
+
+        TestNGExecutor.configureJreType(testNG, testSourceDirectory);
+
         testNG.runSuitesLocally();
         
-        // need to execute report end after testng has completely finished as the 
+        // need to execute report end after testng has completely finished as the
         // reporter methods don't get called in the order that would allow for capturing
         // failures that happen in before/after suite configuration methods
         

Modified: maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java Sat May  5 10:21:35 2007
@@ -30,6 +30,7 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Properties;
 
 /**
  * Contains utility methods for executing TestNG.
@@ -87,16 +88,31 @@
         try {
 
             String jre = System.getProperty("java.vm.version");
-
             Method annotType = TestNGExecutor.getMethod(testNG.getClass(), "setAnnotations", 1);
+            
             if (annotType != null) {
 
                 annotType.invoke(testNG, new Object[]{ jre.indexOf("1.4") > -1 ? "javadoc" : "jdk"});
 
-                Method init = testNG.getClass().getDeclaredMethod("initializeAnnotationFinders", new Class[0]);
+                Method init = testNG.getClass().getDeclaredMethod("initializeListeners", new Class[0]);
+                init.setAccessible(true);
+                init.invoke(testNG, new Object[0]);
+
+                init = testNG.getClass().getDeclaredMethod("initializeAnnotationFinders", new Class[0]);
+                init.setAccessible(true);
+                init.invoke(testNG, new Object[0]);
+
+                init = testNG.getClass().getDeclaredMethod("initializeCommandLineSuites", new Class[0]);
+                init.setAccessible(true);
+                init.invoke(testNG, new Object[0]);
+
+                init = testNG.getClass().getDeclaredMethod("initializeCommandLineSuitesParams", new Class[0]);
+                init.setAccessible(true);
+                init.invoke(testNG, new Object[0]);
+
+                init = testNG.getClass().getDeclaredMethod("initializeCommandLineSuitesGroups", new Class[0]);
                 init.setAccessible(true);
                 init.invoke(testNG, new Object[0]);
-                
             } else if (Class.forName("org.testng.internal.annotations.AnnotationConfiguration") != null
                     && AnnotationConfiguration.class.getMethod("getInstance", new Class[0]) != null) {
 
@@ -106,14 +122,16 @@
                 } else {
                     AnnotationConfiguration.getInstance().initialize(AnnotationConfiguration.JVM_15_CONFIG);
                 }
+            } else {
+                throw new IllegalStateException("Unable to configure TestNG jre type.");
             }
         } catch (Throwable t) {
             throw new RuntimeException(t);
         }
     }
     
-    static void executeTestNG( SurefireTestSuite surefireSuite, String testSourceDirectory, XmlSuite suite,
-                               ReporterManager reporterManager )
+    static void executeTestNG( SurefireTestSuite surefireSuite, String testSourceDirectory,
+                               XmlSuite suite, ReporterManager reporterManager )
     {
         TestNG testNG = new TestNG( false );
 
@@ -147,5 +165,27 @@
         // failures that happen in before/after suite configuration methods
         
         reporter.cleanupAfterTestsRun();
+    }
+
+    static void executeTestNG( SurefireTestSuite suite, Properties config, ReporterManager reporterManager )
+    {
+        TestNG testNG = new TestNG( false );
+
+        Method execMethod = getMethod(testNG.getClass(), "configureAndRun", 1);
+        if (execMethod == null)
+            throw new IllegalArgumentException("Unable to find method <configureAndRun(Map)> on TestNG class provided");
+
+        TestNGReporter reporter = new TestNGReporter( reporterManager, suite );
+        config.put("listener", reporter);
+        config.put("suitelistener", reporter);
+
+        try {
+
+            execMethod.invoke(testNG, new Object[] { config });
+        } catch (Throwable t)
+        {
+            t.printStackTrace();
+            return;
+        }
     }
 }

Modified: maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGReporter.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGReporter.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGReporter.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGReporter.java Sat May  5 10:21:35 2007
@@ -50,7 +50,9 @@
     private boolean testStarted = false;
     
     private ITestContext _finishContext;
-    
+
+    private boolean testSetCompleted = false;
+
     /**
      * Constructs a new instance that will listen to
      * test updates from a {@link TestNG} class instance.
@@ -155,6 +157,8 @@
         {
             // TODO: remove this exception from the report manager
         }
+
+        testSetCompleted = false;
     }
 
     public void onFinish( ITestContext context )
@@ -194,7 +198,13 @@
                 
             } catch (Throwable t) { t.printStackTrace(); }
         }
-        
+
+        // Don't execute twice
+        if (testSetCompleted)
+        {
+            return;
+        }
+
         String rawString = bundle.getString( "testSetCompletedNormally" );
         
         ReportEntry report =
@@ -203,6 +213,8 @@
         reportManager.testSetCompleted( report );
 
         reportManager.reset();
+
+        testSetCompleted = true;
     }
     
     /**

Modified: maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java
URL: http://svn.apache.org/viewvc/maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java?view=diff&rev=535549&r1=535548&r2=535549
==============================================================================
--- maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java (original)
+++ maven/sandbox/branches/surefire/surefire-collaboration/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java Sat May  5 10:21:35 2007
@@ -47,6 +47,19 @@
 
     private Map testSets;
 
+    private Properties config;
+
+    /**
+     * Constructur used with TestNG >= 5.6.
+     *
+     * @param config
+     *          The generic map of testng configuration properties gathered from plugin.
+     */
+    public TestNGXmlTestSuite( Properties config )
+    {
+        this.config = config;
+    }
+    
     /**
      * Creates a testng testset to be configured by the specified
      * xml file.
@@ -65,6 +78,16 @@
 
     public void execute( ReporterManager reporterManager, ClassLoader classLoader )
     {
+        if ( config != null )
+        {
+            config.put("classloader", classLoader);
+
+            TestNGExecutor.executeTestNG( this, config, reporterManager );
+
+            config.remove("classloader");
+            return;
+        }
+
         if ( testSets == null )
         {
             throw new IllegalStateException( "You must call locateTestSets before calling execute" );
@@ -82,6 +105,12 @@
     public void execute( String testSetName, ReporterManager reporterManager, ClassLoader classLoader )
         throws TestSetFailedException
     {
+        if (config != null)
+        {
+            executeSingle( testSetName, reporterManager, classLoader);
+            return;
+        }
+        
         if ( testSets == null )
         {
             throw new IllegalStateException( "You must call locateTestSets before calling execute" );
@@ -113,22 +142,18 @@
             suite.getTests().clear();
             suite.getTests().addAll( originalTests );
         }
-        /*
-        List originalTests = new ArrayList( suite.getTests() );
-        for ( Iterator i = suite.getTests().iterator(); i.hasNext(); )
-        {
-            XmlTest test = (XmlTest) i.next();
-            if ( !test.getName().equals( testSetName ) )
-            {
-                i.remove();
-            }
-        }
-        
-        TestNGExecutor.executeTestNG( this, testSourceDirectory, suite, reporterManager );
+    }
 
-        suite.getTests().clear();
-        suite.getTests().addAll( originalTests );
-        */
+    void executeSingle( String testSetName, ReporterManager reporterManager, ClassLoader classLoader )
+        throws TestSetFailedException
+    {
+        config.put("testSetName", testSetName);
+        config.put("classloader", classLoader);
+
+        TestNGExecutor.executeTestNG( this, config, reporterManager );
+        
+        config.remove("testSetName");
+        config.remove("classloader");
     }
 
     public int getNumTests()
@@ -139,6 +164,11 @@
 
     public int getNumTestSets()
     {
+        if (config != null)
+        {
+            return 1;
+        }
+        
         int count = 0;
         Iterator it = suites.iterator();
 
@@ -155,6 +185,11 @@
     public Map locateTestSets( ClassLoader classLoader )
         throws TestSetFailedException
     {
+        if (config != null)
+        {
+            return locateTestSets(classLoader, config);
+        }
+
         if ( testSets != null )
         {
             throw new IllegalStateException( "You can't call locateTestSets twice" );
@@ -217,20 +252,12 @@
                 testSets.put( xmlTest.getName(), xmlTest );
             }
         }
-        /*
-        for ( Iterator i = suite.getTests().iterator(); i.hasNext(); )
-        {
-            XmlTest xmlTest = (XmlTest) i.next();
-
-            if ( testSets.containsKey( xmlTest.getName() ) )
-            {
-                throw new TestSetFailedException( "Duplicate test set '" + xmlTest.getName() + "'" );
-            }
-
-            // We don't need to put real test sets in here, the key is the important part
-            testSets.put( xmlTest.getName(), xmlTest );
-        }*/
         
         return testSets;
+    }
+
+    Map locateTestSets( ClassLoader classLoader, Properties props)
+    {
+        return config;
     }
 }