[devkit] Allow to use custom main class/module/jvmArgs/envs per test module via intellij.yaml in JUnitDevKitPatcher (RIDER-118944)

Also adds intellij.devkit.junit.skip.settings.from.intellij.yaml option to fallback to the previous behaviour.


(cherry picked from commit 3d60faf7632e3e4f497650ced02aa1f7b60e63a0)

GitOrigin-RevId: 0e087b02cf3070d02c76f5056cf7089e119e37b5
This commit is contained in:
Ilia Kirianovskii
2024-10-08 09:32:33 +02:00
committed by intellij-monorepo-bot
parent caffe82e2d
commit 94a9869aab
3 changed files with 110 additions and 0 deletions

View File

@@ -585,6 +585,9 @@
<applicationService serviceImplementation="org.jetbrains.idea.devkit.actions.updateFromSources.UpdateFromSourcesSettings"/>
<projectService serviceImplementation="org.jetbrains.idea.devkit.run.JUnitDevKitUnitTestingSettings"
configurationSchemaKey="unitTesting"/>
<notificationGroup id="Plugin DevKit Deployment" displayType="BALLOON" bundle="messages.DevKitBundle"
key="notification.group.devkit.deployment"/>
<notificationGroup id="DevKit Errors" displayType="BALLOON" hideFromSettings="true"/>

View File

@@ -82,6 +82,10 @@ final class JUnitDevKitPatcher extends JUnitPatcher {
}
appendAddOpensWhenNeeded(project, jdk, vm);
if (!Boolean.parseBoolean(vm.getPropertyValue("intellij.devkit.junit.skip.settings.from.intellij.yaml"))) {
JUnitDevKitUnitTestingSettings.getInstance(project).apply(module, javaParameters);
}
}
jdk = IdeaJdk.findIdeaJdk(jdk);

View File

@@ -0,0 +1,103 @@
// Copyright 2000-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.idea.devkit.run
import com.intellij.configurationStore.Property
import com.intellij.execution.ShortenCommandLine
import com.intellij.execution.configurations.JavaParameters
import com.intellij.openapi.components.*
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
@Suppress("LightServiceMigrationCode") // IJI-2399
internal class JUnitDevKitUnitTestingSettings(
private val project: Project,
) : SimplePersistentStateComponent<JUnitDevKitUnitTestingSettingsState>(JUnitDevKitUnitTestingSettingsState()) {
companion object {
@JvmStatic
fun getInstance(project: Project): JUnitDevKitUnitTestingSettings = project.service()
}
fun apply(module: Module?, javaParameters: JavaParameters) {
if (module == null) return
val runner = state.runners.firstOrNull {
it.enabledForModules.any { matchesName(module.name, it) } && it.disabledForModules.none { matchesName(module.name, it) }
} ?: return
for (arg in runner.jvmArgs) {
if (arg.startsWith("-D")) {
val parts = arg.substring(2).split('=', limit = 2)
if (parts.size == 1) {
javaParameters.vmParametersList.addProperty(parts[0])
}
else {
javaParameters.vmParametersList.addProperty(parts[0], expandMacros(parts[1], module, javaParameters, project))
}
}
else {
javaParameters.vmParametersList.add(arg)
}
}
for (env in runner.envs) {
val parts = env.split('=', limit = 2)
if (parts.size == 1) continue
javaParameters.addEnv(parts[0], expandMacros(parts[1], module, javaParameters, project))
}
val mainClassModule = runner.mainClassModule?.let { ModuleManager.getInstance(project).findModuleByName(it) }
if (mainClassModule != null) {
javaParameters.mainClass = runner.mainClass
javaParameters.classPath.clear()
javaParameters.configureByModule(mainClassModule, JavaParameters.CLASSES_ONLY)
}
javaParameters.setShortenCommandLine(ShortenCommandLine.ARGS_FILE)
javaParameters.setUseDynamicVMOptions(true)
}
private fun expandMacros(value: String, module: Module, javaParameters: JavaParameters, project: Project) = value
.replace("${'$'}TEST_MODULE_CLASSPATH$", javaParameters.classPath.pathsString)
.replace("${'$'}TEST_MODULE_NAME$", module.name)
.replace("${'$'}TEST_PROJECT_BASE_PATH$", project.basePath ?: "")
private fun matchesName(moduleName: String, pattern: String) =
if (pattern.lastOrNull() == '*') {
moduleName.startsWith(pattern.substring(0, pattern.length - 1))
}
else {
moduleName == pattern
}
}
@ApiStatus.Internal
internal class JUnitDevKitUnitTestingSettingsState : BaseState() {
@Property(description = "List of available runners")
var runners by list<JUnitDevKitUnitTestingSettingsRunner>()
}
@ApiStatus.Internal
internal class JUnitDevKitUnitTestingSettingsRunner : BaseState() {
@Property(description = "Name")
var name by string()
@Property(description = "Module name where the main class is defined")
var mainClassModule by string()
@Property(description = "Main class")
var mainClass by string()
@Property(description = "List of module names (or patterns) this runner should be applied to")
var enabledForModules by list<String>()
@Property(description = "List of module names (or patterns) this runner must not be applied to")
var disabledForModules by list<String>()
@Property(description = "Additional JVM arguments")
var jvmArgs by list<String>()
@Property(description = "Additional environment variables")
var envs by list<String>()
}