Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't use JetBrainsPluginCreationResultResolver as a default resolver #1157

Merged
merged 5 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,12 @@ interface ProblemLevelRemappingManager {
fun newDefaultResolver(remappingSet: RemappingSet): PluginCreationResultResolver {
val defaultResolver = IntelliJPluginCreationResultResolver()
val problemLevelRemapping = getLevelRemapping(remappingSet)
val levelRemappingResolver = LevelRemappingPluginCreationResultResolver(defaultResolver, problemLevelRemapping)
return JetBrainsPluginCreationResultResolver.fromClassPathJson(delegatedResolver = levelRemappingResolver)
return LevelRemappingPluginCreationResultResolver(defaultResolver, problemLevelRemapping)
}

fun defaultExistingPluginResolver() = newDefaultResolver(RemappingSet.EXISTING_PLUGIN_REMAPPING_SET)
fun defaultNewPluginResolver() = newDefaultResolver(RemappingSet.NEW_PLUGIN_REMAPPING_SET)
fun defaultJetBrainsPluginResolver() = newDefaultResolver(RemappingSet.JETBRAINS_PLUGIN_REMAPPING_SET)
fun defaultJetBrainsPluginResolver(defaultResolver: PluginCreationResultResolver) = LevelRemappingPluginCreationResultResolver(defaultResolver, getLevelRemapping(RemappingSet.JETBRAINS_PLUGIN_REMAPPING_SET), unwrapRemappedProblems = true)
}

