[SUREFIRE-1215] refs/tags/surefire-2.19.1_vote-1 slows down the Maven build in 20 seconds
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/3066272e Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/3066272e Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/3066272e Branch: refs/heads/master Commit: 3066272ef595be7b0128aa3a8aeeb287b9974d20 Parents: 7969ee4 Author: Tibor17 <tibo...@lycos.com> Authored: Wed Dec 30 01:49:57 2015 +0100 Committer: Tibor17 <tibo...@lycos.com> Committed: Wed Dec 30 01:49:57 2015 +0100 ---------------------------------------------------------------------- .../maven/surefire/booter/ForkedBooter.java | 15 +++--- .../surefire/common/junit48/FilterFactory.java | 31 +++++++++-- .../maven/surefire/junit4/JUnit4Provider.java | 57 +++++--------------- .../surefire/junit4/TestResolverFilter.java | 1 + .../surefire/junitcore/JUnitCoreProvider.java | 13 ++++- 5 files changed, 59 insertions(+), 58 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3066272e/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java ---------------------------------------------------------------------- diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java index 3dc4d50..823353e 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java @@ -255,21 +255,22 @@ public final class ForkedBooter ThreadFactory threadFactory = newDaemonThreadFactory( "last-ditch-daemon-shutdown-thread-" + SYSTEM_EXIT_TIMEOUT_IN_SECONDS + "sec" ); - ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 0, threadFactory ); + ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 1, threadFactory ); executor.setMaximumPoolSize( 1 ); + executor.prestartCoreThread(); return executor; } @SuppressWarnings( "checkstyle:emptyblock" ) private static void launchLastDitchDaemonShutdownThread( final int returnCode ) { - JVM_TERMINATOR.schedule( new Runnable() + JVM_TERMINATOR.schedule( new Runnable() + { + public void run() { - public void run() - { - Runtime.getRuntime().halt( returnCode ); - } - }, SYSTEM_EXIT_TIMEOUT_IN_SECONDS, SECONDS ); + Runtime.getRuntime().halt( returnCode ); + } + }, SYSTEM_EXIT_TIMEOUT_IN_SECONDS, SECONDS ); } private static RunResult invokeProviderInSameClassLoader( Object testSet, Object factory, http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3066272e/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java index 5dd2918..36096e4 100644 --- a/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java +++ b/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java @@ -19,7 +19,6 @@ package org.apache.maven.surefire.common.junit48; * under the License. */ -import org.apache.maven.surefire.booter.ProviderParameterNames; import org.apache.maven.surefire.group.match.GroupMatcher; import org.apache.maven.surefire.group.parse.GroupMatcherParser; import org.apache.maven.surefire.group.parse.ParseException; @@ -29,6 +28,10 @@ import org.junit.runner.manipulation.Filter; import java.util.Map; import java.util.Set; +import static org.apache.maven.surefire.booter.ProviderParameterNames.TESTNG_EXCLUDEDGROUPS_PROP; +import static org.apache.maven.surefire.booter.ProviderParameterNames.TESTNG_GROUPS_PROP; +import static org.apache.maven.surefire.util.internal.StringUtils.isNotBlank; + /** * @author Todd Lipcon */ @@ -41,13 +44,29 @@ public class FilterFactory this.testClassLoader = testClassLoader; } + /** + * @return <tt>true</tt> if non-blank + * {@link org.apache.maven.surefire.booter.ProviderParameterNames#TESTNG_GROUPS_PROP} and/or + * {@link org.apache.maven.surefire.booter.ProviderParameterNames#TESTNG_EXCLUDEDGROUPS_PROP} exists. + */ + public boolean canCreateGroupFilter( Map<String, String> providerProperties ) + { + String groups = providerProperties.get( TESTNG_GROUPS_PROP ); + String excludedGroups = providerProperties.get( TESTNG_EXCLUDEDGROUPS_PROP ); + return isNotBlank( groups ) || isNotBlank( excludedGroups ); + } + + /** + * Creates filter using he key + * {@link org.apache.maven.surefire.booter.ProviderParameterNames#TESTNG_GROUPS_PROP} and/or + * {@link org.apache.maven.surefire.booter.ProviderParameterNames#TESTNG_EXCLUDEDGROUPS_PROP}. + */ public Filter createGroupFilter( Map<String, String> providerProperties ) { - String groups = providerProperties.get( ProviderParameterNames.TESTNG_GROUPS_PROP ); - String excludedGroups = providerProperties.get( ProviderParameterNames.TESTNG_EXCLUDEDGROUPS_PROP ); + String groups = providerProperties.get( TESTNG_GROUPS_PROP ); GroupMatcher included = null; - if ( groups != null && groups.trim().length() > 0 ) + if ( isNotBlank( groups ) ) { try { @@ -60,8 +79,10 @@ public class FilterFactory } } + String excludedGroups = providerProperties.get( TESTNG_EXCLUDEDGROUPS_PROP ); + GroupMatcher excluded = null; - if ( excludedGroups != null && excludedGroups.trim().length() > 0 ) + if ( isNotBlank( excludedGroups ) ) { try { http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3066272e/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java index b286bbf..2b0639d 100644 --- a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java +++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java @@ -43,6 +43,7 @@ import org.apache.maven.surefire.util.RunOrderCalculator; import org.apache.maven.surefire.util.ScanResult; import org.apache.maven.surefire.util.TestsToRun; import org.junit.runner.Description; +import org.junit.runner.Request; import org.junit.runner.Result; import org.junit.runner.Runner; import org.junit.runner.manipulation.Filter; @@ -56,7 +57,6 @@ import static java.lang.reflect.Modifier.isAbstract; import static java.lang.reflect.Modifier.isInterface; import static java.util.Collections.unmodifiableCollection; import static org.apache.maven.surefire.booter.CommandReader.getReader; -import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.cutTestClassAndMethod; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.generateFailingTests; import static org.apache.maven.surefire.common.junit4.JUnit4Reflector.createDescription; import static org.apache.maven.surefire.common.junit4.JUnit4Reflector.createIgnored; @@ -66,7 +66,6 @@ import static org.apache.maven.surefire.common.junit4.Notifier.pureNotifier; import static org.apache.maven.surefire.report.ConsoleOutputCapture.startCapture; import static org.apache.maven.surefire.report.SimpleReportEntry.withException; import static org.apache.maven.surefire.testset.TestListResolver.optionallyWildcardFilter; -import static org.apache.maven.surefire.testset.TestListResolver.toClassFileName; import static org.apache.maven.surefire.util.TestsToRun.fromClass; import static org.junit.runner.Request.aClass; import static org.junit.runner.Request.method; @@ -272,7 +271,7 @@ public class JUnit4Provider try { notifier.asFailFast( isFailFast() ); - execute( clazz, notifier, hasMethodFilter ? new TestResolverFilter() : new NullFilter() ); + execute( clazz, notifier, hasMethodFilter ? createMethodFilter() : null ); } finally { @@ -357,7 +356,12 @@ public class JUnit4Provider final int classModifiers = testClass.getModifiers(); if ( !isAbstract( classModifiers ) && !isInterface( classModifiers ) ) { - Runner runner = aClass( testClass ).filterWith( filter ).getRunner(); + Request request = aClass( testClass ); + if ( filter != null ) + { + request = request.filterWith( filter ); + } + Runner runner = request.getRunner(); if ( countTestsInRunner( runner.getDescription() ) != 0 ) { runner.run( notifier ); @@ -425,49 +429,14 @@ public class JUnit4Provider else { name = name.trim(); - return name.startsWith( "initializationError0(org.junit.runner.manipulation.Filter)" ) || name.startsWith( - "initializationError(org.junit.runner.manipulation.Filter)" ); - } - } - - private class TestResolverFilter - extends Filter - { - private final TestListResolver methodFilter = optionallyWildcardFilter( JUnit4Provider.this.testResolver ); - - @Override - public boolean shouldRun( Description description ) - { - // class: Java class name; method: 1. "testMethod" or 2. "testMethod[5+whatever]" in @Parameterized - final ClassMethod cm = cutTestClassAndMethod( description ); - final boolean isSuite = description.isSuite(); - final boolean isValidTest = description.isTest() && cm.isValid(); - final String clazz = cm.getClazz(); - final String method = cm.getMethod(); - return isSuite || isValidTest && methodFilter.shouldRun( toClassFileName( clazz ), method ); - } - - @Override - public String describe() - { - return methodFilter.toString(); + return name.startsWith( "initializationError0(org.junit.runner.manipulation.Filter)" ) + || name.startsWith( "initializationError(org.junit.runner.manipulation.Filter)" ); } } - private final class NullFilter - extends TestResolverFilter + private Filter createMethodFilter() { - - @Override - public boolean shouldRun( Description description ) - { - return true; - } - - @Override - public String describe() - { - return ""; - } + TestListResolver methodFilter = optionallyWildcardFilter( testResolver ); + return methodFilter.isEmpty() || methodFilter.isWildcard() ? null : new TestResolverFilter( methodFilter ); } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3066272e/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/TestResolverFilter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/TestResolverFilter.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/TestResolverFilter.java new file mode 100644 index 0000000..4205b14 --- /dev/null +++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/TestResolverFilter.java @@ -0,0 +1 @@ +package org.apache.maven.surefire.junit4; /* * 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.common.junit4.ClassMethod; import org.apache.maven.surefire.testset.TestListResolver; import org.junit.runner. Description; import org.junit.runner.manipulation.Filter; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.cutTestClassAndMethod; import static org.apache.maven.surefire.testset.TestListResolver.toClassFileName; /** * Method filter used in {@link JUnit4Provider}. */ final class TestResolverFilter extends Filter { private final TestListResolver methodFilter; TestResolverFilter( TestListResolver methodFilter ) { this.methodFilter = methodFilter; } @Override public boolean shouldRun( Description description ) { // class: Java class name; method: 1. "testMethod" or 2. "testMethod[5+whatever]" in @Parameterized final ClassMethod cm = cutTestClassAndMethod( description ); final boolean isSuite = description.isSuite(); final boolean isValidTest = description.isTest() && cm.isValid(); final String clazz = cm.getClazz(); final String method = cm.getMethod(); return is Suite || isValidTest && methodFilter.shouldRun( toClassFileName( clazz ), method ); } @Override public String describe() { return methodFilter.toString(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/3066272e/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java index 606911c..f0f1aff 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java @@ -275,10 +275,19 @@ public class JUnitCoreProvider private Filter createJUnit48Filter() { final FilterFactory factory = new FilterFactory( testClassLoader ); - Filter groupFilter = factory.createGroupFilter( providerParameters.getProviderProperties() ); + Map<String, String> props = providerParameters.getProviderProperties(); + Filter groupFilter = factory.canCreateGroupFilter( props ) ? factory.createGroupFilter( props ) : null; TestListResolver methodFilter = optionallyWildcardFilter( testResolver ); boolean onlyGroups = methodFilter.isEmpty() || methodFilter.isWildcard(); - return onlyGroups ? groupFilter : factory.and( groupFilter, factory.createMethodFilter( methodFilter ) ); + if ( onlyGroups ) + { + return groupFilter; + } + else + { + Filter jUnitMethodFilter = factory.createMethodFilter( methodFilter ); + return groupFilter == null ? jUnitMethodFilter : factory.and( groupFilter, jUnitMethodFilter ); + } } private TestsToRun scanClassPath()