[workspace model] IDEA-341372 Turn off global entities serialization in unit tests

We leave serialization only for compilation tests

GitOrigin-RevId: 427f5f5bcf73eeca5a5ee6d84b7dda013a021074
This commit is contained in:
Mikhail Mazurkevich
2024-01-17 12:34:16 +04:00
committed by intellij-monorepo-bot
parent e258580a35
commit bcc0a59478
4 changed files with 43 additions and 29 deletions

View File

@@ -85,6 +85,7 @@ public final class CompilerTestUtil {
}
BuildManager.getInstance().clearState(project);
});
saveApplicationSettings();
});
}

View File

@@ -117,7 +117,7 @@ class SdkTableBridgeImpl: SdkTableImplementationDelegate {
@Suppress("RAW_RUN_BLOCKING")
override fun saveOnDisk() {
runBlocking {
(JpsGlobalModelSynchronizer.getInstance() as JpsGlobalModelSynchronizerImpl).saveGlobalEntities()
(JpsGlobalModelSynchronizer.getInstance() as JpsGlobalModelSynchronizerImpl).saveSdkEntities()
}
}
}

View File

@@ -51,7 +51,7 @@ import kotlin.time.Duration.Companion.seconds
*/
class JpsGlobalModelSynchronizerImpl(private val coroutineScope: CoroutineScope) : JpsGlobalModelSynchronizer {
private var loadedFromDisk: Boolean = false
private val isLibSerializationProhibited: Boolean
private val isSerializationProhibited: Boolean
get() = !forceEnableLoading && ApplicationManager.getApplication().isUnitTestMode
override fun loadInitialState(mutableStorage: MutableEntityStorage, initialEntityStorage: VersionedEntityStorage,
@@ -76,28 +76,44 @@ class JpsGlobalModelSynchronizerImpl(private val coroutineScope: CoroutineScope)
val contentWriter = (ApplicationManager.getApplication().stateStore as ApplicationStoreJpsContentReader).createContentWriter()
val entityStorage = GlobalWorkspaceModel.getInstance().entityStorage.current
serializers.forEach { serializer ->
val entities = entityStorage.entities(serializer.mainEntityClass).toList()
LOG.info("Saving global entities ${serializer.mainEntityClass.name} to files")
val filteredEntities = if (serializer.mainEntityClass == LibraryEntity::class.java) {
// We need to filter custom libraries, they will be serialized by the client code and not by the platform
entities.filter { it.entitySource is JpsGlobalFileEntitySource }
} else entities
if (serializer.mainEntityClass == SdkEntity::class.java) {
assertUnexpectedAdditionalDataModification(entityStorage)
}
if (filteredEntities.isEmpty()) {
// Remove empty files
serializer.deleteObsoleteFile(serializer.fileUrl.url, contentWriter)
} else {
serializer.saveEntities(filteredEntities, emptyMap(), entityStorage, contentWriter)
}
serializeEntities(entityStorage, serializer, contentWriter)
}
contentWriter.saveSession()
}
@TestOnly
suspend fun saveSdkEntities() {
val sortedRootTypes = OrderRootType.getSortedRootTypes().mapNotNull { it.sdkRootName }
val sdkSerializer = JpsGlobalEntitiesSerializers.createSdkSerializer(VirtualFileUrlManager.getGlobalInstance(), sortedRootTypes) as JpsFileEntityTypeSerializer<WorkspaceEntity>
val contentWriter = (ApplicationManager.getApplication().stateStore as ApplicationStoreJpsContentReader).createContentWriter()
val entityStorage = GlobalWorkspaceModel.getInstance().entityStorage.current
serializeEntities(entityStorage, sdkSerializer, contentWriter)
contentWriter.saveSession()
}
private fun serializeEntities(entityStorage: EntityStorage, serializer: JpsFileEntityTypeSerializer<WorkspaceEntity>,
contentWriter: JpsAppFileContentWriter) {
val entities = entityStorage.entities(serializer.mainEntityClass).toList()
LOG.info("Saving global entities ${serializer.mainEntityClass.name} to files")
val filteredEntities = if (serializer.mainEntityClass == LibraryEntity::class.java) {
// We need to filter custom libraries, they will be serialized by the client code and not by the platform
entities.filter { it.entitySource is JpsGlobalFileEntitySource }
} else entities
if (serializer.mainEntityClass == SdkEntity::class.java) {
assertUnexpectedAdditionalDataModification(entityStorage)
}
if (filteredEntities.isEmpty()) {
// Remove empty files
serializer.deleteObsoleteFile(serializer.fileUrl.url, contentWriter)
} else {
serializer.saveEntities(filteredEntities, emptyMap(), entityStorage, contentWriter)
}
}
private fun assertUnexpectedAdditionalDataModification(entityStorage: EntityStorage) {
entityStorage.entities(SdkEntity::class.java).forEach { sdkEntity ->
val projectJdkImpl = entityStorage.sdkMap.getDataByEntity(sdkEntity) ?: error(
@@ -160,10 +176,10 @@ class JpsGlobalModelSynchronizerImpl(private val coroutineScope: CoroutineScope)
}
private fun createSerializers(): List<JpsFileEntityTypeSerializer<WorkspaceEntity>> {
if (isSerializationProhibited) return emptyList()
val sortedRootTypes = OrderRootType.getSortedRootTypes().mapNotNull { it.sdkRootName }
return JpsGlobalEntitiesSerializers.createApplicationSerializers(VirtualFileUrlManager.getGlobalInstance(),
sortedRootTypes,
!isLibSerializationProhibited)
sortedRootTypes)
}
private fun bridgesInitializationCallback(mutableStorage: MutableEntityStorage,

View File

@@ -14,18 +14,15 @@ object JpsGlobalEntitiesSerializers {
private val isSdkBridgeEnabled: Boolean = Registry.`is`("workspace.model.global.sdk.bridge", true)
fun createApplicationSerializers(virtualFileUrlManager: VirtualFileUrlManager,
sortedRootTypes: List<String>,
createLibSerializer: Boolean): List<JpsFileEntityTypeSerializer<WorkspaceEntity>> {
sortedRootTypes: List<String>): List<JpsFileEntityTypeSerializer<WorkspaceEntity>> {
val serializers = mutableListOf<JpsFileEntityTypeSerializer<WorkspaceEntity>>()
if (isSdkBridgeEnabled) {
serializers.add(createSdkSerializer(virtualFileUrlManager, sortedRootTypes) as JpsFileEntityTypeSerializer<WorkspaceEntity>)
}
if (createLibSerializer) {
val globalLibrariesFile = virtualFileUrlManager.fromUrl(PathManager.getOptionsFile(GLOBAL_LIBRARIES_FILE_NAME).absolutePath)
val globalLibrariesEntitySource = JpsGlobalFileEntitySource(globalLibrariesFile)
serializers.add(JpsGlobalLibrariesFileSerializer(globalLibrariesEntitySource) as JpsFileEntityTypeSerializer<WorkspaceEntity>)
}
val globalLibrariesFile = virtualFileUrlManager.fromUrl(PathManager.getOptionsFile(GLOBAL_LIBRARIES_FILE_NAME).absolutePath)
val globalLibrariesEntitySource = JpsGlobalFileEntitySource(globalLibrariesFile)
serializers.add(JpsGlobalLibrariesFileSerializer(globalLibrariesEntitySource) as JpsFileEntityTypeSerializer<WorkspaceEntity>)
return serializers
}