package org.apache.maven.plugin.nar; //Copied from Maven maven-surefire-plugin 2.3, 2006-2007 /* * 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.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.apache.maven.surefire.booter.ForkConfiguration; import org.apache.maven.surefire.booter.SurefireBooter; import org.apache.maven.surefire.booter.SurefireBooterForkException; import org.apache.maven.surefire.booter.SurefireExecutionException; import org.apache.maven.surefire.report.BriefConsoleReporter; import org.apache.maven.surefire.report.BriefFileReporter; import org.apache.maven.surefire.report.ConsoleReporter; import org.apache.maven.surefire.report.DetailedConsoleReporter; import org.apache.maven.surefire.report.FileReporter; import org.apache.maven.surefire.report.ForkingConsoleReporter; import org.apache.maven.surefire.report.XMLReporter; import org.codehaus.plexus.util.StringUtils; /** * Run integration tests using Surefire. This goal was copied from Maven's surefire plugin to accomodate a few things * for the NAR plugin: *

* 1. To test a jar file with its native module we can only run after the package phase, so we use the integration-test * phase. *

*

* 2. We need to set java.library.path to an AOL (architecture-os-linker) specific value, but AOL is only known in the * NAR plugin and thus cannot be set from the pom. *

*

* 3. To have the java.library.path definition picked up by java we need the "pertest" forkmode. To use this goal you * need to put the test sources in the regular test directories but disable the running of the tests by the * maven-surefire-plugin by setting maven.test.skip.exec to false in your pom. *

