blob: a15f8027ec7048f1b8cbff4b10859ba51beb7b2f [file] [log] [blame]
package org.apache.maven.plugin.surefire;
/*
* 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.apache.maven.plugin.surefire.extensions.DefaultStatelessReportMojoConfiguration;
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.plugin.surefire.report.TestSetStats;
import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
import org.apache.maven.surefire.extensions.StatelessReportEventListener;
import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
import javax.annotation.Nonnull;
import java.io.File;
import java.io.PrintStream;
import java.nio.charset.Charset;
import java.util.Deque;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.maven.surefire.shared.lang3.StringUtils.trimToNull;
import static org.apache.maven.plugin.surefire.SurefireHelper.replaceForkThreadsInPath;
import static org.apache.maven.plugin.surefire.report.ConsoleReporter.BRIEF;
import static org.apache.maven.plugin.surefire.report.ConsoleReporter.PLAIN;
/**
* All the parameters used to construct reporters
* <br>
*
* @author Kristian Rosenvold
*/
public final class StartupReportConfiguration
{
private final PrintStream originalSystemOut;
private final PrintStream originalSystemErr;
private final boolean useFile;
private final boolean printSummary;
private final String reportFormat;
private final String reportNameSuffix;
private final File statisticsFile;
private final boolean requiresRunHistory;
private final boolean redirectTestOutputToFile;
private final File reportsDirectory;
private final boolean trimStackTrace;
private final int rerunFailingTestsCount;
private final String xsdSchemaLocation;
private final Map<String, Deque<WrappedReportEntry>> testClassMethodRunHistory = new ConcurrentHashMap<>();
private final Charset encoding;
private final boolean isForkMode;
private final SurefireStatelessReporter xmlReporter;
private final SurefireConsoleOutputReporter consoleOutputReporter;
private final SurefireStatelessTestsetInfoReporter testsetReporter;
private StatisticsReporter statisticsReporter;
@SuppressWarnings( "checkstyle:parameternumber" )
public StartupReportConfiguration( boolean useFile, boolean printSummary, String reportFormat,
boolean redirectTestOutputToFile,
@Nonnull File reportsDirectory, boolean trimStackTrace, String reportNameSuffix,
File statisticsFile, boolean requiresRunHistory, int rerunFailingTestsCount,
String xsdSchemaLocation, String encoding, boolean isForkMode,
SurefireStatelessReporter xmlReporter, SurefireConsoleOutputReporter consoleOutputReporter,
SurefireStatelessTestsetInfoReporter testsetReporter )
{
this.useFile = useFile;
this.printSummary = printSummary;
this.reportFormat = reportFormat;
this.redirectTestOutputToFile = redirectTestOutputToFile;
this.reportsDirectory = reportsDirectory;
this.trimStackTrace = trimStackTrace;
this.reportNameSuffix = reportNameSuffix;
this.statisticsFile = statisticsFile;
this.requiresRunHistory = requiresRunHistory;
this.originalSystemOut = System.out;
this.originalSystemErr = System.err;
this.rerunFailingTestsCount = rerunFailingTestsCount;
this.xsdSchemaLocation = xsdSchemaLocation;
String charset = trimToNull( encoding );
this.encoding = charset == null ? UTF_8 : Charset.forName( charset );
this.isForkMode = isForkMode;
this.xmlReporter = xmlReporter;
this.consoleOutputReporter = consoleOutputReporter;
this.testsetReporter = testsetReporter;
}
public boolean isUseFile()
{
return useFile;
}
public boolean isPrintSummary()
{
return printSummary;
}
public String getReportFormat()
{
return reportFormat;
}
public String getReportNameSuffix()
{
return reportNameSuffix;
}
public boolean isRedirectTestOutputToFile()
{
return redirectTestOutputToFile;
}
public File getReportsDirectory()
{
return reportsDirectory;
}
public int getRerunFailingTestsCount()
{
return rerunFailingTestsCount;
}
public StatelessReportEventListener<WrappedReportEntry, TestSetStats> instantiateStatelessXmlReporter(
Integer forkNumber )
{
assert ( forkNumber == null ) == !isForkMode;
// If forking TestNG the suites have same name 'TestSuite' and tend to override report statistics in stateful
// reporter, see Surefire1535TestNGParallelSuitesIT. The testClassMethodRunHistory should be isolated.
// In the in-plugin execution of parallel JUnit4.7 with rerun the map must be shared because reports and
// listeners are in ThreadLocal, see Surefire1122ParallelAndFlakyTestsIT.
Map<String, Deque<WrappedReportEntry>> testClassMethodRunHistory
= isForkMode
? new ConcurrentHashMap<String, Deque<WrappedReportEntry>>()
: this.testClassMethodRunHistory;
DefaultStatelessReportMojoConfiguration xmlReporterConfig =
new DefaultStatelessReportMojoConfiguration( resolveReportsDirectory( forkNumber ), reportNameSuffix,
trimStackTrace, rerunFailingTestsCount, xsdSchemaLocation, testClassMethodRunHistory );
return xmlReporter.isDisable() ? null : xmlReporter.createListener( xmlReporterConfig );
}
public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> instantiateFileReporter(
Integer forkNumber )
{
return !testsetReporter.isDisable() && isUseFile() && isBriefOrPlainFormat()
? testsetReporter.createListener( resolveReportsDirectory( forkNumber ), reportNameSuffix, encoding )
: null;
}
public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> instantiateConsoleReporter(
ConsoleLogger consoleLogger )
{
return !testsetReporter.isDisable() && shouldReportToConsole()
? testsetReporter.createListener( consoleLogger ) : null;
}
public boolean isBriefOrPlainFormat()
{
String fmt = getReportFormat();
return BRIEF.equals( fmt ) || PLAIN.equals( fmt );
}
public ConsoleOutputReportEventListener instantiateConsoleOutputFileReporter( Integer forkNum )
{
ConsoleOutputReportEventListener outputReport = isRedirectTestOutputToFile()
? consoleOutputReporter.createListener( resolveReportsDirectory( forkNum ), reportNameSuffix, forkNum )
: consoleOutputReporter.createListener( originalSystemOut, originalSystemErr );
return consoleOutputReporter.isDisable() ? null : outputReport;
}
public synchronized StatisticsReporter getStatisticsReporter()
{
if ( statisticsReporter == null )
{
statisticsReporter = requiresRunHistory ? new StatisticsReporter( statisticsFile ) : null;
}
return statisticsReporter;
}
public File getStatisticsFile()
{
return statisticsFile;
}
public boolean isTrimStackTrace()
{
return trimStackTrace;
}
public boolean isRequiresRunHistory()
{
return requiresRunHistory;
}
public String getXsdSchemaLocation()
{
return xsdSchemaLocation;
}
public Charset getEncoding()
{
return encoding;
}
public boolean isForkMode()
{
return isForkMode;
}
private File resolveReportsDirectory( Integer forkNumber )
{
return forkNumber == null ? reportsDirectory : replaceForkThreadsInPath( reportsDirectory, forkNumber );
}
public SurefireStatelessReporter getXmlReporter()
{
return xmlReporter;
}
public SurefireConsoleOutputReporter getConsoleOutputReporter()
{
return consoleOutputReporter;
}
public SurefireStatelessTestsetInfoReporter getTestsetReporter()
{
return testsetReporter;
}
private boolean shouldReportToConsole()
{
return isUseFile() ? isPrintSummary() : isRedirectTestOutputToFile() || isBriefOrPlainFormat();
}
}