blob: 8ca9753a45ea67ff24b02412f6b1167498a12b76 [file] [log] [blame]
package org.apache.maven.surefire.api.testset;
/*
* 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 junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import static java.util.Collections.addAll;
import static org.apache.maven.surefire.api.testset.TestListResolver.newTestListResolver;
import static org.apache.maven.surefire.api.testset.ResolvedTest.Type.CLASS;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
/**
*
*/
public class TestListResolverTest
extends TestCase
{
private static final String DEFAULT_SUREFIRE_INCLUDED_TEST_PATTERNS =
"**/Test*.java, **/*Test.java, **/*TestCase.java";
private static final String DEFAULT_SUREFIRE_EXCLUDED_TEST_PATTERNS = "**/*$*";
public void testRegexSanity1()
{
try
{
TestListResolver.isRegexPrefixedPattern( "#%regex[]" );
fail( "#%regex[]" );
}
catch ( IllegalArgumentException e )
{
// expected in junit 3.x
}
}
public void testRegexSanity2()
{
try
{
TestListResolver.isRegexPrefixedPattern( "%regex[]#" );
fail( "%regex[]#" );
}
catch ( IllegalArgumentException e )
{
// expected in junit 3.x
}
}
public void testRegexSanity3()
{
try
{
TestListResolver.isRegexPrefixedPattern( "%regex[]%regex[]" );
fail( "%regex[]%regex[]" );
}
catch ( IllegalArgumentException e )
{
// expected in junit 3.x
}
}
public void testMinRegexLength()
{
assertFalse( TestListResolver.isRegexMinLength( "%regex[]" ) );
assertFalse( TestListResolver.isRegexMinLength( "%regex[ ]" ) );
assertTrue( TestListResolver.isRegexMinLength( "%regex[*Test]" ) );
}
public void testRemoveExclamationMark()
{
String pattern = TestListResolver.removeExclamationMark( "!%regex[]" );
assertEquals( "%regex[]", pattern );
pattern = TestListResolver.removeExclamationMark( "%regex[]" );
assertEquals( "%regex[]", pattern );
}
public void testUnwrapped()
{
String[] classAndMethod = TestListResolver.unwrap( " MyTest " );
assertEquals( "MyTest", classAndMethod[0] );
assertEquals( "", classAndMethod[1] );
classAndMethod = TestListResolver.unwrap( " # test " );
assertEquals( "", classAndMethod[0] );
assertEquals( "test", classAndMethod[1] );
classAndMethod = TestListResolver.unwrap( " MyTest # test " );
assertEquals( "MyTest", classAndMethod[0] );
assertEquals( "test", classAndMethod[1] );
}
public void testUnwrappedRegex()
{
String[] classAndMethod = TestListResolver.unwrapRegex( "%regex[ .*.MyTest.class ]" );
assertEquals( ".*.MyTest.class", classAndMethod[0] );
assertEquals( "", classAndMethod[1] );
classAndMethod = TestListResolver.unwrapRegex( "%regex[ # myMethod|secondTest ]" );
assertEquals( "", classAndMethod[0] );
assertEquals( "myMethod|secondTest", classAndMethod[1] );
classAndMethod = TestListResolver.unwrapRegex( "%regex[ .*.MyTest.class # myMethod|secondTest ]" );
assertEquals( ".*.MyTest.class", classAndMethod[0] );
assertEquals( "myMethod|secondTest", classAndMethod[1] );
}
public void testMakeRegex()
{
String regex = ResolvedTest.wrapRegex( ".*.MyTest.class" );
assertEquals( "%regex[.*.MyTest.class]", regex );
}
public void testNonRegexClassAndMethod()
{
Collection<ResolvedTest> includedFilters = new ArrayList<>();
Collection<ResolvedTest> excludedFilters = new ArrayList<>();
IncludedExcludedPatterns includedExcludedPatterns = new IncludedExcludedPatterns();
TestListResolver.nonRegexClassAndMethods( "MyTest", "myTest", false, includedExcludedPatterns, includedFilters,
excludedFilters );
assertTrue( includedExcludedPatterns.hasIncludedMethodPatterns );
assertFalse( includedExcludedPatterns.hasExcludedMethodPatterns );
assertFalse( includedFilters.isEmpty() );
assertTrue( excludedFilters.isEmpty() );
assertEquals( 1, includedFilters.size() );
ResolvedTest test = includedFilters.iterator().next();
assertFalse( test.isEmpty() );
assertFalse( test.isRegexTestClassPattern() );
assertFalse( test.isRegexTestMethodPattern() );
assertTrue( test.hasTestClassPattern() );
assertTrue( test.hasTestMethodPattern() );
assertEquals( "**/MyTest", test.getTestClassPattern() );
assertEquals( "myTest", test.getTestMethodPattern() );
assertTrue( test.matchAsInclusive( "MyTest", "myTest" ) );
assertFalse( test.matchAsInclusive( "MyTest", "otherTest" ) );
}
public void testNonRegexClassAndMethods()
{
Collection<ResolvedTest> includedFilters = new ArrayList<>();
Collection<ResolvedTest> excludedFilters = new ArrayList<>();
IncludedExcludedPatterns includedExcludedPatterns = new IncludedExcludedPatterns();
TestListResolver.nonRegexClassAndMethods( "MyTest.class", "first*+second*", false, includedExcludedPatterns,
includedFilters, excludedFilters );
assertTrue( includedExcludedPatterns.hasIncludedMethodPatterns );
assertFalse( includedExcludedPatterns.hasExcludedMethodPatterns );
assertFalse( includedFilters.isEmpty() );
assertTrue( excludedFilters.isEmpty() );
assertEquals( 2, includedFilters.size() );
Iterator<ResolvedTest> tests = includedFilters.iterator();
ResolvedTest first = tests.next();
assertFalse( first.isEmpty() );
assertFalse( first.isRegexTestClassPattern() );
assertFalse( first.isRegexTestMethodPattern() );
assertTrue( first.hasTestClassPattern() );
assertTrue( first.hasTestMethodPattern() );
assertEquals( "**/MyTest.class", first.getTestClassPattern() );
assertEquals( "first*", first.getTestMethodPattern() );
assertTrue( first.matchAsInclusive( "your/pkg/MyTest.class", "firstTest" ) );
ResolvedTest second = tests.next();
assertFalse( second.isEmpty() );
assertFalse( second.isRegexTestClassPattern() );
assertFalse( second.isRegexTestMethodPattern() );
assertTrue( second.hasTestClassPattern() );
assertTrue( second.hasTestMethodPattern() );
assertEquals( "**/MyTest.class", second.getTestClassPattern() );
assertEquals( "second*", second.getTestMethodPattern() );
assertTrue( second.matchAsInclusive( "your/pkg/MyTest.class", "secondTest" ) );
assertFalse( second.matchAsInclusive( "your/pkg/MyTest.class", "thirdTest" ) );
}
public void testNegativeNonRegexClassAndMethod()
{
Collection<ResolvedTest> includedFilters = new ArrayList<>();
Collection<ResolvedTest> excludedFilters = new ArrayList<>();
IncludedExcludedPatterns includedExcludedPatterns = new IncludedExcludedPatterns();
TestListResolver.nonRegexClassAndMethods( "MyTest", "myTest", true, includedExcludedPatterns, includedFilters,
excludedFilters );
assertFalse( includedExcludedPatterns.hasIncludedMethodPatterns );
assertTrue( includedExcludedPatterns.hasExcludedMethodPatterns );
assertTrue( includedFilters.isEmpty() );
assertEquals( 1, excludedFilters.size() );
ResolvedTest test = excludedFilters.iterator().next();
assertFalse( test.isEmpty() );
assertFalse( test.isRegexTestClassPattern() );
assertFalse( test.isRegexTestMethodPattern() );
assertTrue( test.hasTestClassPattern() );
assertTrue( test.hasTestMethodPattern() );
assertEquals( "**/MyTest", test.getTestClassPattern() );
assertEquals( "myTest", test.getTestMethodPattern() );
// ResolvedTest should not care about isExcluded. This attribute is handled by TestListResolver.
assertTrue( test.matchAsInclusive( "MyTest", "myTest" ) );
assertFalse( test.matchAsInclusive( "MyTest", "otherTest" ) );
assertFalse( test.matchAsInclusive( "pkg/OtherTest.class", "myTest" ) );
}
public void testResolveTestRequest()
{
Collection<ResolvedTest> includedFilters = new ArrayList<>();
Collection<ResolvedTest> excludedFilters = new ArrayList<>();
IncludedExcludedPatterns includedExcludedPatterns = new IncludedExcludedPatterns();
TestListResolver.resolveTestRequest( "!%regex[.*.MyTest.class#myTest]", includedExcludedPatterns,
includedFilters, excludedFilters );
assertFalse( includedExcludedPatterns.hasIncludedMethodPatterns );
assertTrue( includedExcludedPatterns.hasExcludedMethodPatterns );
assertTrue( includedFilters.isEmpty() );
assertFalse( excludedFilters.isEmpty() );
assertEquals( 1, excludedFilters.size() );
ResolvedTest test = excludedFilters.iterator().next();
// ResolvedTest should not care about isExcluded. This attribute is handled by TestListResolver.
assertTrue( test.matchAsInclusive( "pkg/MyTest.class", "myTest" ) );
assertFalse( test.matchAsInclusive( "pkg/MyTest.class", "otherTest" ) );
assertFalse( test.matchAsInclusive( "pkg/OtherTest.class", "myTest" ) );
}
public void testShouldRunTestWithoutMethod()
{
new TestListResolver( "**/*Test.class, !%regex[.*.MyTest.class#myTest]" )
.shouldRun( "pkg/MyTest.class", null );
}
public void testShouldNotRunExcludedMethods()
{
TestListResolver resolver = new TestListResolver( "!#*Fail*, !%regex[#.*One], !#testSuccessThree" );
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
}
public void testShouldRunSuiteWithIncludedMethods()
{
TestListResolver resolver = new TestListResolver( "#*Fail*, %regex[#.*One], #testSuccessThree" );
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
}
public void testShouldRunAny()
{
TestListResolver resolver = TestListResolver.getEmptyTestListResolver();
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
resolver = new TestListResolver( Collections.<String>emptySet() );
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
}
public void testClassFilter()
{
TestListResolver resolver = new TestListResolver( "#test" );
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
resolver = new TestListResolver( "!#test" );
assertTrue( resolver.shouldRun( "pkg/MyTest.class", null ) );
resolver = new TestListResolver( "SomeOtherClass" );
assertFalse( resolver.shouldRun( "pkg/MyTest.class", null ) );
}
public void testBrokenPatternThrowsException()
{
Collection<String> included = emptySet();
Collection<String> excluded = asList( "BasicTest, !**/TestTwo, **/TestThree.java" );
try
{
new TestListResolver( included, excluded );
fail( "Expected: IllegalArgumentException" );
}
catch ( IllegalArgumentException e )
{
// JUnit 3.x style
assertEquals( "Exclamation mark not expected in 'exclusion': BasicTest, !**/TestTwo, **/TestThree.java",
e.getLocalizedMessage() );
}
}
public void testMultipleExcludedClassesOnly()
{
Collection<String> included = emptySet();
Collection<String> excluded = asList( "BasicTest, **/TestTwo, **/TestThree.java" );
TestListResolver resolver = new TestListResolver( included, excluded );
assertFalse( resolver.shouldRun( "jiras/surefire745/BasicTest.class", null ) );
assertFalse( resolver.shouldRun( "jiras/surefire745/TestTwo.class", null ) );
assertFalse( resolver.shouldRun( "jiras/surefire745/TestThree.class", null ) );
assertTrue( resolver.shouldRun( "jiras/surefire745/TestFour.class", null ) );
}
public void testMultipleExcludedClasses()
{
Collection<String> included = singleton( DEFAULT_SUREFIRE_INCLUDED_TEST_PATTERNS );
Collection<String> excluded = asList( "BasicTest, **/TestTwo, **/TestThree.java" );
TestListResolver resolver = new TestListResolver( included, excluded );
assertFalse( resolver.shouldRun( "jiras/surefire745/BasicTest.class", null ) );
assertFalse( resolver.shouldRun( "jiras/surefire745/TestTwo.class", null ) );
assertFalse( resolver.shouldRun( "jiras/surefire745/TestThree.class", null ) );
assertTrue( resolver.shouldRun( "jiras/surefire745/TestFour.class", null ) );
}
public void testAndFilters()
{
TestListResolver firstFilter = new TestListResolver( "BasicTest, **/TestTwo, **/TestThree.java" );
TestListResolver secondFilter = new TestListResolver( "*icTest, Test???*" );
TestFilter<String, String> filter = firstFilter.and( secondFilter );
assertTrue( filter.shouldRun( "jiras/surefire745/BasicTest.class", null ) );
assertTrue( filter.shouldRun( "jiras/surefire745/TestTwo.class", null ) );
assertTrue( filter.shouldRun( "jiras/surefire745/TestThree.class", null ) );
assertFalse( filter.shouldRun( "jiras/surefire745/TestFour.class", null ) );
}
public void testTestListResolverWithoutMethods()
{
ResolvedTest inc1 = new ResolvedTest( "A?Test.java", null, false );
ResolvedTest inc2 = new ResolvedTest( "**/?Test", null, false );
ResolvedTest exc1 = new ResolvedTest( "AATest", null, false );
ResolvedTest exc2 = new ResolvedTest( "**/BTest.java", null, false );
TestListResolver resolver = newTestListResolver( toSet( inc1, inc2 ), toSet( exc1, exc2 ) );
assertThat( resolver.getPluginParameterTest(), is( "A?Test.java, **/?Test, !AATest, !**/BTest.java" ) );
assertFalse( resolver.isEmpty() );
assertFalse( resolver.hasIncludedMethodPatterns() );
assertFalse( resolver.hasExcludedMethodPatterns() );
assertFalse( resolver.hasMethodPatterns() );
assertTrue( resolver.shouldRun( "ATest.class", null ) );
assertFalse( resolver.shouldRun( "AATest.class", null ) );
assertTrue( resolver.shouldRun( "ABTest.class", null ) );
assertFalse( resolver.shouldRun( "BTest.class", null ) );
assertTrue( resolver.shouldRun( "CTest.class", null ) );
assertFalse( resolver.hasMethodPatterns() );
}
public void testTestListResolverWithMethods()
{
ResolvedTest inc1 = new ResolvedTest( "A?Test.java", null, false );
ResolvedTest inc2 = new ResolvedTest( "*?Test", null, false );
ResolvedTest exc1 = new ResolvedTest( "AATest", null, false );
ResolvedTest exc2 = new ResolvedTest( "*BTest.java", "failedTest", false );
TestListResolver resolver = newTestListResolver( toSet( inc1, inc2 ), toSet( exc1, exc2 ) );
assertThat( resolver.getPluginParameterTest(), is( "A?Test.java, *?Test, !AATest, !*BTest.java#failedTest" ) );
assertFalse( resolver.isEmpty() );
assertFalse( resolver.hasIncludedMethodPatterns() );
assertTrue( resolver.hasExcludedMethodPatterns() );
assertTrue( resolver.hasMethodPatterns() );
assertTrue( resolver.shouldRun( "ATest.class", null ) );
assertFalse( resolver.shouldRun( "AATest.class", null ) );
assertTrue( resolver.shouldRun( "ABTest.class", null ) );
assertTrue( resolver.shouldRun( "BTest.class", null ) );
assertFalse( resolver.shouldRun( "BTest.class", "failedTest" ) );
assertTrue( resolver.shouldRun( "CTest.class", null ) );
assertFalse( TestListResolver.optionallyWildcardFilter( resolver ).isEmpty() );
}
private static Set<ResolvedTest> toSet( ResolvedTest... patterns )
{
Set<ResolvedTest> set = new LinkedHashSet<>();
addAll( set, patterns );
return set;
}
public void testDefaultPatternsMatching()
{
Set<ResolvedTest> inclusions = resolveClass( DEFAULT_SUREFIRE_INCLUDED_TEST_PATTERNS );
Set<ResolvedTest> exclusions = resolveClass( DEFAULT_SUREFIRE_EXCLUDED_TEST_PATTERNS );
TestListResolver tlr = newTestListResolver( inclusions, exclusions );
boolean shouldRun = tlr.shouldRun( "org/apache/maven/surefire/SomeTest.class", null );
assertTrue( shouldRun );
}
public void testDefaultPatternsNotMatching()
{
Set<ResolvedTest> inclusions = resolveClass( DEFAULT_SUREFIRE_INCLUDED_TEST_PATTERNS );
Set<ResolvedTest> exclusions = resolveClass( DEFAULT_SUREFIRE_EXCLUDED_TEST_PATTERNS );
TestListResolver tlr = newTestListResolver( inclusions, exclusions );
boolean shouldRun = tlr.shouldRun( "org/apache/maven/surefire/SomeTestNotRunning.class", null );
assertFalse( shouldRun );
}
public void testInclusiveWithDefaultExclusivePattern()
{
Set<ResolvedTest> defaultExclusions = resolveClass( DEFAULT_SUREFIRE_EXCLUDED_TEST_PATTERNS );
boolean runnable = newTestListResolver( resolveClass( "A*Test" ), defaultExclusions )
.shouldRun( "org/apache/maven/surefire/ARunnableTest.class", null );
assertTrue( runnable );
}
public void testWildcard()
{
TestListResolver tlr = TestListResolver.optionallyWildcardFilter( new TestListResolver( (String) null ) );
assertThat( tlr, is( new TestListResolver( "**/*.class" ) ) );
assertThat( tlr.isWildcard(), is( true ) );
assertThat( tlr.isEmpty(), is( false ) );
tlr = TestListResolver.optionallyWildcardFilter( new TestListResolver( "**/**/MethodLessPattern.class" ) );
assertThat( tlr, is( new TestListResolver( "**/*.class" ) ) );
assertThat( tlr.isWildcard(), is( true ) );
assertThat( tlr.isEmpty(), is( false ) );
}
public void testRegexRuleViolationQuotedHashMark()
{
try
{
new TestListResolver( "%regex[.\\Q#\\E.]" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
public void testRegexRuleViolationEnclosedMethodSeparator()
{
try
{
new TestListResolver( "%regex[(.|.#.)]" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
public void testRegexRuleViolationMultipleHashmarkWithClassConstraint()
{
try
{
new TestListResolver( "%regex[.*#.|#.]" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
public void testRegexRuleViolationMultipleHashmarkForMethods()
{
try
{
new TestListResolver( "%regex[#.|#.]" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
public void testRegexRuleViolationInvalidClassPattern()
{
try
{
new TestListResolver( "%regex[.(.]" )
.shouldRun( "x", "x" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
public void testRegexRuleViolationInvalidMethodPattern()
{
try
{
new TestListResolver( "%regex[#.(.]" );
fail( "IllegalArgumentException is expected" );
}
catch ( IllegalArgumentException iea )
{
// expected
}
}
private static Set<ResolvedTest> resolveClass( String patterns )
{
Set<ResolvedTest> resolved = new HashSet<>();
for ( String pattern : patterns.split( "," ) )
{
resolved.add( new ResolvedTest( CLASS, pattern, false ) );
}
return resolved;
}
}