* * @author Jason van Zyl (modified by Mark Donszelmann, noted by DUNS) * @version 2.3 maven repository maven-surefire-plugin and changes by DUNS * @requiresDependencyResolution test * @goal nar-integration-test * @phase integration-test */ // DUNS, changed class name, inheritence, goal and phase public class NarIntegrationTestMojo extends AbstractCompileMojo { // DUNS added test for JNI module private boolean testJNIModule() { for ( Iterator i = getLibraries().iterator(); i.hasNext(); ) { Library lib = (Library) i.next(); if ( lib.getType().equals( Library.JNI ) ) return true; } return false; } // DUNS added to get names /** * @parameter expression="${project}" * @readonly * @required */ private MavenProject project; // DUNS added because of naming conflict /** * Skip running of NAR plugins (any) altogether. * * @parameter expression="${nar.skip}" default-value="false" */ private boolean skipNAR; // DUNS changed to nar. because of naming conflict /** * Set this to 'true' to bypass unit tests entirely. Its use is NOT RECOMMENDED, but quite convenient on occasion. * * @parameter expression="${nar.test.skip}" */ private boolean skip; // DUNS changed to nar. because of naming conflict /** * Set this to 'true' to bypass unit tests execution, but still compile them. Its use is NOT RECOMMENDED, but quite * convenient on occasion. * * @parameter expression="${nar.test.skip.exec}" */ private boolean skipExec; // DUNS changed to nar. because of naming conflict /** * Set this to true to ignore a failure during testing. Its use is NOT RECOMMENDED, but quite convenient on * occasion. * * @parameter expression="${nar.test.failure.ignore}" */ private boolean testFailureIgnore; /** * The base directory of the project being tested. This can be obtained in your unit test by * System.getProperty("basedir"). * * @parameter expression="${basedir}" * @required */ private File basedir; // FIXME this field is not used /** * The directory containing generated classes of the project being tested. * * @parameter expression="${project.build.outputDirectory}" * @required */ // DUNS // private File classesDirectory; /** * The directory containing generated test classes of the project being tested. * * @parameter expression="${project.build.testOutputDirectory}" * @required */ private File testClassesDirectory; /** * The classpath elements of the project being tested. * * @parameter expression="${project.testClasspathElements}" * @required * @readonly */ private List classpathElements; /** * Base directory where all reports are written to. * * @parameter expression="${project.build.directory}/surefire-reports" */ private File reportsDirectory; /** * The test source directory containing test class sources. * * @parameter expression="${project.build.testSourceDirectory}" * @required */ private File testSourceDirectory; /** * Specify this parameter(can be a comma separated list) if you want to use the test pattern matching notation, Ant * pattern matching, to select tests to run. The Ant pattern will be used to create an include pattern formatted * like **/${test}.java When used, the includes and excludes patterns * parameters are ignored. * * @parameter expression="${test}" */ private String test; /** * List of patterns (separated by commas) used to specify the tests that should be included in testing. When not * specified and when the test parameter is not specified, the default includes will be * **/Test*.java **/*Test.java **/*TestCase.java * * @parameter */ private List includes; /** * List of patterns (separated by commas) used to specify the tests that should be excluded in testing. When not * specified and when the test parameter is not specified, the default excludes will be * **/Abstract*Test.java **/Abstract*TestCase.java **/*$* * * @parameter */ private List excludes; /** * ArtifactRepository of the localRepository. To obtain the directory of localRepository in unit tests use * System.setProperty( "localRepository"). * * @parameter expression="${localRepository}" * @required * @readonly */ // DUNS removed, already in superclass // private ArtifactRepository localRepository; /** * List of System properties to pass to the JUnit tests. * * @parameter */ private Properties systemProperties; /** * Map of of plugin artifacts. * * @parameter expression="${plugin.artifactMap}" * @required * @readonly */ private Map pluginArtifactMap; /** * Map of of project artifacts. * * @parameter expression="${project.artifactMap}" * @required * @readonly */ private Map projectArtifactMap; /** * Option to print summary of test suites or just print the test cases that has errors. * * @parameter expression="${surefire.printSummary}" default-value="true" */ private boolean printSummary; /** * Selects the formatting for the test report to be generated. Can be set as brief or plain. * * @parameter expression="${surefire.reportFormat}" default-value="brief" */ private String reportFormat; /** * Option to generate a file test report or just output the test report to the console. * * @parameter expression="${surefire.useFile}" default-value="true" */ private boolean useFile; // DUNS changed to nar. because of naming conflict /** * When forking, set this to true to redirect the unit test standard output to a file (found in * reportsDirectory/testName-output.txt). * * @parameter expression="${nar.test.redirectTestOutputToFile}" default-value="false" */ private boolean redirectTestOutputToFile; /** * Option to specify the forking mode. Can be "never", "once" or "always". "none" and "pertest" are also accepted * for backwards compatibility. * * @parameter expression="${forkMode}" default-value="once" */ private String forkMode; /** * Option to specify the jvm (or path to the java executable) to use with the forking options. For the default, the * jvm will be the same as the one used to run Maven. * * @parameter expression="${jvm}" */ private String jvm; /** * Arbitrary options to set on the command line. * * @parameter expression="${argLine}" */ private String argLine; /** * Additional environments to set on the command line. * * @parameter */ private Map environmentVariables = new HashMap(); /** * Command line working directory. * * @parameter */ private File workingDirectory; /** * When false it makes tests run using the standard classloader delegation instead of the default Maven isolated * classloader. Only used when forking (forkMode is not "none").
* Setting it to false helps with some problems caused by conflicts between xml parsers in the classpath and the * Java 5 provider parser. * * @parameter expression="${childDelegation}" default-value="false" */ private boolean childDelegation; /** * Groups for this test. Only classes/methods/etc decorated with one of the groups specified here will be included * in test run, if specified. * * @parameter expression="${groups}" */ private String groups; /** * Excluded groups. Any methods/classes/etc with one of the groups specified in this list will specifically not be * run. * * @parameter expression="${excludedGroups}" */ private String excludedGroups; /** * List of TestNG suite xml file locations, seperated by commas. It should be noted that if suiteXmlFiles is * specified, no other tests will be run, ignoring other parameters, like includes and excludes. * * @parameter */ private File[] suiteXmlFiles; /** * The attribute thread-count allows you to specify how many threads should be allocated for this execution. Only * makes sense to use in conjunction with parallel. * * @parameter expression="${threadCount}" default-value="5" */ private int threadCount; /** * When you use the parallel attribute, TestNG will try to run all your test methods in separate threads, except for * methods that depend on each other, which will be run in the same thread in order to respect their order of * execution. * * @parameter expression="${parallel}" default-value="false" * @todo test how this works with forking, and console/file output parallelism */ private boolean parallel; /** * Whether to trim the stack trace in the reports to just the lines within the test, or show the full trace. * * @parameter expression="${trimStackTrace}" default-value="true" */ private boolean trimStackTrace; /** * Resolves the artifacts needed. * * @component */ private ArtifactResolver artifactResolver; /** * Creates the artifact * * @component */ private ArtifactFactory artifactFactory; /** * The plugin remote repositories declared in the pom. * * @parameter expression="${project.pluginArtifactRepositories}" */ private List remoteRepositories; /** * For retrieval of artifact's metadata. * * @component */ private ArtifactMetadataSource metadataSource; private static final String BRIEF_REPORT_FORMAT = "brief"; private static final String PLAIN_REPORT_FORMAT = "plain"; private Properties originalSystemProperties; /** * Flag to disable the generation of report files in xml format. * * @parameter expression="${disableXmlReport}" default-value="false" */ private boolean disableXmlReport; /** * Option to pass dependencies to the system's classloader instead of using an isolated class loader when forking. * Prevents problems with JDKs which implement the service provider lookup mechanism by using the system's * classloader. * * @parameter expression="${surefire.useSystemClassLoader}" default-value="false" */ private boolean useSystemClassLoader; public void execute() throws MojoExecutionException, MojoFailureException { if ( verifyParameters() ) { SurefireBooter surefireBooter = constructSurefireBooter(); getLog().info( "Surefire report directory: " + reportsDirectory ); boolean success; try { success = surefireBooter.run(); } catch ( SurefireBooterForkException e ) { throw new MojoExecutionException( e.getMessage(), e ); } catch ( SurefireExecutionException e ) { throw new MojoExecutionException( e.getMessage(), e ); } if ( originalSystemProperties != null ) { // restore system properties System.setProperties( originalSystemProperties ); } if ( !success ) { String msg = "There are test failures."; if ( testFailureIgnore ) { getLog().error( msg ); } else { throw new MojoFailureException( msg ); } } } } private boolean verifyParameters() throws MojoFailureException { // DUNS, shouldSkip() does not work... if ( skipNAR ) { getLog().info( "***********************************************************************" ); getLog().info( "NAR Integration Tests are SKIPPED since no NAR libraries were built." ); getLog().info( "***********************************************************************" ); return false; } if ( skip || skipExec ) { getLog().info( "Tests are skipped." ); return false; } else if ( !testClassesDirectory.exists() ) { getLog().info( "No tests to run." ); return false; } if ( parallel ) { if ( threadCount < 1 ) { throw new MojoFailureException( "Must have at least one thread in parallel mode" ); } } if ( useSystemClassLoader && ForkConfiguration.FORK_NEVER.equals( forkMode ) ) { getLog().warn( "useSystemClassloader=true setting has no effect when not forking" ); } return true; } private SurefireBooter constructSurefireBooter() throws MojoExecutionException, MojoFailureException { SurefireBooter surefireBooter = new SurefireBooter(); Artifact surefireArtifact = (Artifact) pluginArtifactMap.get( "org.apache.maven.surefire:surefire-booter" ); if ( surefireArtifact == null ) { throw new MojoExecutionException( "Unable to locate surefire-booter in the list of plugin artifacts" ); } surefireArtifact.isSnapshot(); // TODO: this is ridiculous, but it // fixes getBaseVersion to be -SNAPSHOT // if needed Artifact junitArtifact; Artifact testNgArtifact; try { addArtifact( surefireBooter, surefireArtifact ); junitArtifact = (Artifact) projectArtifactMap.get( "junit:junit" ); // TODO: this is pretty manual, but I'd rather not require the // plugin > dependencies section right now testNgArtifact = (Artifact) projectArtifactMap.get( "org.testng:testng" ); if ( testNgArtifact != null ) { addArtifact( surefireBooter, testNgArtifact ); VersionRange range = VersionRange.createFromVersionSpec( "[4.7,)" ); if ( !range.containsVersion( testNgArtifact.getSelectedVersion() ) ) { throw new MojoFailureException( "TestNG support requires version 4.7 or above. You have declared version " + testNgArtifact.getVersion() ); } // The plugin uses a JDK based profile to select the right // testng. We might be explicity using a // different one since its based on the source level, not the // JVM. Prune using the filter. addProvider( surefireBooter, "surefire-testng", surefireArtifact.getBaseVersion(), testNgArtifact ); } else if ( junitArtifact != null && junitArtifact.getBaseVersion().startsWith( "4" ) ) { addProvider( surefireBooter, "surefire-junit4", surefireArtifact.getBaseVersion(), null ); } else { // add the JUnit provider as default - it doesn't require JUnit // to be present, // since it supports POJO tests. addProvider( surefireBooter, "surefire-junit", surefireArtifact.getBaseVersion(), null ); } } catch ( ArtifactNotFoundException e ) { throw new MojoExecutionException( "Unable to locate required surefire provider dependency: " + e.getMessage(), e ); } catch ( InvalidVersionSpecificationException e ) { throw new MojoExecutionException( "Error determining the TestNG version requested: " + e.getMessage(), e ); } catch ( ArtifactResolutionException e ) { throw new MojoExecutionException( "Error to resolving surefire provider dependency: " + e.getMessage(), e ); } if ( suiteXmlFiles != null && suiteXmlFiles.length > 0 ) { if ( testNgArtifact == null ) { throw new MojoExecutionException( "suiteXmlFiles is configured, but there is no TestNG dependency" ); } for ( int i = 0; i < suiteXmlFiles.length; i++ ) { File file = suiteXmlFiles[i]; if ( file.exists() ) { surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGXmlTestSuite", new Object[] { file, testSourceDirectory.getAbsolutePath() } ); } } } else { List includes; List excludes; if ( test != null ) { // Check to see if we are running a single test. The raw // parameter will // come through if it has not been set. // FooTest -> **/FooTest.java includes = new ArrayList(); excludes = new ArrayList(); String[] testRegexes = StringUtils.split( test, "," ); for ( int i = 0; i < testRegexes.length; i++ ) { includes.add( "**/" + testRegexes[i] + ".java" ); } } else { includes = this.includes; excludes = this.excludes; // defaults here, qdox doesn't like the end javadoc value // Have to wrap in an ArrayList as surefire expects an ArrayList // instead of a List for some reason if ( includes == null || includes.size() == 0 ) { includes = new ArrayList( Arrays.asList( new String[] { "**/Test*.java", "**/*Test.java", "**/*TestCase.java" } ) ); } if ( excludes == null || excludes.size() == 0 ) { excludes = new ArrayList( Arrays.asList( new String[] { "**/Abstract*Test.java", "**/Abstract*TestCase.java", "**/*$*" } ) ); } } if ( testNgArtifact != null ) { surefireBooter.addTestSuite( "org.apache.maven.surefire.testng.TestNGDirectoryTestSuite", new Object[] { testClassesDirectory, includes, excludes, groups, excludedGroups, Boolean.valueOf( parallel ), new Integer( threadCount ), testSourceDirectory.getAbsolutePath() } ); } else { String junitDirectoryTestSuite; // DUNS NP check if ( junitArtifact != null && junitArtifact.getBaseVersion().startsWith( "4" ) ) { junitDirectoryTestSuite = "org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite"; } else { junitDirectoryTestSuite = "org.apache.maven.surefire.junit.JUnitDirectoryTestSuite"; } // fall back to JUnit, which also contains POJO support. Also it // can run // classes compiled against JUnit since it has a dependency on // JUnit itself. surefireBooter.addTestSuite( junitDirectoryTestSuite, new Object[] { testClassesDirectory, includes, excludes } ); } } // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- getLog().debug( "Test Classpath :" ); // no need to add classes/test classes directory here - they are in the // classpath elements already for ( Iterator i = classpathElements.iterator(); i.hasNext(); ) { String classpathElement = (String) i.next(); getLog().debug( " " + classpathElement ); surefireBooter.addClassPathUrl( classpathElement ); } // ---------------------------------------------------------------------- // Forking // ---------------------------------------------------------------------- ForkConfiguration fork = new ForkConfiguration(); // DUNS if ( project.getPackaging().equals( "nar" ) || ( getNarManager().getNarDependencies( "test" ).size() > 0 ) ) forkMode = "pertest"; fork.setForkMode( forkMode ); processSystemProperties( !fork.isForking() ); if ( getLog().isDebugEnabled() ) { showMap( systemProperties, "system property" ); } if ( fork.isForking() ) { fork.setSystemProperties( systemProperties ); if ( jvm == null || "".equals( jvm ) ) { // use the same JVM as the one used to run Maven (the // "java.home" one) jvm = System.getProperty( "java.home" ) + File.separator + "bin" + File.separator + "java"; getLog().debug( "Using JVM: " + jvm ); } fork.setJvmExecutable( jvm ); if ( workingDirectory != null ) { fork.setWorkingDirectory( workingDirectory ); } else { fork.setWorkingDirectory( basedir ); } // BEGINDUNS if ( argLine == null ) argLine = ""; StringBuffer javaLibraryPath = new StringBuffer(); if ( testJNIModule() ) { // Add libraries to java.library.path for testing File jniLibraryPathEntry = new File( project.getBasedir(), "target/nar/lib/" + getAOL() + "/jni" ); if ( jniLibraryPathEntry.exists() ) { getLog().debug( "Adding library directory to java.library.path: " + jniLibraryPathEntry ); if ( javaLibraryPath.length() > 0 ) javaLibraryPath.append( File.pathSeparator ); javaLibraryPath.append( jniLibraryPathEntry ); } File sharedLibraryPathEntry = new File( project.getBasedir(), "target/nar/lib/" + getAOL() + "/shared" ); if ( sharedLibraryPathEntry.exists() ) { getLog().debug( "Adding library directory to java.library.path: " + sharedLibraryPathEntry ); if ( javaLibraryPath.length() > 0 ) javaLibraryPath.append( File.pathSeparator ); javaLibraryPath.append( sharedLibraryPathEntry ); } // add jar file to classpath, as one may want to read a // properties file for artifactId and version String jarFile = "target/" + project.getArtifactId() + "-" + project.getVersion() + ".jar"; getLog().debug( "Adding to surefire test classpath: " + jarFile ); surefireBooter.addClassPathUrl( jarFile ); } List dependencies = getNarManager().getNarDependencies( "test" ); for ( Iterator i = dependencies.iterator(); i.hasNext(); ) { NarArtifact dependency = (NarArtifact) i.next(); // FIXME this should be overridable // NarInfo info = dependency.getNarInfo(); // String binding = info.getBinding(getAOL(), Library.STATIC); // NOTE: fixed to shared, jni String[] bindings = { Library.SHARED, Library.JNI }; for ( int j = 0; j < bindings.length; j++ ) { String binding = bindings[j]; if ( !binding.equals( Library.STATIC ) ) { File depLibPathEntry = new File( getNarManager().getNarFile( dependency ).getParent(), "nar/lib/" + getAOL() + "/" + binding ); if ( depLibPathEntry.exists() ) { getLog().debug( "Adding dependency directory to java.library.path: " + depLibPathEntry ); if ( javaLibraryPath.length() > 0 ) javaLibraryPath.append( File.pathSeparator ); javaLibraryPath.append( depLibPathEntry ); } } } } // add final javalibrary path if ( javaLibraryPath.length() > 0 ) { // NOTE java.library.path only works for the jni lib itself, and // not for its dependent shareables. // NOTE: java.library.path does not work with arguments with // spaces as // SureFireBooter splits the line in parts and then quotes // it wrongly NarUtil.addLibraryPathToEnv( javaLibraryPath.toString(), environmentVariables, getOS() ); } // necessary to find WinSxS if ( getOS().equals( OS.WINDOWS ) ) { environmentVariables.put( "SystemRoot", NarUtil.getEnv( "SystemRoot", "SystemRoot", "C:\\Windows" ) ); } // ENDDUNS fork.setArgLine( argLine ); fork.setEnvironmentVariables( environmentVariables ); if ( getLog().isDebugEnabled() ) { showMap( environmentVariables, "environment variable" ); fork.setDebug( true ); } } surefireBooter.setRedirectTestOutputToFile( redirectTestOutputToFile ); surefireBooter.setForkConfiguration( fork ); surefireBooter.setChildDelegation( childDelegation ); surefireBooter.setReportsDirectory( reportsDirectory ); surefireBooter.setUseSystemClassLoader( useSystemClassLoader ); addReporters( surefireBooter, fork.isForking() ); return surefireBooter; } private void showMap( Map map, String setting ) { for ( Iterator i = map.keySet().iterator(); i.hasNext(); ) { String key = (String) i.next(); String value = (String) map.get( key ); getLog().debug( "Setting " + setting + " [" + key + "]=[" + value + "]" ); } } private void addProvider( SurefireBooter surefireBooter, String provider, String version, Artifact filteredArtifact ) throws ArtifactNotFoundException, ArtifactResolutionException { Artifact providerArtifact = artifactFactory.createDependencyArtifact( "org.apache.maven.surefire", provider, VersionRange.createFromVersion( version ), "jar", null, Artifact.SCOPE_TEST ); ArtifactResolutionResult result = resolveArtifact( filteredArtifact, providerArtifact ); for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); getLog().debug( "Adding to surefire test classpath: " + artifact.getFile().getAbsolutePath() ); surefireBooter.addSurefireClassPathUrl( artifact.getFile().getAbsolutePath() ); } } private ArtifactResolutionResult resolveArtifact( Artifact filteredArtifact, Artifact providerArtifact ) throws ArtifactResolutionException, ArtifactNotFoundException { ArtifactFilter filter = null; if ( filteredArtifact != null ) { filter = new ExcludesArtifactFilter( Collections.singletonList( filteredArtifact.getGroupId() + ":" + filteredArtifact.getArtifactId() ) ); } Artifact originatingArtifact = artifactFactory.createBuildArtifact( "dummy", "dummy", "1.0", "jar" ); // DUNS, use access method rather than "localRepository" field. return artifactResolver.resolveTransitively( Collections.singleton( providerArtifact ), originatingArtifact, getLocalRepository(), remoteRepositories, metadataSource, filter ); } private void addArtifact( SurefireBooter surefireBooter, Artifact surefireArtifact ) throws ArtifactNotFoundException, ArtifactResolutionException { ArtifactResolutionResult result = resolveArtifact( null, surefireArtifact ); for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); ) { Artifact artifact = (Artifact) i.next(); getLog().debug( "Adding to surefire booter test classpath: " + artifact.getFile().getAbsolutePath() ); surefireBooter.addSurefireBootClassPathUrl( artifact.getFile().getAbsolutePath() ); } } protected void processSystemProperties( boolean setInSystem ) { if ( systemProperties == null ) { systemProperties = new Properties(); } originalSystemProperties = (Properties) System.getProperties().clone(); systemProperties.setProperty( "basedir", basedir.getAbsolutePath() ); // DUNS, use access method rather than "localRepository" field. systemProperties.setProperty( "localRepository", getLocalRepository().getBasedir() ); if ( setInSystem ) { // Add all system properties configured by the user Iterator iter = systemProperties.keySet().iterator(); while ( iter.hasNext() ) { String key = (String) iter.next(); String value = systemProperties.getProperty( key ); System.setProperty( key, value ); } } } /** *

* Adds Reporters that will generate reports with different formatting. *

* The Reporter that will be added will be based on the value of the parameter useFile, reportFormat, and * printSummary. * * @param surefireBooter The surefire booter that will run tests. * @param forking */ private void addReporters( SurefireBooter surefireBooter, boolean forking ) { Boolean trimStackTrace = Boolean.valueOf( this.trimStackTrace ); if ( useFile ) { if ( printSummary ) { if ( forking ) { surefireBooter.addReport( ForkingConsoleReporter.class.getName(), new Object[] { trimStackTrace } ); } else { surefireBooter.addReport( ConsoleReporter.class.getName(), new Object[] { trimStackTrace } ); } } if ( BRIEF_REPORT_FORMAT.equals( reportFormat ) ) { surefireBooter.addReport( BriefFileReporter.class.getName(), new Object[] { reportsDirectory, trimStackTrace } ); } else if ( PLAIN_REPORT_FORMAT.equals( reportFormat ) ) { surefireBooter.addReport( FileReporter.class.getName(), new Object[] { reportsDirectory, trimStackTrace } ); } } else { if ( BRIEF_REPORT_FORMAT.equals( reportFormat ) ) { surefireBooter.addReport( BriefConsoleReporter.class.getName(), new Object[] { trimStackTrace } ); } else if ( PLAIN_REPORT_FORMAT.equals( reportFormat ) ) { surefireBooter.addReport( DetailedConsoleReporter.class.getName(), new Object[] { trimStackTrace } ); } } if ( !disableXmlReport ) { surefireBooter.addReport( XMLReporter.class.getName(), new Object[] { reportsDirectory, trimStackTrace } ); } } /** * @return SurefirePlugin Returns the skipExec. */ public boolean isSkipExec() { return this.skipExec; } /** * @param skipExec the skipExec to set */ public void setSkipExec( boolean skipExec ) { this.skipExec = skipExec; } }