You are viewing a plain text version of this content. The canonical link for it is here.
Posted to surefire-commits@maven.apache.org by br...@apache.org on 2006/03/04 14:09:36 UTC

svn commit: r383108 - in /maven/surefire/branches/surefire-testng: surefire-api/src/main/java/org/apache/maven/surefire/testset/ surefire-booter/src/main/java/org/apache/maven/surefire/booter/ surefire-providers/surefire-testng/src/main/java/org/apache...

Author: brett
Date: Sat Mar  4 05:09:35 2006
New Revision: 383108

URL: http://svn.apache.org/viewcvs?rev=383108&view=rev
Log:
[MSUREFIRE-23] refactor pojo only methods into pojo test set, and create TestNGXmlTestSuite

Added:
    maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java   (with props)
Modified:
    maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java
    maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java
    maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
    maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
    maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java
    maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java

Modified: maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/AbstractTestSet.java Sat Mar  4 05:09:35 2006
@@ -16,21 +16,12 @@
  * limitations under the License.
  */
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Base test class.
  */
 public abstract class AbstractTestSet
     implements SurefireTestSet
 {
-    private static final String TEST_METHOD_PREFIX = "test";
-
-    protected List testMethods;
-
     private Class testClass;
 
     protected AbstractTestSet( Class testClass )
@@ -48,59 +39,8 @@
         return testClass.getName();
     }
 
