| 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; |
| } |
| } |
| } |