blob: 8940b51a954d55f5bd855e104511a3be66d8b686 [file] [log] [blame]
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 java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
import org.apache.maven.surefire.api.report.ConsoleStream;
import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter;
import org.apache.maven.surefire.api.report.ReporterFactory;
import org.apache.maven.surefire.api.report.RunListener;
import org.apache.maven.surefire.report.RunStatistics;
import org.apache.maven.surefire.api.testset.TestSetFailedException;
import junit.framework.Assert;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.Computer;
import org.junit.runner.JUnitCore;
/**
* @author Kristian Rosenvold
*/
public class ConcurrentRunListenerTest
extends TestCase
{
// Tests are in order of increasing complexity
public void testNoErrorsCounting()
throws Exception
{
runClasses( 3, 0, 0, DummyAllOk.class );
}
public void testNoErrorsCounting2()
throws Exception
{
runClasses( 2, 0, 0, Dummy3.class );
}
public void testOneIgnoreCounting()
throws Exception
{
runClasses( 3, 1, 0, DummyWithOneIgnore.class );
}
public void testOneFailureCounting()
throws Exception
{
runClasses( 3, 0, 1, DummyWithFailure.class );
}
public void testWithErrorsCountingDemultiplexed()
throws Exception
{
runClasses( 6, 1, 1, DummyWithOneIgnore.class, DummyWithFailure.class );
}
public void testJunitResultCountingDemultiplexed()
throws Exception
{
runClasses( 8, 1, 1, DummyWithOneIgnore.class, DummyWithFailure.class, Dummy3.class );
}
public void testJunitResultCountingJUnit3Demultiplexed()
throws Exception
{
runClasses( 3, 0, 0, Junit3Tc1.class, Junit3Tc2.class );
}
public void testJunitResultCountingJUnit3OddTest()
throws Exception
{
runClasses( 2, 0, 0, Junit3OddTest1.class );
}
public void testJunit3WithNestedSuite()
throws TestSetFailedException
{
runClasses( 4, 0, 0, Junit3WithNestedSuite.class );
}
public void testJunit3NestedSuite()
throws Exception
{
runClasses( 2, 0, 0, Junit3OddTest1.class );
}
public void testSimpleOutput()
throws Exception
{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream collector = new PrintStream( byteArrayOutputStream );
PrintStream orgOur = System.out;
System.setOut( collector );
RunStatistics result = runClasses( Dummy3.class );
assertReporter( result, 2, 0, 0, "msgs" );
String foo = new String( byteArrayOutputStream.toByteArray() );
assertNotNull( foo );
System.setOut( orgOur );
}
public void testOutputOrdering()
throws Exception
{
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream collector = new PrintStream( byteArrayOutputStream );
PrintStream orgOur = System.out;
System.setOut( collector );
RunStatistics result = runClasses( DummyWithOneIgnore.class, DummyWithFailure.class, Dummy3.class );
assertReporter( result, 8, 1, 1, "msgs" );
String foo = new String( byteArrayOutputStream.toByteArray() );
assertNotNull( foo );
System.setOut( orgOur );
// final List<String> stringList = result.getEvents();
// assertEquals( 23, stringList.size() );
}
private void runClasses( int success, int ignored, int failure, Class<?>... classes )
throws TestSetFailedException
{
DefaultReporterFactory reporterFactory = createReporterFactory();
HashMap<String, TestSet> classMethodCounts = new HashMap<>();
final ConsoleStream defaultConsoleReporter = new DefaultDirectConsoleReporter( System.out );
RunListener reporter =
new ClassesParallelRunListener( classMethodCounts, reporterFactory, defaultConsoleReporter );
JUnitCoreRunListener runListener = new JUnitCoreRunListener( reporter, classMethodCounts );
RunStatistics result = runClasses( reporterFactory, runListener, classes );
assertReporter( result, success, ignored, failure, "classes" );
classMethodCounts.clear();
reporterFactory = createReporterFactory();
reporter = new MethodsParallelRunListener( classMethodCounts, reporterFactory, true, defaultConsoleReporter );
runListener = new JUnitCoreRunListener( reporter, classMethodCounts );
result = runClasses( reporterFactory, runListener, classes );
assertReporter( result, success, ignored, failure, "methods" );
}
private RunStatistics runClasses( Class<?>... classes )
throws TestSetFailedException
{
HashMap<String, TestSet> classMethodCounts = new HashMap<>();
final DefaultReporterFactory reporterManagerFactory = createReporterFactory();
org.junit.runner.notification.RunListener demultiplexingRunListener =
createRunListener( reporterManagerFactory, classMethodCounts );
JUnitCore jUnitCore = new JUnitCore();
jUnitCore.addListener( demultiplexingRunListener );
Computer computer = new Computer();
jUnitCore.run( computer, classes );
reporterManagerFactory.close();
return reporterManagerFactory.getGlobalRunStatistics();
}
private RunStatistics runClasses( DefaultReporterFactory reporterManagerFactory,
org.junit.runner.notification.RunListener demultiplexingRunListener,
Class<?>... classes )
throws TestSetFailedException
{
JUnitCore jUnitCore = new JUnitCore();
jUnitCore.addListener( demultiplexingRunListener );
Computer computer = new Computer();
jUnitCore.run( computer, classes );
return reporterManagerFactory.getGlobalRunStatistics();
}
private org.junit.runner.notification.RunListener createRunListener( ReporterFactory reporterFactory,
Map<String, TestSet> testSetMap )
throws TestSetFailedException
{
return new JUnitCoreRunListener(
new ClassesParallelRunListener( testSetMap, reporterFactory,
new DefaultDirectConsoleReporter( System.out ) ), testSetMap );
}
/**
*
*/
public static class DummyWithOneIgnore
{
@Test
public void testNotMuch()
{
}
@Ignore
@Test
public void testStub1()
{
}
@Test
public void testStub2()
{
}
}
/**
*
*/
public static class DummyWithFailure
{
@Test
public void testBeforeFail()
{
}
@Test
public void testWillFail()
{
Assert.fail( "We will fail" );
}
@Test
public void testAfterFail()
{
}
}
/**
*
*/
public static class DummyAllOk
{
@Test
public void testNotMuchA()
{
}
@Test
public void testStub1A()
{
}
@Test
public void testStub2A()
{
}
}
/**
*
*/
public static class Dummy3
{
@Test
public void testNotMuchA()
{
System.out.println( "tNMA1" );
System.err.println( "tNMA1err" );
}
@Test
public void testStub2A()
{
System.out.println( "tS2A" );
System.err.println( "tS2AErr" );
}
}
/**
*
*/
public static class Junit3Tc1
extends TestCase
{
public Junit3Tc1()
{
super( "testNotMuchJunit3TC1" );
}
public void testNotMuchJunit3TC1()
{
System.out.println( "Junit3TC1" );
}
public static junit.framework.Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest( new Junit3Tc1() );
return suite;
}
}
/**
*
*/
public static class Junit3Tc2
extends TestCase
{
public Junit3Tc2( String testMethod )
{
super( testMethod );
}
public void testNotMuchJunit3TC2()
{
System.out.println( "Junit3TC2" );
}
public void testStubJ3TC2A()
{
System.out.println( "testStubJ3TC2A" );
}
public static junit.framework.Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest( new Junit3Tc2( "testNotMuchJunit3TC2" ) );
suite.addTest( new Junit3Tc2( "testStubJ3TC2A" ) );
return suite;
}
}
/**
*
*/
public static class Junit3OddTest1
extends TestCase
{
public static junit.framework.Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest( new Junit3OddTest1( "testMe" ) );
suite.addTest( new Junit3OddTest1( "testMe2" ) );
return suite;
}
public Junit3OddTest1( String name )
{
super( name );
}
public void testMe()
{
assertTrue( true );
}
}
/**
*
*/
public static class Junit3WithNestedSuite
extends TestCase
{
public static junit.framework.Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest( new Junit3WithNestedSuite( "testMe" ) );
suite.addTest( new Junit3WithNestedSuite( "testMe2" ) );
suite.addTestSuite( Junit3Tc2.class );
return suite;
}
public Junit3WithNestedSuite( String name )
{
super( name );
}
public void testMe2()
{
assertTrue( true );
}
}
private DefaultReporterFactory createReporterFactory()
{
return JUnitCoreTester.defaultNoXml();
}
private void assertReporter( RunStatistics result, int success, int ignored, int failure, String message )
{
assertEquals( message, success, result.getCompletedCount() );
assertEquals( message, ignored, result.getSkipped() );
}
}