blob: 14e4d823e9cbe5e122f14f831b0daeb2ce2c9dcc [file] [log] [blame]
package org.apache.maven.plugin.surefire.report;
/*
* 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.File;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Queue;
import junit.framework.TestCase;
import org.apache.maven.plugin.surefire.StartupReportConfiguration;
import org.apache.maven.plugin.surefire.extensions.SurefireConsoleOutputReporter;
import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter;
import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
import org.apache.maven.surefire.shared.utils.logging.MessageUtils;
import org.apache.maven.surefire.report.RunStatistics;
import org.apache.maven.surefire.api.report.SafeThrowable;
import org.apache.maven.surefire.api.report.StackTraceWriter;
import org.apache.maven.surefire.api.suite.RunResult;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.error;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.failure;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.flake;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.skipped;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.success;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType.unknown;
import static org.apache.maven.plugin.surefire.report.DefaultReporterFactory.getTestResultType;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.powermock.reflect.Whitebox.getInternalState;
import static org.powermock.reflect.Whitebox.invokeMethod;
/**
*
*/
public class DefaultReporterFactoryTest
extends TestCase
{
private static final String TEST_ONE = "testOne";
private static final String TEST_TWO = "testTwo";
private static final String TEST_THREE = "testThree";
private static final String TEST_FOUR = "testFour";
private static final String TEST_FIVE = "testFive";
private static final String ASSERTION_FAIL = "assertionFail";
private static final String ERROR = "error";
public void testMergeTestHistoryResult()
throws Exception
{
MessageUtils.setColorEnabled( false );
File target = new File( System.getProperty( "user.dir" ), "target" );
File reportsDirectory = new File( target, "tmp5" );
StartupReportConfiguration reportConfig =
new StartupReportConfiguration( true, true, "PLAIN", false, reportsDirectory, false, null,
new File( reportsDirectory, "TESTHASH" ), false, 1, null, null, false,
new SurefireStatelessReporter(), new SurefireConsoleOutputReporter(),
new SurefireStatelessTestsetInfoReporter() );
DummyTestReporter reporter = new DummyTestReporter();
DefaultReporterFactory factory = new DefaultReporterFactory( reportConfig, reporter );
// First run, four tests failed and one passed
Queue<TestMethodStats> firstRunStats = new ArrayDeque<>();
firstRunStats.add( new TestMethodStats( TEST_ONE, ReportEntryType.ERROR, new DummyStackTraceWriter( ERROR ) ) );
firstRunStats.add( new TestMethodStats( TEST_TWO, ReportEntryType.ERROR, new DummyStackTraceWriter( ERROR ) ) );
firstRunStats.add(
new TestMethodStats( TEST_THREE, ReportEntryType.FAILURE, new DummyStackTraceWriter( ASSERTION_FAIL ) ) );
firstRunStats.add(
new TestMethodStats( TEST_FOUR, ReportEntryType.FAILURE, new DummyStackTraceWriter( ASSERTION_FAIL ) ) );
firstRunStats.add(
new TestMethodStats( TEST_FIVE, ReportEntryType.SUCCESS, null ) );
// Second run, two tests passed
Queue<TestMethodStats> secondRunStats = new ArrayDeque<>();
secondRunStats.add(
new TestMethodStats( TEST_ONE, ReportEntryType.FAILURE, new DummyStackTraceWriter( ASSERTION_FAIL ) ) );
secondRunStats.add( new TestMethodStats( TEST_TWO, ReportEntryType.SUCCESS, null ) );
secondRunStats.add(
new TestMethodStats( TEST_THREE, ReportEntryType.ERROR, new DummyStackTraceWriter( ERROR ) ) );
secondRunStats.add( new TestMethodStats( TEST_FOUR, ReportEntryType.SUCCESS, null ) );
// Third run, another test passed
Queue<TestMethodStats> thirdRunStats = new ArrayDeque<>();
thirdRunStats.add( new TestMethodStats( TEST_ONE, ReportEntryType.SUCCESS, null ) );
thirdRunStats.add(
new TestMethodStats( TEST_THREE, ReportEntryType.ERROR, new DummyStackTraceWriter( ERROR ) ) );
TestSetRunListener firstRunListener = mock( TestSetRunListener.class );
TestSetRunListener secondRunListener = mock( TestSetRunListener.class );
TestSetRunListener thirdRunListener = mock( TestSetRunListener.class );
when( firstRunListener.getTestMethodStats() ).thenReturn( firstRunStats );
when( secondRunListener.getTestMethodStats() ).thenReturn( secondRunStats );
when( thirdRunListener.getTestMethodStats() ).thenReturn( thirdRunStats );
factory.addListener( firstRunListener );
factory.addListener( secondRunListener );
factory.addListener( thirdRunListener );
invokeMethod( factory, "mergeTestHistoryResult" );
RunStatistics mergedStatistics = factory.getGlobalRunStatistics();
// Only TEST_THREE is a failing test, other three are flaky tests
assertEquals( 5, mergedStatistics.getCompletedCount() );
assertEquals( 1, mergedStatistics.getErrors() );
assertEquals( 0, mergedStatistics.getFailures() );
assertEquals( 3, mergedStatistics.getFlakes() );
assertEquals( 0, mergedStatistics.getSkipped() );
// Now test the result will be printed out correctly
factory.printTestFailures( flake );
String[] expectedFlakeOutput =
{ "Flakes: ", TEST_FOUR, " Run 1: " + ASSERTION_FAIL, " Run 2: PASS", "", TEST_ONE,
" Run 1: " + ERROR, " Run 2: " + ASSERTION_FAIL, " Run 3: PASS", "", TEST_TWO, " Run 1: " + ERROR,
" Run 2: PASS", "" };
assertEquals( asList( expectedFlakeOutput ), reporter.getMessages() );
reporter.reset();
factory.printTestFailures( error );
String[] expectedFailureOutput =
{ "Errors: ", TEST_THREE, " Run 1: " + ASSERTION_FAIL, " Run 2: " + ERROR, " Run 3: " + ERROR, "" };
assertEquals( asList( expectedFailureOutput ), reporter.getMessages() );
reporter.reset();
factory.printTestFailures( failure );
assertEquals( emptyList(), reporter.getMessages() );
}
static final class DummyTestReporter implements ConsoleLogger
{
private final List<String> messages = new ArrayList<>();
@Override
public boolean isDebugEnabled()
{
return true;
}
@Override
public void debug( String message )
{
messages.add( message );
}
@Override
public boolean isInfoEnabled()
{
return true;
}
@Override
public void info( String message )
{
messages.add( message );
}
@Override
public boolean isWarnEnabled()
{
return true;
}
@Override
public void warning( String message )
{
messages.add( message );
}
@Override
public boolean isErrorEnabled()
{
return true;
}
@Override
public void error( String message )
{
messages.add( message );
}
@Override
public void error( String message, Throwable t )
{
messages.add( message + " " + t.getLocalizedMessage() );
}
@Override
public void error( Throwable t )
{
messages.add( t.getLocalizedMessage() );
}
List<String> getMessages()
{
return messages;
}
void reset()
{
messages.clear();
}
}
public void testGetTestResultType()
{
List<ReportEntryType> emptyList = new ArrayList<>();
assertEquals( unknown, getTestResultType( emptyList, 1 ) );
List<ReportEntryType> successList = new ArrayList<>();
successList.add( ReportEntryType.SUCCESS );
successList.add( ReportEntryType.SUCCESS );
assertEquals( success, getTestResultType( successList, 1 ) );
List<ReportEntryType> failureErrorList = new ArrayList<>();
failureErrorList.add( ReportEntryType.FAILURE );
failureErrorList.add( ReportEntryType.ERROR );
assertEquals( error, getTestResultType( failureErrorList, 1 ) );
List<ReportEntryType> errorFailureList = new ArrayList<>();
errorFailureList.add( ReportEntryType.ERROR );
errorFailureList.add( ReportEntryType.FAILURE );
assertEquals( error, getTestResultType( errorFailureList, 1 ) );
List<ReportEntryType> flakeList = new ArrayList<>();
flakeList.add( ReportEntryType.SUCCESS );
flakeList.add( ReportEntryType.FAILURE );
assertEquals( flake, getTestResultType( flakeList, 1 ) );
assertEquals( failure, getTestResultType( flakeList, 0 ) );
flakeList = new ArrayList<>();
flakeList.add( ReportEntryType.ERROR );
flakeList.add( ReportEntryType.SUCCESS );
flakeList.add( ReportEntryType.FAILURE );
assertEquals( flake, getTestResultType( flakeList, 1 ) );
assertEquals( error, getTestResultType( flakeList, 0 ) );
List<ReportEntryType> skippedList = new ArrayList<>();
skippedList.add( ReportEntryType.SKIPPED );
assertEquals( skipped, getTestResultType( skippedList, 1 ) );
}
public void testLogger()
{
MessageUtils.setColorEnabled( false );
File target = new File( System.getProperty( "user.dir" ), "target" );
File reportsDirectory = new File( target, "tmp6" );
StartupReportConfiguration reportConfig =
new StartupReportConfiguration( true, true, "PLAIN", false, reportsDirectory, false, null,
new File( reportsDirectory, "TESTHASH" ), false, 1, null, null, false,
new SurefireStatelessReporter(), new SurefireConsoleOutputReporter(),
new SurefireStatelessTestsetInfoReporter() );
DummyTestReporter reporter = new DummyTestReporter();
DefaultReporterFactory factory = new DefaultReporterFactory( reportConfig, reporter );
TestSetRunListener runListener = (TestSetRunListener) factory.createReporter();
assertTrue( runListener.isDebugEnabled() );
assertTrue( runListener.isInfoEnabled() );
assertTrue( runListener.isWarnEnabled() );
assertTrue( runListener.isErrorEnabled() );
runListener.debug( "msg" );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "msg", reporter.getMessages().get( 0 ) );
reporter.reset();
runListener.info( "msg\n" );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "msg", reporter.getMessages().get( 0 ) );
reporter.reset();
runListener.warning( "msg\r\n" );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "msg", reporter.getMessages().get( 0 ) );
reporter.reset();
runListener.error( "msg" );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "msg", reporter.getMessages().get( 0 ) );
reporter.reset();
runListener.error( "msg\n", new Exception( "e" ) );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "msg e", reporter.getMessages().get( 0 ) );
reporter.reset();
runListener.error( new Exception( "e" ) );
assertEquals( 1, reporter.getMessages().size() );
assertEquals( "e", reporter.getMessages().get( 0 ) );
reporter.reset();
}
public void testCreateReporterWithZeroStatistics()
{
MessageUtils.setColorEnabled( false );
File target = new File( System.getProperty( "user.dir" ), "target" );
File reportsDirectory = new File( target, "tmp7" );
StartupReportConfiguration reportConfig =
new StartupReportConfiguration( true, true, "PLAIN", false, reportsDirectory, false, null,
new File( reportsDirectory, "TESTHASH" ), false, 0, null, null, false,
new SurefireStatelessReporter(), new SurefireConsoleOutputReporter(),
new SurefireStatelessTestsetInfoReporter() );
assertTrue( reportConfig.isUseFile() );
assertTrue( reportConfig.isPrintSummary() );
assertEquals( "PLAIN", reportConfig.getReportFormat() );
assertFalse( reportConfig.isRedirectTestOutputToFile() );
assertEquals( reportsDirectory, reportConfig.getReportsDirectory() );
assertFalse( reportConfig.isTrimStackTrace() );
assertNull( reportConfig.getReportNameSuffix() );
assertEquals( new File( reportsDirectory, "TESTHASH" ), reportConfig.getStatisticsFile() );
assertFalse( reportConfig.isRequiresRunHistory() );
assertEquals( 0, reportConfig.getRerunFailingTestsCount() );
assertNull( reportConfig.getXsdSchemaLocation() );
assertEquals( UTF_8, reportConfig.getEncoding() );
assertFalse( reportConfig.isForkMode() );
assertNotNull( reportConfig.getXmlReporter() );
assertNotNull( reportConfig.getConsoleOutputReporter() );
assertNotNull( reportConfig.getTestsetReporter() );
assertNull( reportConfig.getStatisticsReporter() );
DummyTestReporter reporter = new DummyTestReporter();
DefaultReporterFactory factory = new DefaultReporterFactory( reportConfig, reporter );
assertEquals( reportsDirectory, factory.getReportsDirectory() );
TestSetRunListener runListener = (TestSetRunListener) factory.createReporter();
Collection listeners = getInternalState( factory, "listeners" );
assertEquals( 1, listeners.size() );
assertTrue( listeners.contains( runListener ) );
assertNotNull( runListener.getTestMethodStats() );
factory.runStarting();
factory.close();
RunStatistics statistics = factory.getGlobalRunStatistics();
assertEquals( 0, statistics.getCompletedCount() );
assertEquals( new RunResult( 0, 0, 0, 0 ), statistics.getRunResult() );
assertEquals( 0, statistics.getFailures() );
assertEquals( 0, statistics.getErrors() );
assertEquals( 0, statistics.getSkipped() );
assertEquals( 0, statistics.getFlakes() );
assertEquals( "Tests run: 0, Failures: 0, Errors: 0, Skipped: 0", statistics.getSummary() );
assertEquals( 0, statistics.getCompletedCount() );
List<String> messages = reporter.getMessages();
assertEquals( "", messages.get( 0 ) );
assertEquals( "-------------------------------------------------------", messages.get( 1 ) );
assertEquals( " T E S T S", messages.get( 2 ) );
assertEquals( "-------------------------------------------------------", messages.get( 3 ) );
assertEquals( "", messages.get( 4 ) );
assertEquals( "Results:", messages.get( 5 ) );
assertEquals( "", messages.get( 6 ) );
assertEquals( "Tests run: 0, Failures: 0, Errors: 0, Skipped: 0", messages.get( 7 ) );
assertEquals( "", messages.get( 8 ) );
assertEquals( 9, messages.size() );
}
static class DummyStackTraceWriter
implements StackTraceWriter
{
private final String stackTrace;
DummyStackTraceWriter( String stackTrace )
{
this.stackTrace = stackTrace;
}
@Override
public String writeTraceToString()
{
return "";
}
@Override
public String writeTrimmedTraceToString()
{
return "";
}
@Override
public String smartTrimmedStackTrace()
{
return stackTrace;
}
@Override
public SafeThrowable getThrowable()
{
return null;
}
}
}