blob: 6942010100475df96e634ba5ae24a49d3f3e5503 [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.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.Computer;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.RunListener;
/**
* Simple test of ConfigurableParallelComputer.
*
* @author Kristian Rosenvold
*/
public class ConfigurableParallelComputerTest
extends TestCase
{
private static final int NUMTESTS = 1000;
// I'm sorry about all the sout's in this test; but if you deadlock when building you will appreciate it.
@Test
public void testAnythingYouWantToPlayWith()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = new Class[]{ Dummy.class, Dummy2.class };
DiagnosticRunListener diagnosticRunListener = new DiagnosticRunListener( false, result.createListener() );
JUnitCore jUnitCore = getJunitCore( diagnosticRunListener );
ConfigurableParallelComputer computer = new ConfigurableParallelComputer( true, false );
jUnitCore.run( computer, realClasses );
computer.close();
assertEquals( "All tests should succeed, right ?", 5, result.getRunCount() );
}
@Test
public void testOneMethod()
throws ExecutionException
{
JUnitCore jUnitCore = new JUnitCore();
ConfigurableParallelComputer computer = new ConfigurableParallelComputer( false, true );
jUnitCore.run( computer, new Class[]{ Dummy.class, Dummy.class, Dummy.class } );
computer.close();
}
@Test
public void testSerial()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = getClassList();
JUnitCore jUnitCore = getJunitCore( result );
Computer computer = new Computer();
timedRun( NUMTESTS, result, realClasses, jUnitCore, computer );
}
@Test
public void testFullTestRunPC()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = getClassList();
JUnitCore jUnitCore = getJunitCore( result );
Computer computer = new ConfigurableParallelComputer( true, true );
timedRun( NUMTESTS, result, realClasses, jUnitCore, computer );
}
@Test
public void testWithFailingAssertionCPC()
throws Exception
{
runWithFailingAssertion( new ConfigurableParallelComputer( false, true, 6, true ) );
runWithFailingAssertion( new ConfigurableParallelComputer( true, false, 12, false ) );
runWithFailingAssertion( new ConfigurableParallelComputer( true, true, 2, false ) );
}
@Test
public void testWithSlowTestJustAfew()
throws Exception
{
Result result = new Result();
final Computer computer = new ConfigurableParallelComputer( false, true, 3, false );
Class<?>[] realClasses = getClassList( SlowTest.class, 5 ); // 300 ms in methods, 600 in classes
JUnitCore jUnitCore = getJunitCore( result );
runIt( realClasses, jUnitCore, computer );
}
private void runWithFailingAssertion( Computer computer )
throws ExecutionException
{
Result result = new Result();
Class<?>[] realClasses = getClassList( FailingAssertions.class );
JUnitCore jUnitCore = getJunitCore( result );
runIt( realClasses, jUnitCore, computer );
assertEquals( "No tests should fail, right ?", NUMTESTS, result.getFailures().size() );
assertEquals( "All tests should succeed, right ?", 0, result.getIgnoreCount() );
assertEquals( "All tests should succeed, right ?", NUMTESTS * 3, result.getRunCount() );
}
@Test
public void testWithFailure()
throws Exception
{
Computer computer = new ConfigurableParallelComputer( false, true, 4, true );
Result result = new Result();
Class<?>[] realClasses = getClassList( Failure.class );
JUnitCore jUnitCore = getJunitCore( result );
runIt( realClasses, jUnitCore, computer );
assertEquals( "No tests should fail, right ?", NUMTESTS, result.getFailures().size() );
assertEquals( "All tests should succeed, right ?", 0, result.getIgnoreCount() );
assertEquals( "All tests should succeed, right ?", NUMTESTS * 3, result.getRunCount() );
}
@Test
public void testFixedThreadPool()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = getClassList();
JUnitCore jUnitCore = getJunitCore( result );
ConfigurableParallelComputer computer = new ConfigurableParallelComputer( false, true, 2, false );
timedRun( NUMTESTS, result, realClasses, jUnitCore, computer );
}
@Test
public void testClassesUnlimited()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = getClassList();
JUnitCore jUnitCore = getJunitCore( result );
ConfigurableParallelComputer computer = new ConfigurableParallelComputer( true, false );
timedRun( NUMTESTS, result, realClasses, jUnitCore, computer );
}
@Test
public void testBothUnlimited()
throws Exception
{
Result result = new Result();
Class<?>[] realClasses = getClassList();
DiagnosticRunListener diagnosticRunListener = new DiagnosticRunListener( false, result.createListener() );
JUnitCore jUnitCore = getJunitCore( diagnosticRunListener );
ConfigurableParallelComputer computer = new ConfigurableParallelComputer( true, true );
timedRun( NUMTESTS, result, realClasses, jUnitCore, computer );
}
private JUnitCore getJunitCore( Result result )
{
RunListener listener = result.createListener();
JUnitCore jUnitCore = new JUnitCore();
jUnitCore.addListener( listener );
return jUnitCore;
}
private JUnitCore getJunitCore( RunListener listener )
{
JUnitCore jUnitCore = new JUnitCore();
jUnitCore.addListener( listener );
return jUnitCore;
}
private long runIt( Class<?>[] realClasses, JUnitCore jUnitCore, Computer computer )
throws ExecutionException
{
long start = System.currentTimeMillis();
jUnitCore.run( computer, realClasses );
if ( computer instanceof ConfigurableParallelComputer )
{
( (ConfigurableParallelComputer) computer ).close();
}
return System.currentTimeMillis() - start;
}
private long timedRun( int numTests, Result result, Class<?>[] realClasses, JUnitCore jUnitCore, Computer computer )
throws ExecutionException
{
long time = runIt( realClasses, jUnitCore, computer );
assertEquals( "No tests should fail, right ?", 0, result.getFailures().size() );
assertEquals( "All tests should succeed, right ?", 0, result.getIgnoreCount() );
assertEquals( "All tests should succeed, right ?", numTests * 3, result.getRunCount() );
return time;
}
private Class<?>[] getClassList()
{
return getClassList( Dummy.class, NUMTESTS );
}
private Class<?>[] getClassList( Class<?> testClass )
{
return getClassList( testClass, NUMTESTS );
}
private Class<?>[] getClassList( Class<?> testClass, int numItems )
{
List<Class<?>> realClasses = new ArrayList<>();
for ( int i = 0; i < numItems; i++ )
{
realClasses.add( testClass );
}
return realClasses.toArray( new Class[realClasses.size()] );
}
static void sleepReallyEvenOnWindows( long ms )
throws InterruptedException
{
long endAt = System.currentTimeMillis() + ms;
Thread.sleep( ms );
while ( endAt > System.currentTimeMillis() )
{
Thread.sleep( ms / 10 );
Thread.yield();
}
}
/**
*
*/
public static class Dummy
{
@Test
public void testNotMuch()
{
}
@Test
public void testStub1()
{
// Add your code here
}
@Test
public void testStub2()
{
// Add your code here
}
}
/**
*
*/
public static class Dummy2
{
@Test
public void testNotMuch()
{
}
@Test
public void testDummy2()
{
// Add your code here
}
}
/**
*
*/
public static class SlowTest
{
final int scaling = 100;
@Test
public void testNotMuch()
throws InterruptedException
{
sleepReallyEvenOnWindows( scaling );
}
@Test
public void testNotMuch2()
throws InterruptedException
{
sleepReallyEvenOnWindows( 3 * scaling );
}
@Test
public void testNotMuch3()
throws InterruptedException
{
sleepReallyEvenOnWindows( 2 * scaling );
}
}
/**
*
*/
public static class FailingAssertions
{
@Test
public void testNotMuch()
{
}
@Test
public void testNotMuch2()
{
}
@Test
public void testWithFail()
{
fail( "We excpect this" );
}
}
/**
*
*/
public static class Failure
{
@Test
public void testNotMuch()
{
}
@Test
public void testNotMuch2()
{
}
@Test
public void testWithException()
{
throw new RuntimeException( "We expect this" );
}
}
}