Add test on essential plugins

All dependencies of essential plugin should be added as essential plugins otherwise on disabling any of them the product can't be loaded

GitOrigin-RevId: 1ce336e294b07d3672cdbb9279e3dabca947f48c
This commit is contained in:
Maxim.Kolmakov
2024-04-23 13:30:20 +02:00
committed by intellij-monorepo-bot
parent eb70cd0fea
commit a1bc75e143
3 changed files with 71 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ package org.jetbrains.intellij.build
import com.intellij.openapi.application.PathManager
import com.intellij.platform.buildScripts.testFramework.createBuildOptionsForTest
import com.intellij.platform.buildScripts.testFramework.runEssentialPluginsTest
import com.intellij.platform.buildScripts.testFramework.runTestBuild
import com.intellij.platform.buildScripts.testFramework.spanName
import kotlinx.coroutines.Dispatchers
@@ -43,4 +44,12 @@ class IdeaCommunityBuildTest {
}
}
}
@Test
fun `essential plugins depend only on essential plugins`() {
val homePath = PathManager.getHomeDirFor(javaClass)!!
runEssentialPluginsTest(homePath = homePath,
productProperties = IdeaCommunityProperties(COMMUNITY_ROOT.communityRoot),
buildTools = ProprietaryBuildTools.DUMMY)
}
}

View File

@@ -31,5 +31,6 @@
<orderEntry type="module" module-name="intellij.platform.jps.build" />
<orderEntry type="module" module-name="intellij.platform.runtime.product" />
<orderEntry type="library" name="devkit.runtime.module.repository.jps" level="project" />
<orderEntry type="module" module-name="intellij.platform.util.xmlDom" />
</component>
</module>

View File

@@ -0,0 +1,61 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.buildScripts.testFramework
import com.intellij.util.xml.dom.readXmlAsModel
import kotlinx.coroutines.runBlocking
import org.assertj.core.api.SoftAssertions
import org.jetbrains.intellij.build.BuildContext
import org.jetbrains.intellij.build.ProductProperties
import org.jetbrains.intellij.build.ProprietaryBuildTools
import org.jetbrains.intellij.build.impl.BuildContextImpl
import org.jetbrains.intellij.build.impl.collectPluginDescriptors
import java.nio.file.Path
fun runEssentialPluginsTest(
homePath: Path,
productProperties: ProductProperties,
buildTools: ProprietaryBuildTools,
) = runBlocking {
val buildContext = BuildContextImpl.createContext(
projectHome = homePath,
productProperties = productProperties,
proprietaryBuildTools = buildTools,
setupTracer = false,
options = createBuildOptionsForTest(productProperties = productProperties, homeDir = homePath)
)
val essentialPlugins = readXmlAsModel(buildContext.appInfoXml.toByteArray()).children.filter { it.name == "essential-plugin" }.mapNotNull { it.content }
val softly = SoftAssertions()
println("Essential plugins: ${essentialPlugins.joinToString(", ")}")
val pluginById = getPluginByIdMap(buildContext)
for (essentialPlugin in essentialPlugins) {
val essentialPluginDescription = pluginById[essentialPlugin]
if(essentialPluginDescription == null) continue
essentialPluginDescription.requiredDependencies.filter { it in pluginById }.forEach { requiredPlugin ->
println("$essentialPlugin depends on $requiredPlugin")
if (requiredPlugin !in essentialPlugins) {
softly.fail<Unit>("$essentialPlugin depends on non-essential plugin $requiredPlugin")
}
}
}
softly.assertAll()
}
private data class PluginDescription(
val pluginId: String,
val requiredDependencies: Set<String> = emptySet()
)
private fun getPluginByIdMap(context: BuildContext): Map<String, PluginDescription> {
val pluginMap = collectPluginDescriptors(
skipImplementationDetailPlugins = true, //it's not possible to disable implementation detail plugin
skipBundledPlugins = false,
honorCompatiblePluginsToIgnore = false,
context = context
)
val plugins = ArrayList<PluginDescription>()
for (plugin in pluginMap.values.toSet()) {
plugins.add(PluginDescription(pluginId = plugin.id, requiredDependencies = plugin.requiredDependencies))
}
return plugins.associateBy { it.pluginId }
}