You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2012/12/13 16:04:44 UTC
git commit: [SUREFIRE-916] upgradeCheck fails
Updated Branches:
refs/heads/master 7a6c71f14 -> 3274bd308
[SUREFIRE-916] upgradeCheck fails
Patch by Peter Lynch, applied unmodified
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/3274bd30
Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/3274bd30
Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/3274bd30
Branch: refs/heads/master
Commit: 3274bd308adc85ef16d463cb7aa8af290465bc67
Parents: 7a6c71f
Author: Kristian Rosenvold <kr...@apache.org>
Authored: Thu Dec 13 16:03:45 2012 +0100
Committer: Kristian Rosenvold <kr...@apache.org>
Committed: Thu Dec 13 16:03:45 2012 +0100
----------------------------------------------------------------------
.../maven/surefire/junit4/JUnit4Provider.java | 6 +-
.../maven/surefire/junit4/JUnit4Provider.java.orig | 297 +++++++++++++++
2 files changed, 300 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3274bd30/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
index 44cdb40..be5c2c5 100644
--- a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
+++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
@@ -213,17 +213,17 @@ public class JUnit4Provider
{
if ( isJunit4UpgradeCheck() )
{
- List<String> classesSkippedByValidation =
+ List<Class> classesSkippedByValidation =
scanResult.getClassesSkippedByValidation( jUnit4TestChecker, testClassLoader );
if ( !classesSkippedByValidation.isEmpty() )
{
StringBuilder reason = new StringBuilder();
reason.append( "Updated check failed\n" );
reason.append( "There are tests that would be run with junit4 / surefire 2.6 but not with [2.7,):\n" );
- for ( String testClass : classesSkippedByValidation )
+ for ( Class testClass : classesSkippedByValidation )
{
reason.append( " " );
- reason.append( testClass );
+ reason.append( testClass.getName() );
reason.append( "\n" );
}
throw new TestSetFailedException( reason.toString() );
http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3274bd30/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java.orig
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java.orig b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java.orig
new file mode 100644
index 0000000..44cdb40
--- /dev/null
+++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java.orig
@@ -0,0 +1,297 @@
+package org.apache.maven.surefire.junit4;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.shared.utils.io.SelectorUtils;
+import org.apache.maven.surefire.common.junit4.JUnit4RunListener;
+import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
+import org.apache.maven.surefire.common.junit4.JUnit4TestChecker;
+import org.apache.maven.surefire.providerapi.AbstractProvider;
+import org.apache.maven.surefire.providerapi.ProviderParameters;
+import org.apache.maven.surefire.report.ConsoleOutputCapture;
+import org.apache.maven.surefire.report.ConsoleOutputReceiver;
+import org.apache.maven.surefire.report.PojoStackTraceWriter;
+import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.ReporterException;
+import org.apache.maven.surefire.report.ReporterFactory;
+import org.apache.maven.surefire.report.RunListener;
+import org.apache.maven.surefire.report.SimpleReportEntry;
+import org.apache.maven.surefire.suite.RunResult;
+import org.apache.maven.surefire.testset.TestSetFailedException;
+import org.apache.maven.surefire.util.RunOrderCalculator;
+import org.apache.maven.surefire.util.ScanResult;
+import org.apache.maven.surefire.util.TestsToRun;
+import org.apache.maven.surefire.util.internal.StringUtils;
+
+import org.junit.runner.Request;
+import org.junit.runner.Result;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.RunNotifier;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class JUnit4Provider
+ extends AbstractProvider
+{
+ private final ClassLoader testClassLoader;
+
+ private final List<org.junit.runner.notification.RunListener> customRunListeners;
+
+ private final JUnit4TestChecker jUnit4TestChecker;
+
+ private final String requestedTestMethod;
+
+ private TestsToRun testsToRun;
+
+ private final ProviderParameters providerParameters;
+
+ private final RunOrderCalculator runOrderCalculator;
+
+ private final ScanResult scanResult;
+
+
+ public JUnit4Provider( ProviderParameters booterParameters )
+ {
+ this.providerParameters = booterParameters;
+ this.testClassLoader = booterParameters.getTestClassLoader();
+ this.scanResult = booterParameters.getScanResult();
+ this.runOrderCalculator = booterParameters.getRunOrderCalculator();
+ customRunListeners = JUnit4RunListenerFactory.
+ createCustomListeners( booterParameters.getProviderProperties().getProperty( "listener" ) );
+ jUnit4TestChecker = new JUnit4TestChecker( testClassLoader );
+ requestedTestMethod = booterParameters.getTestRequest().getRequestedTestMethod();
+
+ }
+
+ public RunResult invoke( Object forkTestSet )
+ throws TestSetFailedException, ReporterException
+ {
+ if ( testsToRun == null )
+ {
+ if ( forkTestSet instanceof TestsToRun )
+ {
+ testsToRun = (TestsToRun) forkTestSet;
+ }
+ else if ( forkTestSet instanceof Class )
+ {
+ testsToRun = TestsToRun.fromClass( (Class) forkTestSet );
+ }
+ else
+ {
+ testsToRun = scanClassPath();
+ }
+ }
+
+ upgradeCheck();
+
+ final ReporterFactory reporterFactory = providerParameters.getReporterFactory();
+
+ final RunListener reporter = reporterFactory.createReporter();
+
+ ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter );
+
+ JUnit4RunListener jUnit4TestSetReporter = new JUnit4RunListener( reporter );
+
+ Result result = new Result();
+ RunNotifier runNotifer = getRunNotifer( jUnit4TestSetReporter, result, customRunListeners );
+
+ runNotifer.fireTestRunStarted( null );
+
+ for ( @SuppressWarnings( "unchecked" ) Iterator<Class<?>> iter = testsToRun.iterator(); iter.hasNext(); )
+ {
+ executeTestSet( iter.next(), reporter, runNotifer );
+ }
+
+ runNotifer.fireTestRunFinished( result );
+
+ JUnit4RunListener.rethrowAnyTestMechanismFailures( result );
+
+ closeRunNotifer( jUnit4TestSetReporter, customRunListeners );
+
+ return reporterFactory.close();
+ }
+
+ private void executeTestSet( Class<?> clazz, RunListener reporter, RunNotifier listeners )
+ throws ReporterException, TestSetFailedException
+ {
+ final ReportEntry report = new SimpleReportEntry( this.getClass().getName(), clazz.getName() );
+
+ reporter.testSetStarting( report );
+
+ try
+ {
+ if ( !StringUtils.isBlank( this.requestedTestMethod ) )
+ {
+ String actualTestMethod = getMethod( clazz, this.requestedTestMethod );//add by rainLee
+ String[] testMethods = StringUtils.split( actualTestMethod, "+" );
+ execute( clazz, listeners, testMethods );
+ }
+ else
+ {//the original way
+ execute( clazz, listeners, null );
+ }
+ }
+ catch ( TestSetFailedException e )
+ {
+ throw e;
+ }
+ catch ( Throwable e )
+ {
+ reporter.testError( SimpleReportEntry.withException( report.getSourceName(), report.getName(),
+ new PojoStackTraceWriter( report.getSourceName(),
+ report.getName(), e ) ) );
+ }
+ finally
+ {
+ reporter.testSetCompleted( report );
+ }
+ }
+
+ private RunNotifier getRunNotifer( org.junit.runner.notification.RunListener main, Result result,
+ List<org.junit.runner.notification.RunListener> others )
+ {
+ RunNotifier fNotifier = new RunNotifier();
+ fNotifier.addListener( main );
+ fNotifier.addListener( result.createListener() );
+ for ( org.junit.runner.notification.RunListener listener : others )
+ {
+ fNotifier.addListener( listener );
+ }
+ return fNotifier;
+ }
+
+ // I am not entierly sure as to why we do this explicit freeing, it's one of those
+ // pieces of code that just seem to linger on in here ;)
+ private void closeRunNotifer( org.junit.runner.notification.RunListener main,
+ List<org.junit.runner.notification.RunListener> others )
+ {
+ RunNotifier fNotifier = new RunNotifier();
+ fNotifier.removeListener( main );
+ for ( org.junit.runner.notification.RunListener listener : others )
+ {
+ fNotifier.removeListener( listener );
+ }
+ }
+
+ public Iterator<?> getSuites()
+ {
+ testsToRun = scanClassPath();
+ return testsToRun.iterator();
+ }
+
+ private TestsToRun scanClassPath()
+ {
+ final TestsToRun scannedClasses = scanResult.applyFilter( jUnit4TestChecker, testClassLoader );
+ return runOrderCalculator.orderTestClasses( scannedClasses );
+ }
+
+ @SuppressWarnings("unchecked")
+ private void upgradeCheck()
+ throws TestSetFailedException
+ {
+ if ( isJunit4UpgradeCheck() )
+ {
+ List<String> classesSkippedByValidation =
+ scanResult.getClassesSkippedByValidation( jUnit4TestChecker, testClassLoader );
+ if ( !classesSkippedByValidation.isEmpty() )
+ {
+ StringBuilder reason = new StringBuilder();
+ reason.append( "Updated check failed\n" );
+ reason.append( "There are tests that would be run with junit4 / surefire 2.6 but not with [2.7,):\n" );
+ for ( String testClass : classesSkippedByValidation )
+ {
+ reason.append( " " );
+ reason.append( testClass );
+ reason.append( "\n" );
+ }
+ throw new TestSetFailedException( reason.toString() );
+ }
+ }
+ }
+
+ private boolean isJunit4UpgradeCheck()
+ {
+ final String property = System.getProperty( "surefire.junit4.upgradecheck" );
+ return property != null;
+ }
+
+
+ private static void execute( Class<?> testClass, RunNotifier fNotifier, String[] testMethods )
+ throws TestSetFailedException
+ {
+ if ( null != testMethods )
+ {
+ Method[] methods = testClass.getMethods();
+ for ( Method method : methods )
+ {
+ for ( String testMethod : testMethods )
+ {
+ if ( SelectorUtils.match( testMethod, method.getName() ) )
+ {
+ Runner junitTestRunner = Request.method( testClass, method.getName() ).getRunner();
+ junitTestRunner.run( fNotifier );
+ }
+
+ }
+ }
+ return;
+ }
+
+ Runner junitTestRunner = Request.aClass( testClass ).getRunner();
+
+ junitTestRunner.run( fNotifier );
+ }
+
+ /**
+ * this method retrive testMethods from String like "com.xx.ImmutablePairTest#testBasic,com.xx.StopWatchTest#testLang315+testStopWatchSimpleGet"
+ * <br>
+ * and we need to think about cases that 2 or more method in 1 class. we should choose the correct method
+ *
+ * @param testClass the testclass
+ * @param testMethodStr the test method string
+ * @return a string ;)
+ */
+ private static String getMethod( Class testClass, String testMethodStr )
+ {
+ String className = testClass.getName();
+
+ if ( !testMethodStr.contains( "#" ) && !testMethodStr.contains( "," ) )
+ {//the original way
+ return testMethodStr;
+ }
+ testMethodStr += ",";//for the bellow split code
+ int beginIndex = testMethodStr.indexOf( className );
+ int endIndex = testMethodStr.indexOf( ",", beginIndex );
+ String classMethodStr =
+ testMethodStr.substring( beginIndex, endIndex );//String like "StopWatchTest#testLang315"
+
+ int index = classMethodStr.indexOf( '#' );
+ if ( index >= 0 )
+ {
+ return classMethodStr.substring( index + 1, classMethodStr.length() );
+ }
+ return null;
+ }
+}