diff --git a/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java b/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
index 11c3e5828a..c3466916b1 100644
--- a/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
+++ b/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
@@ -364,6 +364,11 @@ public class IntegrationTestMojo
* **{@literal /}NotIncludedByDefault.java
* %regex[.*IT.*|.*Not.*]
*
+ *
+ * Since 3.0.0-M6, method filtering support is provided in the inclusions file as well, example:
+ *
+ * pkg.SomeIT#testMethod
+ *
*
* @since 2.13
*/
@@ -379,6 +384,11 @@ public class IntegrationTestMojo
* **{@literal /}DontRunIT.*
* %regex[.*IT.*|.*Not.*]
*
+ *
+ * Since 3.0.0-M6, method filtering support is provided in the exclusions file as well, example:
+ *
+ * pkg.SomeIT#testMethod
+ *
*
* @since 2.13
*/
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
index c9f44b53c3..40ed1996cc 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
@@ -2194,78 +2194,110 @@ private boolean isSpecificTestSpecified()
}
}
- private void maybeAppendList( List base, List list )
+ @Nonnull
+ private List getExcludedScanList()
+ throws MojoFailureException
{
- if ( list != null )
- {
- base.addAll( list );
- }
+ return getExcludeList( true );
}
- @Nonnull private List getExcludeList()
+ @Nonnull
+ private List getExcludeList()
+ throws MojoFailureException
+ {
+ return getExcludeList( false );
+ }
+
+ /**
+ * Computes a merge list of test exclusions.
+ * Used only in {@link #getExcludeList()} and {@link #getExcludedScanList()}.
+ * @param asScanList true if dependency or directory scanner
+ * @return list of patterns
+ * @throws MojoFailureException if the excludes breaks a pattern format
+ */
+ @Nonnull
+ private List getExcludeList( boolean asScanList )
throws MojoFailureException
{
- List actualExcludes = null;
+ List excludes;
if ( isSpecificTestSpecified() )
{
- actualExcludes = Collections.emptyList();
+ excludes = Collections.emptyList();
}
else
{
- if ( getExcludesFile() != null )
+ excludes = new ArrayList<>();
+ if ( asScanList )
{
- actualExcludes = readListFromFile( getExcludesFile() );
+ if ( getExcludes() != null )
+ {
+ excludes.addAll( getExcludes() );
+ }
+ checkMethodFilterInIncludesExcludes( excludes );
}
- if ( actualExcludes == null )
- {
- actualExcludes = getExcludes();
- }
- else
+ if ( getExcludesFile() != null )
{
- maybeAppendList( actualExcludes, getExcludes() );
+ excludes.addAll( readListFromFile( getExcludesFile() ) );
}
- checkMethodFilterInIncludesExcludes( actualExcludes );
-
- if ( actualExcludes == null || actualExcludes.isEmpty() )
+ if ( asScanList && excludes.isEmpty() )
{
- actualExcludes = Collections.singletonList( getDefaultExcludes() );
+ excludes = Collections.singletonList( getDefaultExcludes() );
}
}
- return filterNulls( actualExcludes );
+ return filterNulls( excludes );
+ }
+
+ @Nonnull
+ private List getIncludedScanList()
+ throws MojoFailureException
+ {
+ return getIncludeList( true );
}
+ @Nonnull
private List getIncludeList()
throws MojoFailureException
{
- List includes = null;
+ return getIncludeList( false );
+ }
+
+ /**
+ * Computes a merge list of test inclusions.
+ * Used only in {@link #getIncludeList()} and {@link #getIncludedScanList()}.
+ * @param asScanList true if dependency or directory scanner
+ * @return list of patterns
+ * @throws MojoFailureException if the includes breaks a pattern format
+ */
+ @Nonnull
+ private List getIncludeList( boolean asScanList )
+ throws MojoFailureException
+ {
+ final List includes = new ArrayList<>();
if ( isSpecificTestSpecified() )
{
- includes = new ArrayList<>();
addAll( includes, split( getTest(), "," ) );
}
else
{
- if ( getIncludesFile() != null )
+ if ( asScanList )
{
- includes = readListFromFile( getIncludesFile() );
+ if ( getIncludes() != null )
+ {
+ includes.addAll( getIncludes() );
+ }
+ checkMethodFilterInIncludesExcludes( includes );
}
- if ( includes == null )
- {
- includes = getIncludes();
- }
- else
+ if ( getIncludesFile() != null )
{
- maybeAppendList( includes, getIncludes() );
+ includes.addAll( readListFromFile( getIncludesFile() ) );
}
- checkMethodFilterInIncludesExcludes( includes );
-
- if ( includes == null || includes.isEmpty() )
+ if ( asScanList && includes.isEmpty() )
{
- includes = asList( getDefaultIncludes() );
+ addAll( includes, getDefaultIncludes() );
}
}
@@ -2275,16 +2307,12 @@ private List getIncludeList()
private void checkMethodFilterInIncludesExcludes( Iterable patterns )
throws MojoFailureException
{
- if ( patterns != null )
+ for ( String pattern : patterns )
{
- for ( String pattern : patterns )
+ if ( pattern != null && pattern.contains( "#" ) )
{
- if ( pattern != null && pattern.contains( "#" ) )
- {
- throw new MojoFailureException( "Method filter prohibited in "
- + "includes|excludes|includesFile|excludesFile parameter: "
- + pattern );
- }
+ throw new MojoFailureException( "Method filter prohibited in includes|excludes parameter: "
+ + pattern );
}
}
}
@@ -2294,16 +2322,18 @@ private TestListResolver getIncludedAndExcludedTests()
{
if ( includedExcludedTests == null )
{
- includedExcludedTests = new TestListResolver( getIncludeList(), getExcludeList() );
+ includedExcludedTests = new TestListResolver( getIncludedScanList(), getExcludedScanList() );
+ getConsoleLogger().debug( "Resolved included and excluded patterns: " + includedExcludedTests );
}
return includedExcludedTests;
}
public TestListResolver getSpecificTests()
+ throws MojoFailureException
{
if ( specificTests == null )
{
- specificTests = new TestListResolver( getTest() );
+ specificTests = new TestListResolver( getIncludeList(), getExcludeList() );
}
return specificTests;
}
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
index 7d7d15f6d1..9d89447aff 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
@@ -30,14 +30,17 @@
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
@@ -84,6 +87,7 @@
import org.powermock.modules.junit4.PowerMockRunner;
import static java.io.File.separatorChar;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static java.nio.file.Files.write;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
@@ -95,8 +99,8 @@
import static org.apache.maven.surefire.shared.lang3.JavaVersion.JAVA_9;
import static org.apache.maven.surefire.shared.lang3.JavaVersion.JAVA_RECENT;
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_WINDOWS;
-import static org.codehaus.plexus.languages.java.jpms.ModuleNameSource.MODULEDESCRIPTOR;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.codehaus.plexus.languages.java.jpms.ModuleNameSource.MODULEDESCRIPTOR;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
@@ -1990,6 +1994,12 @@ public static class Mojo
private int failOnFlakeCount;
private String[] includeJUnit5Engines;
private String[] excludeJUnit5Engines;
+ private List projectTestArtifacts;
+ private File includesFile;
+ private File excludesFile;
+ private List includes;
+ private List excludes;
+ private String test;
private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact junitPlatformArtifact,
TestClassPath testClasspathWrapper )
@@ -1997,6 +2007,17 @@ private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact juni
return new JUnitPlatformProviderInfo( null, junitPlatformArtifact, testClasspathWrapper );
}
+ void setProjectTestArtifacts( List projectTestArtifacts )
+ {
+ this.projectTestArtifacts = projectTestArtifacts;
+ }
+
+ @Override
+ List getProjectTestArtifacts()
+ {
+ return projectTestArtifacts;
+ }
+
@Override
protected void logDebugOrCliShowErrors( String s )
{
@@ -2114,43 +2135,48 @@ public void setReportsDirectory( File reportsDirectory )
@Override
public String getTest()
{
- return null;
+ return test;
}
@Override
public void setTest( String test )
{
-
+ this.test = test;
}
@Override
public List getIncludes()
{
- return null;
+ return includes;
}
@Override
- public File getIncludesFile()
+ public void setIncludes( List includes )
{
- return null;
+ this.includes = includes;
}
- @Override
- public void setIncludes( List includes )
+ void setIncludesFile( File includesFile )
{
+ this.includesFile = includesFile;
+ }
+ @Override
+ public File getIncludesFile()
+ {
+ return includesFile;
}
@Override
public List getExcludes()
{
- return null;
+ return excludes;
}
@Override
public void setExcludes( List excludes )
{
-
+ this.excludes = excludes;
}
@Override
@@ -2309,10 +2335,15 @@ public String getShutdown()
return null;
}
+ void setExcludesFile( File excludesFile )
+ {
+ this.excludesFile = excludesFile;
+ }
+
@Override
public File getExcludesFile()
{
- return null;
+ return excludesFile;
}
@Override
@@ -2483,6 +2514,151 @@ public void setExcludeJUnit5Engines( String[] excludeJUnit5Engines )
}
}
+ @Test
+ public void shouldNotPerformMethodFilteringOnIncludes() throws Exception
+ {
+ Mojo plugin = new Mojo();
+
+ File includesExcludes = File.createTempFile( "surefire", "-includes" );
+ FileUtils.write( includesExcludes, "AnotherTest#method" , UTF_8 );
+ plugin.setIncludesFile( includesExcludes );
+
+ List includes = new LinkedList<>();
+ includes.add( "AnotherTest#method " );
+ plugin.setIncludes( includes );
+
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ ArtifactHandler handler = new DefaultArtifactHandler();
+ Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "jar", null, handler );
+ File artifactFile = File.createTempFile( "surefire", ".jar" );
+ artifactFile.deleteOnExit();
+ testDeps.setFile( artifactFile );
+ plugin.setProjectTestArtifacts( singletonList( testDeps ) );
+ plugin.setDependenciesToScan( new String[] { "g:a" } );
+
+ e.expectMessage( "Method filter prohibited in includes|excludes parameter: AnotherTest#method " );
+ plugin.scanDependencies();
+ }
+
+ @Test
+ public void shouldFilterTestsOnIncludesFile() throws Exception
+ {
+ Mojo plugin = new Mojo();
+
+ plugin.setLogger( mock( Logger.class ) );
+
+ File includes = File.createTempFile( "surefire", "-includes" );
+ FileUtils.write( includes, "AnotherTest#method" , UTF_8 );
+ plugin.setIncludesFile( includes );
+
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ ArtifactHandler handler = new DefaultArtifactHandler();
+ Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "test-jar", null, handler );
+ File artifactFile = File.createTempFile( "surefire", "-classes" );
+ String classDir = artifactFile.getCanonicalPath();
+ assertThat( artifactFile.delete() ).isTrue();
+ File classes = new File( classDir );
+ assertThat( classes.mkdir() ).isTrue();
+ testDeps.setFile( classes );
+ assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
+ .isTrue();
+ plugin.setProjectTestArtifacts( singletonList( testDeps ) );
+ plugin.setDependenciesToScan( new String[] { "g:a" } );
+
+ DefaultScanResult result = plugin.scanDependencies();
+ assertThat ( result.getClasses() ).hasSize( 1 );
+ assertThat ( result.getClasses().iterator().next() ).isEqualTo( "AnotherTest" );
+ }
+
+ @Test
+ public void shouldFilterTestsOnExcludesFile() throws Exception
+ {
+ Mojo plugin = new Mojo();
+
+ plugin.setLogger( mock( Logger.class ) );
+
+ File excludes = File.createTempFile( "surefire", "-excludes" );
+ FileUtils.write( excludes, "AnotherTest" , UTF_8 );
+ plugin.setExcludesFile( excludes );
+
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ ArtifactHandler handler = new DefaultArtifactHandler();
+ Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "test-jar", null, handler );
+ File artifactFile = File.createTempFile( "surefire", "-classes" );
+ String classDir = artifactFile.getCanonicalPath();
+ assertThat( artifactFile.delete() ).isTrue();
+ File classes = new File( classDir );
+ assertThat( classes.mkdir() ).isTrue();
+ testDeps.setFile( classes );
+ assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
+ .isTrue();
+ plugin.setProjectTestArtifacts( singletonList( testDeps ) );
+ plugin.setDependenciesToScan( new String[] { "g:a" } );
+
+ DefaultScanResult result = plugin.scanDependencies();
+ assertThat ( result.getClasses() )
+ .isEmpty();
+ }
+
+ @Test
+ public void shouldFilterTestsOnExcludes() throws Exception
+ {
+ Mojo plugin = new Mojo();
+
+ plugin.setLogger( mock( Logger.class ) );
+
+ plugin.setExcludes( singletonList( "AnotherTest" ) );
+
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ ArtifactHandler handler = new DefaultArtifactHandler();
+ Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "jar", null, handler );
+ File artifactFile = File.createTempFile( "surefire", "-classes" );
+ String classDir = artifactFile.getCanonicalPath();
+ assertThat( artifactFile.delete() ).isTrue();
+ File classes = new File( classDir );
+ assertThat( classes.mkdir() ).isTrue();
+ testDeps.setFile( classes );
+ assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
+ .isTrue();
+ plugin.setProjectTestArtifacts( singletonList( testDeps ) );
+ plugin.setDependenciesToScan( new String[] { "g:a" } );
+
+ DefaultScanResult result = plugin.scanDependencies();
+ assertThat ( result.getClasses() )
+ .isEmpty();
+ }
+
+ @Test
+ public void shouldUseOnlySpecificTests() throws Exception
+ {
+ Mojo plugin = new Mojo();
+
+ plugin.setLogger( mock( Logger.class ) );
+
+ File includes = File.createTempFile( "surefire", "-includes" );
+ FileUtils.write( includes, "AnotherTest" , UTF_8 );
+ plugin.setIncludesFile( includes );
+ plugin.setTest( "DifferentTest" );
+
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ ArtifactHandler handler = new DefaultArtifactHandler();
+ Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "test-jar", null, handler );
+ File artifactFile = File.createTempFile( "surefire", "-classes" );
+ String classDir = artifactFile.getCanonicalPath();
+ assertThat( artifactFile.delete() ).isTrue();
+ File classes = new File( classDir );
+ assertThat( classes.mkdir() ).isTrue();
+ testDeps.setFile( classes );
+ assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
+ .isTrue();
+ plugin.setProjectTestArtifacts( singletonList( testDeps ) );
+ plugin.setDependenciesToScan( new String[] { "g:a" } );
+
+ DefaultScanResult result = plugin.scanDependencies();
+ assertThat ( result.getClasses() )
+ .isEmpty();
+ }
+
private static File mockFile( String absolutePath )
{
File f = mock( File.class );
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
index 1548dfdbe9..6ad04160cc 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
@@ -32,6 +32,7 @@
import org.apache.maven.surefire.api.suite.RunResult;
import org.apache.maven.surefire.api.util.DefaultScanResult;
import org.apache.maven.toolchain.Toolchain;
+import org.codehaus.plexus.logging.Logger;
import org.junit.Test;
import java.io.File;
@@ -44,6 +45,7 @@
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
import static org.powermock.reflect.Whitebox.invokeMethod;
import static org.powermock.reflect.Whitebox.setInternalState;
@@ -243,6 +245,7 @@ public void scanDependenciesShouldReturnClassWithExistingTestJAR()
List projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
+ mojo.setLogger( mock( Logger.class ) );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
@@ -275,6 +278,7 @@ public void scanDependenciesShouldReturnNullWithEmptyTestJAR()
List projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
+ mojo.setLogger( mock( Logger.class ) );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
@@ -306,6 +310,7 @@ public void scanDependenciesShouldReturnClassWithDirectory()
List projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
+ mojo.setLogger( mock( Logger.class ) );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
@@ -352,6 +357,7 @@ public void scanMultipleDependencies()
List projectTestArtifacts = asList( testDep1, testDep2 );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
+ mojo.setLogger( mock( Logger.class ) );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
diff --git a/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java b/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
index 240d2a5423..c40696d7a5 100644
--- a/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
+++ b/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
@@ -355,6 +355,11 @@ public class SurefirePlugin
* **{@literal /}NotIncludedByDefault.java
* %regex[.*Test.*|.*Not.*]
*
+ *
+ * Since 3.0.0-M6, method filtering support is provided in the inclusions file as well, example:
+ *
+ * pkg.SomeTest#testMethod
+ *
*
* @since 2.13
*/
@@ -370,6 +375,11 @@ public class SurefirePlugin
* %regex[.*Test.*|.*Not.*]
*
*
+ * Since 3.0.0-M6, method filtering support is provided in the exclusions file as well, example:
+ *
+ * pkg.SomeTest#testMethod
+ *
+ *
* @since 2.13
*/
@Parameter( property = "surefire.excludesFile" )
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
index 6c458f501b..055c407110 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/AbstractTestMultipleMethodPatterns.java
@@ -483,7 +483,6 @@ public void negativeTest()
prepare( pattern )
.failNever()
.executeTest()
- .verifyTextInLog( "Method filter prohibited in includes|excludes|includesFile|excludesFile parameter: "
- + pattern );
+ .verifyTextInLog( "Method filter prohibited in includes|excludes parameter: " + pattern );
}
}
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1964IT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1964IT.java
new file mode 100644
index 0000000000..62f60d25ca
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1964IT.java
@@ -0,0 +1,55 @@
+package org.apache.maven.surefire.its.jiras;
+
+/*
+ * 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.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+
+/**
+ *
+ */
+public class Surefire1964IT extends SurefireJUnit4IntegrationTestCase
+{
+ @Test
+ public void shouldFilterTests() throws Exception
+ {
+ unpack( "surefire-1964" )
+ .executeTest()
+ .assertTestSuiteResults( 1 )
+ .assertThatLogLine( containsString( "executed testXYZ" ), is( 1 ) )
+ .assertThatLogLine( containsString( "executed testABC" ), is( 0 ) )
+ .assertThatLogLine( containsString( "executed dontRun" ), is( 0 ) );
+ }
+
+ @Test
+ public void shouldFilterTestsInPluginProcess() throws Exception
+ {
+ unpack( "surefire-1964" )
+ .forkCount( 0 )
+ .executeTest()
+ .assertTestSuiteResults( 1 )
+ .assertThatLogLine( containsString( "executed testXYZ" ), is( 1 ) )
+ .assertThatLogLine( containsString( "executed testABC" ), is( 0 ) )
+ .assertThatLogLine( containsString( "executed dontRun" ), is( 0 ) );
+ }
+}
diff --git a/surefire-its/src/test/resources/surefire-1964/exclusions.txt b/surefire-its/src/test/resources/surefire-1964/exclusions.txt
new file mode 100644
index 0000000000..5bacad2cab
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1964/exclusions.txt
@@ -0,0 +1 @@
+FilterTest#testABC
\ No newline at end of file
diff --git a/surefire-its/src/test/resources/surefire-1964/inclusions.txt b/surefire-its/src/test/resources/surefire-1964/inclusions.txt
new file mode 100644
index 0000000000..50077e4c4d
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1964/inclusions.txt
@@ -0,0 +1 @@
+FilterTest#test*
\ No newline at end of file
diff --git a/surefire-its/src/test/resources/surefire-1964/pom.xml b/surefire-its/src/test/resources/surefire-1964/pom.xml
new file mode 100644
index 0000000000..8f3ba29389
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1964/pom.xml
@@ -0,0 +1,58 @@
+
+
+
+
+ 4.0.0
+
+ org.example
+ maven-surefire-excludefiles
+ 1.0-SNAPSHOT
+
+
+ ${java.specification.version}
+ ${java.specification.version}
+
+
+
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.version}
+
+ inclusions.txt
+ exclusions.txt
+
+
+
+
+
+
diff --git a/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/ExcludedTest.java b/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/ExcludedTest.java
new file mode 100644
index 0000000000..b871231ef2
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/ExcludedTest.java
@@ -0,0 +1,12 @@
+package pkg;
+
+import org.junit.Test;
+
+public class ExcludedTest
+{
+ @Test
+ public void dontRun()
+ {
+ System.out.println( "executed dontRun" );
+ }
+}
diff --git a/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/FilterTest.java b/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/FilterTest.java
new file mode 100644
index 0000000000..d93eca9291
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1964/src/test/java/pkg/FilterTest.java
@@ -0,0 +1,24 @@
+package pkg;
+
+import org.junit.Test;
+
+public class FilterTest
+{
+ @Test
+ public void testABC()
+ {
+ System.out.println( "executed testABC" );
+ }
+
+ @Test
+ public void dontRun()
+ {
+ System.out.println( "executed dontRun" );
+ }
+
+ @Test
+ public void testXYZ()
+ {
+ System.out.println( "executed testXYZ" );
+ }
+}