From 2cee5e8cdb5adc2d347e2ae778b2e48387cb098c Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Tue, 18 Jul 2017 16:53:02 +0200 Subject: [PATCH] prepare for search in the classpath for testng --- .../execution/JavaTestConfigurationBase.java | 3 ++ .../execution}/TestClassCollector.java | 38 +++------------ .../execution/junit/JUnitConfiguration.java | 5 ++ .../intellij/execution/junit/TestPackage.java | 46 ++++++++++++++++++- .../configuration/TestNGConfiguration.java | 5 ++ 5 files changed, 65 insertions(+), 32 deletions(-) rename {plugins/junit/src/com/intellij/execution/junit => java/execution/impl/src/com/intellij/execution}/TestClassCollector.java (76%) diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestConfigurationBase.java b/java/execution/impl/src/com/intellij/execution/JavaTestConfigurationBase.java index 30857d5b8ee4..6b033b62746c 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestConfigurationBase.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestConfigurationBase.java @@ -19,6 +19,7 @@ import com.intellij.execution.configurations.ConfigurationFactory; import com.intellij.execution.configurations.JavaRunConfigurationModule; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.configurations.RefactoringListenerProvider; +import com.intellij.execution.testframework.TestSearchScope; import com.intellij.execution.testframework.sm.runner.SMRunnerConsolePropertiesProvider; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -54,4 +55,6 @@ public abstract class JavaTestConfigurationBase extends ModuleBasedConfiguration public String prepareParameterizedParameter(String paramSetName) { return paramSetName; } + + public abstract TestSearchScope getTestSearchScope(); } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClassCollector.java b/java/execution/impl/src/com/intellij/execution/TestClassCollector.java similarity index 76% rename from plugins/junit/src/com/intellij/execution/junit/TestClassCollector.java rename to java/execution/impl/src/com/intellij/execution/TestClassCollector.java index a94e3f256c33..53ce4fe65bf1 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestClassCollector.java +++ b/java/execution/impl/src/com/intellij/execution/TestClassCollector.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.execution.junit; +package com.intellij.execution; import com.intellij.execution.testframework.TestSearchScope; import com.intellij.openapi.diagnostic.Logger; @@ -30,20 +30,20 @@ import com.intellij.util.lang.UrlClassLoader; import java.io.File; import java.io.IOException; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.net.URL; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; public class TestClassCollector { private static final Logger LOG = Logger.getInstance(TestClassCollector.class); - public static String[] collectClassFQNames(String packageName, JUnitConfiguration configuration) { + public static String[] collectClassFQNames(String packageName, JavaTestConfigurationBase configuration, Function>> predicateProducer) { Module module = configuration.getConfigurationModule().getModule(); List urls = new ArrayList<>(); @@ -59,7 +59,7 @@ public class TestClassCollector { } Path rootPath = null; - if (configuration.getPersistentData().getScope() == TestSearchScope.SINGLE_MODULE) { + if (configuration.getTestSearchScope() == TestSearchScope.SINGLE_MODULE) { CompilerModuleExtension moduleExtension = CompilerModuleExtension.getInstance(module); if (moduleExtension != null) { VirtualFile tests = moduleExtension.getCompilerOutputPathForTests(); @@ -75,14 +75,7 @@ public class TestClassCollector { String packagePath = packageName.replace('.', '/'); Enumeration resources = classLoader.getResources(packagePath); - Class testCaseClass = Class.forName("junit.framework.TestCase", true, classLoader); - - @SuppressWarnings("unchecked") - Class runWithClass = (Class)Class.forName("org.junit.runner.RunWith", true, classLoader); - - @SuppressWarnings("unchecked") - Class testClass = (Class)Class.forName("org.junit.Test", true, classLoader); - + Predicate> classPredicate = predicateProducer.apply(classLoader); while (resources.hasMoreElements()) { URL url = resources.nextElement(); Path baseDir = Paths.get(url.toURI()); @@ -111,26 +104,9 @@ public class TestClassCollector { aClass.isMemberClass() && !Modifier.isStatic(modifiers)) { return result; } - //junit 3 - if (testCaseClass.isAssignableFrom(aClass)) { + if (classPredicate.test(aClass)) { classes.add(fqName); } - else { - //annotation - if (aClass.isAnnotationPresent(runWithClass)) { - classes.add(fqName); - } - else { - //junit 4 & suite - for (Method method : aClass.getMethods()) { - if (Modifier.isStatic(method.getModifiers()) && "suite".equals(method.getName()) || - method.isAnnotationPresent(testClass)) { - classes.add(fqName); - break; - } - } - } - } } catch (Throwable e) { LOG.error(e); diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java b/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java index f5746b82ea78..b798cee43c4f 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java @@ -320,6 +320,11 @@ public class JUnitConfiguration extends JavaTestConfigurationBase { return getTestObject().isConfiguredByElement(this, testClass, testMethod, testPackage, testDir); } + @Override + public TestSearchScope getTestSearchScope() { + return getPersistentData().getScope(); + } + public void beFromSourcePosition(PsiLocation sourceLocation) { myData.setTestMethod(sourceLocation); myData.TEST_OBJECT = BY_SOURCE_POSITION; diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index f774b68973ff..17e5c5797c75 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -40,7 +40,11 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import java.io.File; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Arrays; +import java.util.function.Predicate; public class TestPackage extends TestObject { @@ -73,7 +77,7 @@ public class TestPackage extends TestObject { long start = System.currentTimeMillis(); if (Registry.is("junit4.search.4.tests.in.classpath", false)) { String packageName = getPackageName(data); - String[] classNames = TestClassCollector.collectClassFQNames(packageName, getConfiguration()); + String[] classNames = TestClassCollector.collectClassFQNames(packageName, getConfiguration(), TestPackage::createPredicate); PsiManager manager = PsiManager.getInstance(myProject); Arrays.stream(classNames) .filter(className -> acceptClassName(className)) //check patterns @@ -211,4 +215,44 @@ public class TestPackage extends TestObject { public File getWorkingDirsFile() { return myWorkingDirsFile; } + + private static Predicate> createPredicate(ClassLoader classLoader) { + + try { + Class testCaseClass = Class.forName("junit.framework.TestCase", true, classLoader); + + @SuppressWarnings("unchecked") + Class runWithClass = (Class)Class.forName("org.junit.runner.RunWith", true, classLoader); + + @SuppressWarnings("unchecked") + Class testClass = (Class)Class.forName("org.junit.Test", true, classLoader); + + return aClass -> { + //junit 3 + if (testCaseClass.isAssignableFrom(aClass)) { + return true; + } + else { + //annotation + if (aClass.isAnnotationPresent(runWithClass)) { + return true; + } + else { + //junit 4 & suite + for (Method method : aClass.getMethods()) { + if (Modifier.isStatic(method.getModifiers()) && "suite".equals(method.getName()) || + method.isAnnotationPresent(testClass)) { + return true; + } + } + } + } + return false; + }; + } + catch (ClassNotFoundException e) { + LOG.error(e); + return aClass -> false; + } + } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java index 0acf783554e3..acc665efabc2 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java @@ -228,6 +228,11 @@ public class TestNGConfiguration extends JavaTestConfigurationBase { return TestNGConfigurationProducer.getInvocationNumber(paramSetName); } + @Override + public TestSearchScope getTestSearchScope() { + return getPersistantData().getScope(); + } + public void setPackageConfiguration(Module module, PsiPackage pkg) { data.setPackage(pkg); setModule(module);