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/01/08 22:24:40 UTC
svn commit: r1228960 - in /maven/surefire/trunk:
surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/
surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/
surefire-integration-tests/src/test/resources...
Author: krosenvold
Date: Sun Jan 8 21:24:39 2012
New Revision: 1228960
URL: http://svn.apache.org/viewvc?rev=1228960&view=rev
Log:
[SUREFIRE-800] Fixed beforeclass/afterclass output when running classes=parallel
Added:
maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java (with props)
Modified:
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFile.java
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire628ConsoleOutputBeforeAndAfterClassIT.java
maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/pom.xml
maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/src/test/java/surefire628/Test2.java
maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentReporterManager.java
maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java
maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java
Modified: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFile.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFile.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFile.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/fixture/TestFile.java Sun Jan 8 21:24:39 2012
@@ -121,17 +121,18 @@ public class TestFile
return file.isFile();
}
- public void assertContainsText( String text )
+ public TestFile assertContainsText( String text )
{
final List<String> list = surefireVerifier.loadFile( file, false );
for ( String line : list )
{
if ( line.contains( text ) )
{
- return;
+ return this;
}
}
Assert.fail( "Did not find expected message in log" );
+ return null;
}
public URI toURI() {
Modified: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire628ConsoleOutputBeforeAndAfterClassIT.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire628ConsoleOutputBeforeAndAfterClassIT.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire628ConsoleOutputBeforeAndAfterClassIT.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire628ConsoleOutputBeforeAndAfterClassIT.java Sun Jan 8 21:24:39 2012
@@ -21,11 +21,12 @@ package org.apache.maven.surefire.its.ji
import org.apache.maven.surefire.its.fixture.OutputValidator;
import org.apache.maven.surefire.its.fixture.SurefireIntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.TestFile;
/**
* Asserts that console output always goes somewhere ;)
*
- * @author Kristian Rosenvold
+ * @author Kristian Rosenvold assertContainsText
*/
public class Surefire628ConsoleOutputBeforeAndAfterClassIT
extends SurefireIntegrationTestCase
@@ -34,14 +35,30 @@ public class Surefire628ConsoleOutputBef
public void testJunit3ParallelBuildResultCount()
{
OutputValidator validator = unpack("surefire-628-consoleoutputbeforeandafterclass")
- .failNever().executeTest();
+ .failNever().parallelMethods().executeTest();
validator.verifyTextInLog("628Test1");
validator.verifyTextInLog("Before628Test1");
validator.verifyTextInLog("After628Test1");
validator.verifyTextInLog("628Test2");
- validator.verifyTextInLog("Before628Test2");
- validator.verifyTextInLog("After628Test2");
+ validator.verifyTextInLog("BeforeClass628Test2");
+ validator.verifyTextInLog("AfterClass628Test2");
}
+
+
+ public void testProperBeforeAndAfterClassCapture()
+ {
+ OutputValidator validator = unpack("surefire-628-consoleoutputbeforeandafterclass")
+ .failNever().redirectToFile( true ).parallelClasses().executeTest();
+
+ final TestFile surefireReportsFile = validator.getSurefireReportsFile( "surefire628.Test2-output.txt" );
+
+ surefireReportsFile
+ .assertContainsText("628Test2")
+ .assertContainsText("BeforeClass628Test2")
+ .assertContainsText("AfterClass628Test2");
+ }
+
+
}
\ No newline at end of file
Modified: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/pom.xml?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/pom.xml (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/pom.xml Sun Jan 8 21:24:39 2012
@@ -9,7 +9,7 @@
<url>http://maven.apache.org</url>
<properties>
<junit.version>4.8.1</junit.version>
- <junit.parallel>methods</junit.parallel>
+ <parallel>methods</parallel>
</properties>
<dependencies>
<dependency>
@@ -34,7 +34,6 @@
<version>${surefire.version}</version>
<configuration>
<forkMode>once</forkMode>
- <parallel>${junit.parallel}</parallel>
<threadCount>5</threadCount>
<includes>
<include>**/Test*.java</include>
Modified: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/src/test/java/surefire628/Test2.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/src/test/java/surefire628/Test2.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/src/test/java/surefire628/Test2.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-628-consoleoutputbeforeandafterclass/src/test/java/surefire628/Test2.java Sun Jan 8 21:24:39 2012
@@ -19,15 +19,9 @@ package surefire628;
*/
-import org.junit.Test;
-import org.junit.BeforeClass;
import org.junit.AfterClass;
-
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assume.*;
+import org.junit.BeforeClass;
+import org.junit.Test;
public class Test2
{
@Test
@@ -37,12 +31,12 @@ public class Test2
@BeforeClass
public static void testWithFailingAssumption2() {
- System.out.println( "Before628Test2 on" + Thread.currentThread().getName());
+ System.out.println( "BeforeClass628Test2 on" + Thread.currentThread().getName());
}
@AfterClass
public static void testWithFailingAssumption3() {
- System.out.println( "After628Test2 on" + Thread.currentThread().getName());
+ System.out.println( "AfterClass628Test2 on" + Thread.currentThread().getName());
}
}
\ No newline at end of file
Added: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java?rev=1228960&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java (added)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java Sun Jan 8 21:24:39 2012
@@ -0,0 +1,71 @@
+package org.apache.maven.surefire.junitcore;
+
+/*
+ * 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 org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.RunNotifier;
+
+/**
+ * Attaches the current class to the thread
+ *
+ * @author Kristian Rosenvold
+ */
+public class ClassDemarcatingRunner
+ extends Runner
+{
+ private final Runner target;
+
+ private final Class testClass;
+
+ private static final ThreadLocal<Class> currentlyRunning = new ThreadLocal<Class>();
+
+ public ClassDemarcatingRunner( Runner target, Class testClass )
+ {
+ this.target = target;
+ this.testClass = testClass;
+ }
+
+ @Override
+ public Description getDescription()
+ {
+ return target.getDescription();
+ }
+
+ @Override
+ public void run( RunNotifier notifier )
+ {
+ currentlyRunning.set( testClass );
+ try
+ {
+ target.run( notifier );
+ }
+ finally
+ {
+ currentlyRunning.remove();
+ }
+ }
+
+ public static String getCurrentTestClass()
+ {
+ Class aClass = currentlyRunning.get();
+ return aClass != null ? aClass.getName() : null;
+ }
+}
Propchange: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassDemarcatingRunner.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentReporterManager.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentReporterManager.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentReporterManager.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentReporterManager.java Sun Jan 8 21:24:39 2012
@@ -29,7 +29,7 @@ import org.apache.maven.surefire.testset
/**
* Handles responses from concurrent junit
- *
+ * <p/>
* Stuff to remember about JUnit threading:
* parallel=classes; beforeClass/afterClass, constructor and all tests method run on same thread
* parallel=methods; beforeClass/afterClass run on main thread, constructor + each test method run on same thread
@@ -41,7 +41,6 @@ public abstract class ConcurrentReporter
implements RunListener, ConsoleOutputReceiver
{
private final Map<String, TestSet> classMethodCounts;
- // private final ReporterConfiguration reporterConfiguration;
private final ThreadLocal<RunListener> reporterManagerThreadLocal = new ThreadLocal<RunListener>();
@@ -152,7 +151,12 @@ public abstract class ConcurrentReporter
TestSet getTestSet( ReportEntry description )
{
- return classMethodCounts.get( description.getSourceName() );
+ TestSet testSet = classMethodCounts.get( description.getSourceName() );
+ if ( testSet == null )
+ {
+ testSet = classMethodCounts.get( ClassDemarcatingRunner.getCurrentTestClass() );
+ }
+ return testSet;
}
RunListener getRunListener()
@@ -191,8 +195,17 @@ public abstract class ConcurrentReporter
}
else
{
- // Not able to assocaite output with any thread. Just dump to console
- consoleLogger.info( new String( buf, off, len ) );
+ String currentTestClassName = ClassDemarcatingRunner.getCurrentTestClass();
+ TestSet testSet = currentTestClassName != null ? classMethodCounts.get( currentTestClassName ) : null;
+ if ( testSet != null )
+ {
+ testSet.getClassLevelLogicalStream().write( stdout, buf, off, len );
+ }
+ else
+ {
+ // Not able to assocaite output with any thread. Just dump to console
+ consoleLogger.info( new String( buf, off, len ) );
+ }
}
}
Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConfigurableParallelComputer.java Sun Jan 8 21:24:39 2012
@@ -140,7 +140,8 @@ public class ConfigurableParallelCompute
throws Throwable
{
Runner runner = super.getRunner( builder, testClass );
- return fMethods && !isTestSuite( testClass )? parallelize( runner, getMethodInterceptor() ) : runner;
+ ClassDemarcatingRunner classDemarcatingRunner = new ClassDemarcatingRunner(runner, testClass);
+ return fMethods && !isTestSuite( testClass )? parallelize( classDemarcatingRunner, getMethodInterceptor() ) : classDemarcatingRunner;
}
private boolean isTestSuite( Class<?> testClass){
Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java?rev=1228960&r1=1228959&r2=1228960&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java Sun Jan 8 21:24:39 2012
@@ -24,6 +24,7 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.maven.surefire.report.ConsoleOutputReceiver;
import org.apache.maven.surefire.report.ReportEntry;
import org.apache.maven.surefire.report.RunListener;
import org.apache.maven.surefire.report.SimpleReportEntry;
@@ -53,6 +54,9 @@ public class TestSet
private final AtomicBoolean played = new AtomicBoolean();
+ private volatile LogicalStream beforeClass;
+
+ private volatile LogicalStream afterClass;
public TestSet( Description testSetDescription )
{
@@ -77,6 +81,11 @@ public class TestSet
target.testSetStarting( report );
+ if ( beforeClass != null )
+ {
+ beforeClass.writeDetails( ( (ConsoleOutputReceiver) target ) );
+ }
+
for ( TestMethod testMethod : testMethods )
{
testMethod.replay( target );
@@ -84,6 +93,10 @@ public class TestSet
report = createReportEntry( elapsed );
+ if ( afterClass != null )
+ {
+ afterClass.writeDetails( ( (ConsoleOutputReceiver) target ) );
+ }
target.testSetCompleted( report );
}
catch ( Exception e )
@@ -149,4 +162,26 @@ public class TestSet
{
return testSet.get();
}
+
+ public LogicalStream getClassLevelLogicalStream()
+ {
+ if ( numberOfCompletedChildren.get() > 0 )
+ {
+ if ( afterClass == null )
+ {
+ afterClass = new LogicalStream();
+ }
+ return afterClass;
+ }
+ else
+ {
+ if ( beforeClass == null )
+ {
+ beforeClass = new LogicalStream();
+ }
+ return beforeClass;
+ }
+ }
+
+
}