-    public int getTestCount()
-        throws TestSetFailedException
-    {
-        discoverTestMethods();
-
-        return testMethods.size();
-    }
-
     public Class getTestClass()
     {
         return testClass;
-    }
-
-    protected void discoverTestMethods()
-    {
-        if ( testMethods == null )
-        {
-            testMethods = new ArrayList();
-
-            Method[] methods = testClass.getMethods();
-
-            for ( int i = 0; i < methods.length; ++i )
-            {
-                Method m = methods[i];
-
-                if ( isValidTestMethod( m ) )
-                {
-                    String simpleName = m.getName();
-
-                    // name must have 5 or more chars
-                    if ( simpleName.length() > 4 )
-                    {
-                        String firstFour = simpleName.substring( 0, 4 );
-
-                        // name must start with "test"
-                        if ( firstFour.equals( TEST_METHOD_PREFIX ) )
-                        {
-                            testMethods.add( m );
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    public static boolean isValidTestMethod( Method m )
-    {
-        boolean isInstanceMethod = !Modifier.isStatic( m.getModifiers() );
-
-        boolean returnsVoid = m.getReturnType().equals( void.class );
-
-        boolean hasNoParams = m.getParameterTypes().length == 0;
-
-        return isInstanceMethod && returnsVoid && hasNoParams;
     }
 }

Modified: maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-api/src/main/java/org/apache/maven/surefire/testset/PojoTestSet.java Sat Mar  4 05:09:35 2006
@@ -22,7 +22,10 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.ResourceBundle;
 
 public class PojoTestSet
@@ -30,10 +33,14 @@
 {
     private ResourceBundle bundle = ResourceBundle.getBundle( Surefire.SUREFIRE_BUNDLE_NAME );
 
+    private static final String TEST_METHOD_PREFIX = "test";
+
     private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];
 
     private Object testObject;
 
+    protected List testMethods;
+
     public PojoTestSet( Class testClass )
         throws TestSetFailedException
     {
@@ -227,5 +234,56 @@
 
     public void tearDownFixture()
     {
+    }
+
+    public int getTestCount()
+        throws TestSetFailedException
+    {
+        discoverTestMethods();
+
+        return testMethods.size();
+    }
+
+    private void discoverTestMethods()
+    {
+        if ( testMethods == null )
+        {
+            testMethods = new ArrayList();
+
+            Method[] methods = getTestClass().getMethods();
+
+            for ( int i = 0; i < methods.length; ++i )
+            {
+                Method m = methods[i];
+
+                if ( isValidTestMethod( m ) )
+                {
+                    String simpleName = m.getName();
+
+                    // name must have 5 or more chars
+                    if ( simpleName.length() > 4 )
+                    {
+                        String firstFour = simpleName.substring( 0, 4 );
+
+                        // name must start with "test"
+                        if ( firstFour.equals( TEST_METHOD_PREFIX ) )
+                        {
+                            testMethods.add( m );
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private static boolean isValidTestMethod( Method m )
+    {
+        boolean isInstanceMethod = !Modifier.isStatic( m.getModifiers() );
+
+        boolean returnsVoid = m.getReturnType().equals( void.class );
+
+        boolean hasNoParams = m.getParameterTypes().length == 0;
+
+        return isInstanceMethod && returnsVoid && hasNoParams;
     }
 }

Modified: maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java Sat Mar  4 05:09:35 2006
@@ -140,7 +140,7 @@
         //noinspection CatchGenericClass,OverlyBroadCatchBlock
         try
         {
-            // TODO: assertions = true shouldn't be required if we had proper separation (see TestNG)
+            // TODO: assertions = true shouldn't be required for this CL if we had proper separation (see TestNG)
             ClassLoader surefireClassLoader =
                 createClassLoader( surefireClassPathUrls, getClass().getClassLoader(), true );
 
@@ -153,7 +153,7 @@
             Method run = surefireClass.getMethod( "run", new Class[]{List.class, Object[].class, String.class,
                 ClassLoader.class, ClassLoader.class} );
 
-            ClassLoader oldContextClassLoader = Thread.currentThread() .getContextClassLoader();
+            ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
 
             Thread.currentThread().setContextClassLoader( testsClassLoader );
 

Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java Sat Mar  4 05:09:35 2006
@@ -172,7 +172,6 @@
         // turn off all TestNG output
         testNG.setVerbose( 0 );
 
-        // TODO: check these work, otherwise put them in the xmlTest instances
         testNG.setXmlSuites( Collections.singletonList( suite ) );
 
         testNG.setListenerClasses( new ArrayList() );

Added: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java?rev=383108&view=auto
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java (added)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java Sat Mar  4 05:09:35 2006
@@ -0,0 +1,66 @@
+package org.apache.maven.surefire.testng;
+
+/*
+ * Copyright 2001-2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.maven.surefire.report.ReporterManager;
+import org.apache.maven.surefire.suite.SurefireTestSuite;
+import org.testng.ISuiteListener;
+import org.testng.ITestListener;
+import org.testng.TestNG;
+import org.testng.xml.XmlSuite;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Contains utility methods for executing TestNG.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ */
+public class TestNGExecutor
+{
+    private TestNGExecutor()
+    {
+    }
+
+    static void executeTestNG( SurefireTestSuite surefireSuite, String testSourceDirectory, XmlSuite suite,
+                               ReporterManager reporterManager )
+    {
+        TestNG testNG = new TestNG();
+        // turn off all TestNG output
+        testNG.setVerbose( 0 );
+
+        testNG.setXmlSuites( Collections.singletonList( suite ) );
+
+        testNG.setListenerClasses( new ArrayList() );
+
+        TestNGReporter reporter = new TestNGReporter( reporterManager, surefireSuite );
+        testNG.addListener( (ITestListener) reporter );
+        testNG.addListener( (ISuiteListener) reporter );
+
+        // Set source path so testng can find javadoc annotations if not in 1.5 jvm
+        if ( testSourceDirectory != null )
+        {
+            testNG.setSourcePath( testSourceDirectory );
+        }
+
+        ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader( suite.getClass().getClassLoader() );
+        testNG.runSuitesLocally();
+        Thread.currentThread().setContextClassLoader( oldClassLoader );
+    }
+}

Propchange: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGExecutor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGTestSet.java Sat Mar  4 05:09:35 2006
@@ -18,9 +18,7 @@
 
 import org.apache.maven.surefire.report.ReporterManager;
 import org.apache.maven.surefire.testset.AbstractTestSet;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
+import org.apache.maven.surefire.testset.TestSetFailedException;
 
 /**
  * Main plugin point for running testng tests within the Surefire runtime
@@ -40,33 +38,11 @@
         super( testClass );
     }
 
-    protected void discoverTestMethods()
+    public int getTestCount()
+        throws TestSetFailedException
     {
-        // TODO: This isn't correct. We really need to have TestNG do the counting for us.
-        if ( testMethods == null )
-        {
-            testMethods = new ArrayList();
-
-            Class testClass = getTestClass();
-            Method[] methods = testClass.getMethods();
-
-            for ( int i = 0; i < methods.length; ++i )
-            {
-                Method m = methods[i];
-
-                if ( isValidTestMethod( m ) )
-                {
-                    String simpleName = m.getName();
-
-                    // TODO: WHY?
-                    // name must have 5 or more chars
-                    if ( simpleName.length() > 4 )
-                    {
-                        testMethods.add( m );
-                    }
-                }
-            }
-        }
+        // TODO: need to get this from TestNG somehow
+        return 1;
     }
 
     public void execute( ReporterManager reportManager, ClassLoader loader )

Modified: maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java
URL: http://svn.apache.org/viewcvs/maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java?rev=383108&r1=383107&r2=383108&view=diff
==============================================================================
--- maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java (original)
+++ maven/surefire/branches/surefire-testng/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGXmlTestSuite.java Sat Mar  4 05:09:35 2006
@@ -18,19 +18,18 @@
 
 import org.apache.maven.surefire.report.ReporterManager;
 import org.apache.maven.surefire.suite.SurefireTestSuite;
-import org.testng.ISuiteListener;
-import org.testng.ITestListener;
-import org.testng.TestNG;
+import org.apache.maven.surefire.testset.TestSetFailedException;
 import org.testng.xml.Parser;
 import org.testng.xml.XmlSuite;
+import org.testng.xml.XmlTest;
 import org.xml.sax.SAXException;
 
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -42,114 +41,118 @@
 public class TestNGXmlTestSuite
     implements SurefireTestSuite
 {
-    protected File suiteFile;
+    private File suiteFile;
 
-    protected TestNG testRunner;
+    private String testSourceDirectory;
 
-    protected int m_testCount;
+    private XmlSuite suite;
 
-    protected String m_suiteName = "TestNG XML Suite";
+    private Map testSets;
 
     /**
      * Creates a testng testset to be configured by the specified
      * xml file.
      */
-    public TestNGXmlTestSuite( File suiteFile )
+    public TestNGXmlTestSuite( File suiteFile, String testSourceDirectory )
     {
         this.suiteFile = suiteFile;
-        parseSuite();
-    }
 
-    public void execute( ReporterManager reportManager, ClassLoader loader )
-    {
-        testRunner.runSuitesLocally();
+        this.testSourceDirectory = testSourceDirectory;
     }
 
-    public void execute( String testSetName, ReporterManager reporterManager, ClassLoader testsClassLoader )
+    public TestNGXmlTestSuite( File suiteFile )
     {
-        // TODO: if this can't be implemented here, I should have the booter recognise that and prevent it from getting
-        // the pertest treatment
+        this( suiteFile, null );
     }
 
-    public int getNumTests()
+    public void execute( ReporterManager reporterManager, ClassLoader classLoader )
     {
-        // TODO
-        return 0;  //To change body of implemented methods use File | Settings | File Templates.
-    }
+        if ( testSets == null )
+        {
+            throw new IllegalStateException( "You must call locateTestSets before calling execute" );
+        }
 
-    public int getNumTestSets()
-    {
-        // TODO
-        return 0;  //To change body of implemented methods use File | Settings | File Templates.
+        TestNGExecutor.executeTestNG( this, testSourceDirectory, suite, reporterManager );
     }
 
-    public String getName()
+    public void execute( String testSetName, ReporterManager reporterManager, ClassLoader classLoader )
+        throws TestSetFailedException
     {
-        return m_suiteName;
-    }
+        if ( testSets == null )
+        {
+            throw new IllegalStateException( "You must call locateTestSets before calling execute" );
+        }
+        XmlTest testSet = (XmlTest) testSets.get( testSetName );
 
-    public List getSubBatteries()
-    {
-        return Collections.EMPTY_LIST;
-    }
+        if ( testSet == null )
+        {
+            throw new TestSetFailedException( "Unable to find test set '" + testSetName + "' in suite" );
+        }
 
-    public int getTestCount()
-    {
-        return m_testCount;
+        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 );
     }
 
-    public void setOutputDirectory( String reportsDirectory )
+    public int getNumTests()
     {
-        testRunner.setOutputDirectory( reportsDirectory );
+        // TODO: need to get this from TestNG somehow
+        return 1;
     }
 
-    public void setReporter( TestNGReporter reporter )
+    public int getNumTestSets()
     {
-        testRunner.addListener( (ITestListener) reporter );
-        testRunner.addListener( (ISuiteListener) reporter );
+        return suite.getTests().size();
     }
 
-    /**
-     * Instantiates and partially configures testng suite
-     */
-    private void parseSuite()
+    public Map locateTestSets( ClassLoader classLoader )
+        throws TestSetFailedException
     {
-        testRunner = new TestNG();
-        List suites = new ArrayList();
-
-        try
+        if ( testSets != null )
         {
-            XmlSuite s = new Parser( suiteFile.getAbsolutePath() ).parse();
-            m_suiteName = s.getName();
-            m_testCount += s.getTests().size();
-            suites.add( s );
+            throw new IllegalStateException( "You can't call locateTestSets twice" );
         }
-        catch ( FileNotFoundException fne )
+        testSets = new LinkedHashMap();
+
+        try
         {
-            System.err.println( "File not found: " + suiteFile.getAbsolutePath() + " Ignoring." );
+            suite = new Parser( suiteFile.getAbsolutePath() ).parse();
         }
         catch ( IOException e )
         {
-            e.printStackTrace();
+            throw new TestSetFailedException( "Error reading test suite", e );
         }
         catch ( ParserConfigurationException e )
         {
-            e.printStackTrace();
+            throw new TestSetFailedException( "Error reading test suite", e );
         }
         catch ( SAXException e )
         {
-            e.printStackTrace();
+            throw new TestSetFailedException( "Error reading test suite", e );
         }
 
-        testRunner.setXmlSuites( suites );
-        // TODO: return when TestNG brings it back
-//        testRunner.setReportResults(false);
-    }
+        for ( Iterator i = suite.getTests().iterator(); i.hasNext(); )
+        {
+            XmlTest xmlTest = (XmlTest) i.next();
 
-    public Map locateTestSets( ClassLoader classLoader )
-    {
-        // TODO
-        return Collections.EMPTY_MAP;
-    }
+            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;
+    }
 }