diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/TestingOptions.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/TestingOptions.groovy index 5680b7b491f9..f7193055584a 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/TestingOptions.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/TestingOptions.groovy @@ -20,8 +20,8 @@ class TestingOptions { String testPatterns = System.getProperty("intellij.build.test.patterns", OLD_TEST_PATTERNS) /** - * Semicolon-separated names of JUnit run configurations in the project which need to be executed. If this option is specified, - * {@link #testGroups}, {@link #testPatterns} and {@link #mainModule} will be ignored. + * Semicolon-separated names of JUnit run configurations (with optional custom test bootstrap suite in parentheses after each) in the project which need to be executed. + * If this option is specified {@link #testGroups}, {@link #testPatterns} and {@link #mainModule} will be ignored. */ String testConfigurations = System.getProperty("intellij.build.test.configurations") diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JUnitRunConfigurationProperties.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JUnitRunConfigurationProperties.groovy index b56612e07796..62cd791e4cf6 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JUnitRunConfigurationProperties.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/JUnitRunConfigurationProperties.groovy @@ -9,10 +9,11 @@ import org.jetbrains.intellij.build.BuildMessages final class JUnitRunConfigurationProperties extends RunConfigurationProperties { final List testClassPatterns final List requiredArtifacts + final String testBootstrapSuite @SuppressWarnings(["GrUnresolvedAccess", "GroovyAssignabilityCheck"]) @CompileDynamic - static JUnitRunConfigurationProperties loadRunConfiguration(File file, BuildMessages messages) { + static JUnitRunConfigurationProperties loadRunConfiguration(File file, String testBootstrapSuite, BuildMessages messages) { def configuration = getConfiguration(file, messages) if (configuration.@type != "JUnit") { @@ -54,11 +55,13 @@ final class JUnitRunConfigurationProperties extends RunConfigurationProperties { // Pattern is a regex already, we don't need to escape it in com.intellij.TestClassesFilter ("pattern" == testKind ? ["-Dintellij.build.test.patterns.escaped=true"] : []) def envVariables = first(configuration.envs)?.env?.collectEntries { [it.@name, it.@value] } ?: [:] - return new JUnitRunConfigurationProperties(configuration.@name, moduleName, testClassPatterns, vmParameters, requiredArtifacts, envVariables) + return new JUnitRunConfigurationProperties(configuration.@name, moduleName, testBootstrapSuite, + testClassPatterns, vmParameters, requiredArtifacts, envVariables) } JUnitRunConfigurationProperties(String name, String moduleName, + String testBootstrapSuite, List testClassPatterns, List vmParameters, List requiredArtifacts, @@ -66,5 +69,6 @@ final class JUnitRunConfigurationProperties extends RunConfigurationProperties { super(name, moduleName, vmParameters, envVariables) this.testClassPatterns = testClassPatterns this.requiredArtifacts = requiredArtifacts + this.testBootstrapSuite = testBootstrapSuite } } diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/TestingTasksImpl.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/TestingTasksImpl.groovy index 4c705ae5ddd8..a6b25bfa18d6 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/TestingTasksImpl.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/TestingTasksImpl.groovy @@ -10,7 +10,11 @@ import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import org.apache.tools.ant.AntClassLoader import org.apache.tools.ant.types.Path -import org.jetbrains.intellij.build.* +import org.jetbrains.intellij.build.BuildOptions +import org.jetbrains.intellij.build.CompilationContext +import org.jetbrains.intellij.build.CompilationTasks +import org.jetbrains.intellij.build.TestingOptions +import org.jetbrains.intellij.build.TestingTasks import org.jetbrains.intellij.build.causal.CausalProfilingOptions import org.jetbrains.intellij.build.impl.compilation.PortableCompilationCache import org.jetbrains.jps.model.java.JpsJavaClasspathKind @@ -49,10 +53,7 @@ class TestingTasksImpl extends TestingTasks { if (projectArtifacts) { compilationTasks.buildProjectArtifacts(projectArtifacts) } - def runConfigurations = options.testConfigurations?.split(";")?.collect { String name -> - def file = JUnitRunConfigurationProperties.findRunConfiguration(context.paths.projectHome, name, context.messages) - JUnitRunConfigurationProperties.loadRunConfiguration(file, context.messages) - } + def runConfigurations = options.testConfigurations?.split(";")?.collect { loadRunConfiguration(it) } if (runConfigurations != null) { compilationTasks.compileModules(["intellij.tools.testsBootstrap"], ["intellij.platform.buildScripts"] + runConfigurations.collect { it.moduleName }) compilationTasks.buildProjectArtifacts(runConfigurations.collectMany {it.requiredArtifacts}) @@ -125,8 +126,11 @@ class TestingTasksImpl extends TestingTasks { Map additionalSystemProperties) { context.messages.progress("Running '${runConfigurationProperties.name}' run configuration") List filteredVmOptions = removeStandardJvmOptions(runConfigurationProperties.vmParameters) - runTestsProcess(runConfigurationProperties.moduleName, null, runConfigurationProperties.testClassPatterns.join(";"), - filteredVmOptions + additionalJvmOptions, additionalSystemProperties, runConfigurationProperties.envVariables, false) + runTestsProcess(runConfigurationProperties.moduleName, + runConfigurationProperties.testBootstrapSuite, null, + runConfigurationProperties.testClassPatterns.join(";"), + filteredVmOptions + additionalJvmOptions, additionalSystemProperties, + runConfigurationProperties.envVariables, false) } private static List removeStandardJvmOptions(List vmOptions) { @@ -158,7 +162,9 @@ class TestingTasksImpl extends TestingTasks { additionalSystemProperties["exclude.tests.roots.file"] = excludedRootsFile.absolutePath } - runTestsProcess(mainModule, options.testGroups, options.testPatterns, additionalJvmOptions, additionalSystemProperties, [:], false) + runTestsProcess(mainModule, options.bootstrapSuite, + options.testGroups, options.testPatterns, + additionalJvmOptions, additionalSystemProperties, [:], false) } private loadTestDiscovery(List additionalJvmOptions, LinkedHashMap additionalSystemProperties) { @@ -260,10 +266,12 @@ class TestingTasksImpl extends TestingTasks { } def mainModule = options.mainModule ?: defaultMainModule def filteredOptions = removeStandardJvmOptions(StringUtil.splitHonorQuotes(remoteDebugJvmOptions, ' ' as char)) - runTestsProcess(mainModule, null, junitClass, filteredOptions + additionalJvmOptions, [:], [:], true) + runTestsProcess(mainModule, options.bootstrapSuite, null, + junitClass, filteredOptions + additionalJvmOptions, + [:], [:], true) } - private void runTestsProcess(String mainModule, String testGroups, String testPatterns, + private void runTestsProcess(String mainModule, String testBootstrapSuite, String testGroups, String testPatterns, List jvmArgs, Map systemProperties, Map envVariables, boolean remoteDebugging) { List testsClasspath = context.getModuleRuntimeClasspath(context.findRequiredModule(mainModule), true) List bootstrapClasspath = context.getModuleRuntimeClasspath(context.findRequiredModule("intellij.tools.testsBootstrap"), false) @@ -302,7 +310,8 @@ class TestingTasksImpl extends TestingTasks { context.messages.info("Environment variables: $envVariables") } - runJUnitTask(mainModule, allJvmArgs, allSystemProperties, envVariables, isBootstrapSuiteDefault() && !isRunningInBatchMode() ? bootstrapClasspath : testsClasspath) + runJUnitTask(mainModule, testBootstrapSuite, allJvmArgs, allSystemProperties, envVariables, + isBootstrapSuiteDefault(testBootstrapSuite) && !isRunningInBatchMode() ? bootstrapClasspath : testsClasspath) notifySnapshotBuilt(allJvmArgs) } @@ -417,7 +426,8 @@ class TestingTasksImpl extends TestingTasks { @SuppressWarnings("GrUnresolvedAccess") @CompileDynamic - private void runJUnitTask(String mainModule, List jvmArgs, Map systemProperties, + private void runJUnitTask(String mainModule, String testBootstrapSuite, + List jvmArgs, Map systemProperties, Map envVariables, List bootstrapClasspath) { defineJunitTask(context.ant, "$context.paths.communityHome/lib") @@ -458,7 +468,7 @@ class TestingTasksImpl extends TestingTasks { } //test classpath may exceed the maximum command line, so we need to wrap a classpath in a jar - if (!isBootstrapSuiteDefault()) { + if (!isBootstrapSuiteDefault(testBootstrapSuite)) { def classpathJarFile = CommandLineWrapperUtil.createClasspathJarFile(new Manifest(), bootstrapClasspath) classpath { pathelement(location: classpathJarFile.path) @@ -477,7 +487,7 @@ class TestingTasksImpl extends TestingTasks { fileset dir: mainModuleTestsOutput, includes: options.batchTestIncludes } } else { - test(name: options.bootstrapSuite) + test(name: testBootstrapSuite) } } } @@ -554,8 +564,8 @@ class TestingTasksImpl extends TestingTasks { ant.taskdef(name: "junit", classname: "org.apache.tools.ant.taskdefs.optional.junit.JUnitTask", loaderRef: junitTaskLoaderRef) } - protected boolean isBootstrapSuiteDefault() { - return options.bootstrapSuite == TestingOptions.BOOTSTRAP_SUITE_DEFAULT + protected static boolean isBootstrapSuiteDefault(String testBootstrapSuite) { + return testBootstrapSuite == TestingOptions.BOOTSTRAP_SUITE_DEFAULT } protected boolean isRunningInBatchMode() { @@ -584,4 +594,21 @@ class TestingTasksImpl extends TestingTasks { return causalProfilingJvmArgs } + + private JUnitRunConfigurationProperties loadRunConfiguration(String descriptor) { + String name + String testBootstrapSuite + def openingIndex = descriptor.indexOf('(') + def closingIndex = descriptor.indexOf(')') + if (openingIndex > -1 && closingIndex > -1 && closingIndex > openingIndex) { + name = descriptor.substring(0, openingIndex).trim() + testBootstrapSuite = descriptor.substring(openingIndex + 1, closingIndex).trim() + } + else { + name = descriptor.trim() + testBootstrapSuite = options.bootstrapSuite + } + def file = JUnitRunConfigurationProperties.findRunConfiguration(context.paths.projectHome, name, context.messages) + return JUnitRunConfigurationProperties.loadRunConfiguration(file, testBootstrapSuite, context.messages) + } } diff --git a/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/JUnitRunConfigurationPropertiesTest.kt b/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/JUnitRunConfigurationPropertiesTest.kt index df30c5dc42ee..b75fdb9165ad 100644 --- a/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/JUnitRunConfigurationPropertiesTest.kt +++ b/platform/build-scripts/tests/testSrc/org/jetbrains/intellij/build/JUnitRunConfigurationPropertiesTest.kt @@ -6,6 +6,7 @@ package org.jetbrains.intellij.build import com.intellij.util.io.URLUtil import junit.framework.AssertionFailedError import org.jetbrains.intellij.build.impl.JUnitRunConfigurationProperties +import org.jetbrains.intellij.build.TestingOptions import org.junit.Assert.assertEquals import org.junit.Test @@ -55,6 +56,10 @@ class JUnitRunConfigurationPropertiesTest { private fun loadRunConfiguration(fileName: String): JUnitRunConfigurationProperties { val url = JUnitRunConfigurationPropertiesTest::class.java.getResource("runConfigurations/$fileName") - return JUnitRunConfigurationProperties.loadRunConfiguration(URLUtil.urlToFile(url), MockBuildMessages()) + return JUnitRunConfigurationProperties.loadRunConfiguration( + URLUtil.urlToFile(url), + TestingOptions.BOOTSTRAP_SUITE_DEFAULT, + MockBuildMessages() + ) } } \ No newline at end of file