class JsonUrlProblemLevelRemappingManager(private val pluginProblemsJsonUrl: URL) : ProblemLevelRemappingManager {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ class PluginParsingConfigurationResolution {
EXISTING -> RemappingSet.EXISTING_PLUGIN_REMAPPING_SET
NEW -> RemappingSet.NEW_PLUGIN_REMAPPING_SET
}
return problemLevelMappingManager
.newDefaultResolver(remappingSet)
val defaultResolver = problemLevelMappingManager.newDefaultResolver(remappingSet)
return JetBrainsPluginCreationResultResolver.fromClassPathJson(delegatedResolver = defaultResolver)
.withCliIgnoredProblemResolver(configuration)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import com.jetbrains.plugin.structure.base.plugin.PluginCreationSuccess
import com.jetbrains.plugin.structure.base.problems.PluginProblem
import com.jetbrains.plugin.structure.base.problems.isInstance
import com.jetbrains.plugin.structure.base.utils.contentBuilder.ContentBuilder
import com.jetbrains.plugin.structure.base.utils.contentBuilder.buildDirectory
import com.jetbrains.plugin.structure.base.utils.contentBuilder.buildZipFile
import com.jetbrains.plugin.structure.ide.Ide
import com.jetbrains.plugin.structure.ide.IdeManager
import com.jetbrains.plugin.structure.intellij.plugin.IdePlugin
import com.jetbrains.plugin.structure.intellij.plugin.IdePluginManager
import com.jetbrains.plugin.structure.intellij.plugin.StructurallyValidated
Expand All @@ -16,8 +19,8 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.fail
import org.junit.Rule
import org.junit.rules.TemporaryFolder
import kotlin.reflect.KClass
import java.nio.file.Path
import kotlin.reflect.KClass

abstract class BasePluginTest {
@Rule
Expand Down Expand Up @@ -123,4 +126,29 @@ abstract class BasePluginTest {
return
}
}

protected fun buildIde(version: String = "IU-192.1"): Ide {
val ideaDirectory = buildDirectory(temporaryFolder.newFolder("idea").toPath()) {
file("build.txt", version)
dir("lib") {
zip("idea.jar") {
dir("META-INF") {
file("plugin.xml") {
"""
<idea-plugin>
<id>com.intellij</id>
<name>IDEA CORE</name>
<version>1.0</version>
<module value="com.intellij.modules.all"/>
</idea-plugin>
""".trimIndent()
}
}
}
}
}
val ide = IdeManager.createManager().createIde(ideaDirectory)
assertEquals(version, ide.version.asString())
return ide
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -468,15 +468,8 @@ class ExistingPluginValidationTest : BasePluginTest() {
val releaseDateInFuture = LocalDate.now().plusMonths(1)
val formatter = DateTimeFormatter.ofPattern("yyyyMMdd")
val releaseDateInFutureString = releaseDateInFuture.format(formatter)
val header = ideaPlugin(vendor = "JetBrains")
val delegateResolver = IntelliJPluginCreationResultResolver()

val levelRemappingDefinition = JsonUrlProblemLevelRemappingManager.fromClassPathJson().load()
val jetBrainsPluginLevelRemapping = levelRemappingDefinition.getOrEmpty(RemappingSet.JETBRAINS_PLUGIN_REMAPPING_SET)
val problemResolver = JetBrainsPluginCreationResultResolver(
LevelRemappingPluginCreationResultResolver(delegateResolver, error<TemplateWordInPluginName>()),
jetBrainsPluginLevelRemapping
)
val header = ideaPlugin()
val problemResolver = getIntelliJPluginCreationResolver(isExistingPlugin = false, isJetBrainsPlugin = true)

val result = buildPluginWithResult(problemResolver) {
dir("META-INF") {
Expand Down Expand Up @@ -566,12 +559,18 @@ class ExistingPluginValidationTest : BasePluginTest() {
<product-descriptor code="PTESTPLUGIN" release-date="20210818" release-version="$releaseVersion"/>
""".trimIndent()

private fun getIntelliJPluginCreationResolver(isExistingPlugin: Boolean = true) =
JsonUrlProblemLevelRemappingManager.fromClassPathJson().let {
if (isExistingPlugin) {
it.defaultExistingPluginResolver()
} else {
it.defaultNewPluginResolver()
private fun getIntelliJPluginCreationResolver(isExistingPlugin: Boolean = true, isJetBrainsPlugin: Boolean = false): PluginCreationResultResolver {
JsonUrlProblemLevelRemappingManager.fromClassPathJson().let {
val defaultResolver = if (isExistingPlugin) {
it.defaultExistingPluginResolver()
} else {
it.defaultNewPluginResolver()
}
return if (isJetBrainsPlugin) {
it.defaultJetBrainsPluginResolver(defaultResolver)
} else {
defaultResolver
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.jetbrains.pluginverifier.tests

import com.jetbrains.plugin.structure.intellij.problems.PluginCreationResultResolver
import com.jetbrains.plugin.structure.intellij.problems.remapping.JsonUrlProblemLevelRemappingManager
import com.jetbrains.pluginverifier.PluginVerificationResult
import com.jetbrains.pluginverifier.options.PluginParsingConfiguration
import com.jetbrains.pluginverifier.options.PluginParsingConfigurationResolution
import org.junit.Assert.assertTrue
import org.junit.Test

class JetBrainsPluginTest : BasePluginTest() {
@Test
fun `plugin has a JetBrains vendor and forbidden plugin ID`() {
val ide = buildIde("IU-242.21829.142")

val forbiddenPluginId = "org.jetbrains.somePlugin"
val ideaPlugin = ideaPlugin(pluginId = forbiddenPluginId, vendor = "JetBrains s.r.o.")
val creationResult = buildPluginWithResult(problemResolver) {
dir("META-INF") {
file("plugin.xml") {
"""
<idea-plugin>
$ideaPlugin
</idea-plugin>
"""
}
}
}

assertSuccess(creationResult) {
val verificationResult = VerificationRunner().runPluginVerification(ide, plugin)
assertTrue(verificationResult is PluginVerificationResult.Verified)
val verifiedResult = verificationResult as PluginVerificationResult.Verified

assertEmpty("Compatibility Problems", verifiedResult.compatibilityProblems)
assertEmpty("Plugin Structure Warnings", verifiedResult.pluginStructureWarnings)
assertEmpty("Plugin Warnings", warnings)
}
}

@Test
fun `plugin has a JetBrains vendor`() {
val ide = buildIde("IU-242.21829.142")
val forbiddenPluginId = "org.jetbrains.somePlugin"
val ideaPlugin = ideaPlugin(pluginId = forbiddenPluginId, vendor = "JetBrains s.r.o.")

val creationResult = buildPluginWithResult(problemResolver) {
dir("META-INF") {
file("plugin.xml") {
"""
<idea-plugin>
$ideaPlugin
</idea-plugin>
"""
}
}
}

assertSuccess(creationResult) {
val verificationResult = VerificationRunner().runPluginVerification(ide, plugin)
assertTrue(verificationResult is PluginVerificationResult.Verified)
val verifiedResult = verificationResult as PluginVerificationResult.Verified

assertEmpty("Compatibility Problems", verifiedResult.compatibilityProblems)
assertEmpty("Plugin Structure Warnings", verifiedResult.pluginStructureWarnings)
assertEmpty("Plugin Warnings", warnings)
}
}

private val problemResolver: PluginCreationResultResolver
get() {
val pluginParsingConfigurationResolution = PluginParsingConfigurationResolution()
return pluginParsingConfigurationResolution.resolveProblemLevelMapping(
PluginParsingConfiguration(),
JsonUrlProblemLevelRemappingManager.fromClassPathJson()
)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package com.jetbrains.pluginverifier.tests

import com.jetbrains.plugin.structure.base.utils.contentBuilder.buildDirectory
import com.jetbrains.plugin.structure.ide.Ide
import com.jetbrains.plugin.structure.ide.IdeManager
import com.jetbrains.plugin.structure.intellij.problems.UndeclaredKotlinK2CompatibilityMode
import com.jetbrains.pluginverifier.PluginVerificationResult
import com.jetbrains.pluginverifier.results.problems.UndeclaredKotlinK2CompatibilityModeProblem
Expand Down Expand Up @@ -80,28 +77,4 @@ class K2ModeCompatibilityTest : BasePluginTest() {
}
}

private fun buildIde(version: String = "IU-192.1"): Ide {
val ideaDirectory = buildDirectory(temporaryFolder.newFolder("idea").toPath()) {
file("build.txt", version)
dir("lib") {
zip("idea.jar") {
dir("META-INF") {
file("plugin.xml") {
"""
<idea-plugin>
<id>com.intellij</id>
<name>IDEA CORE</name>
<version>1.0</version>
<module value="com.intellij.modules.all"/>
</idea-plugin>
""".trimIndent()
}
}
}
}
}
val ide = IdeManager.createManager().createIde(ideaDirectory)
assertEquals(version, ide.version.asString())
return ide
}
}
Loading