From 90e6f37f08e7f7d1433b4211a3deed9b45cc0bcf Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Fri, 28 Mar 2025 17:16:27 +0100 Subject: [PATCH] [TestFramework] IJ-CR-159827 fix: move ListenerAssertion from the external system to the platform test framework (cherry picked from commit 79011bc79b63fef6f25bdb55948b0277493cdc17) GitOrigin-RevId: a3a6b1dd4a752c910e073a3689373257e238edba --- .../service/AbstractExternalSystemTaskTest.kt | 2 +- .../project/configuration/ProjectConfiguration.kt | 12 ++++++++---- .../listenerAssertion}/ListenerAssertion.kt | 4 ++-- .../GradleContentRootSyncContributorTest.kt | 2 +- .../importing/syncAction/GradlePartialSyncTest.kt | 2 +- .../importing/syncAction/GradlePhasedSyncTest.kt | 2 +- .../GradleProjectRootSyncContributorTest.kt | 2 +- .../GradleSourceRootSyncContributorTest.kt | 2 +- .../idea/maven/tasks/MavenShortcutsManager.java | 3 ++- 9 files changed, 18 insertions(+), 13 deletions(-) rename platform/{external-system-impl/testSrc/com/intellij/openapi/externalSystem/util => testFramework/src/com/intellij/platform/testFramework/assertion/listenerAssertion}/ListenerAssertion.kt (92%) diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/AbstractExternalSystemTaskTest.kt b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/AbstractExternalSystemTaskTest.kt index 15cc49774b57..ab13f87af96e 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/AbstractExternalSystemTaskTest.kt +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/AbstractExternalSystemTaskTest.kt @@ -2,7 +2,7 @@ package com.intellij.openapi.externalSystem.service import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskState -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.progress.ProcessCanceledException class AbstractExternalSystemTaskTest : AbstractExternalSystemTaskTestCase() { diff --git a/platform/platform-impl/src/com/intellij/openapi/project/configuration/ProjectConfiguration.kt b/platform/platform-impl/src/com/intellij/openapi/project/configuration/ProjectConfiguration.kt index a5f271944579..32cdf2db94e0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/configuration/ProjectConfiguration.kt +++ b/platform/platform-impl/src/com/intellij/openapi/project/configuration/ProjectConfiguration.kt @@ -71,17 +71,21 @@ private fun CoroutineScope.getConfigurationDeferred(project: Project, callback: // we perform several phases of awaiting here, // because we need to be prepared for idempotent side effects from saving return async { - while (true) { + // Ideally, we should do `while (true)` here to converge the process of configuration. + // However, some clients (maven) schedule MergingUpdateQueue updates during save, which leads to infinite configuration, + // as we think that MUQ updates may modify the state. + // So instead we just invoke the save process at least 3 times, hoping that everyone manages to finalize their state by this moment + repeat(3) { phaseNum -> val wasModified = Observation.awaitConfiguration(project, callback) if (wasModified) { saveSettings(componentManager = ApplicationManager.getApplication(), forceSavingAllSettings = true) saveProjectsAndApp(forceSavingAllSettings = true, onlyProject = project) - callback?.invoke("Configuration phase is completed. Initiating another phase to cover possible side effects...") // NON-NLS + callback?.invoke("Configuration phase $phaseNum is completed. Initiating another phase to cover possible side effects...") // NON-NLS } else { - callback?.invoke("All configuration phases are completed.") // NON-NLS - break + return@repeat } + callback?.invoke("All configuration phases are completed.") // NON-NLS } } } diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/util/ListenerAssertion.kt b/platform/testFramework/src/com/intellij/platform/testFramework/assertion/listenerAssertion/ListenerAssertion.kt similarity index 92% rename from platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/util/ListenerAssertion.kt rename to platform/testFramework/src/com/intellij/platform/testFramework/assertion/listenerAssertion/ListenerAssertion.kt index 4624ca6e9c20..4b5e756dddf5 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/util/ListenerAssertion.kt +++ b/platform/testFramework/src/com/intellij/platform/testFramework/assertion/listenerAssertion/ListenerAssertion.kt @@ -1,5 +1,5 @@ -// 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.openapi.externalSystem.util +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.platform.testFramework.assertion.listenerAssertion import org.junit.jupiter.api.Assertions import org.opentest4j.AssertionFailedError diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleContentRootSyncContributorTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleContentRootSyncContributorTest.kt index c30a79a26be2..5af8c7842067 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleContentRootSyncContributorTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleContentRootSyncContributorTest.kt @@ -2,7 +2,7 @@ package org.jetbrains.plugins.gradle.importing.syncAction import com.intellij.gradle.toolingExtension.modelAction.GradleModelFetchPhase -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.use import com.intellij.platform.backend.workspace.workspaceModel diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePartialSyncTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePartialSyncTest.kt index 58af1db2a699..54b08d2b48e5 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePartialSyncTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePartialSyncTest.kt @@ -1,7 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.gradle.importing.syncAction -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.use import org.jetbrains.plugins.gradle.importing.TestModel diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePhasedSyncTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePhasedSyncTest.kt index 9166f47c95f9..1c57f688f145 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePhasedSyncTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradlePhasedSyncTest.kt @@ -2,7 +2,7 @@ package org.jetbrains.plugins.gradle.importing.syncAction import com.intellij.gradle.toolingExtension.modelAction.GradleModelFetchPhase -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.observable.operation.OperationExecutionStatus import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.util.Disposer diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleProjectRootSyncContributorTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleProjectRootSyncContributorTest.kt index 53b2e262109b..913ea127dcb8 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleProjectRootSyncContributorTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleProjectRootSyncContributorTest.kt @@ -1,7 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.gradle.importing.syncAction -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.externalSystem.util.ExternalSystemUtil import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.io.getResolvedPath diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleSourceRootSyncContributorTest.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleSourceRootSyncContributorTest.kt index acdeb5e8d4a0..d1b0beb91628 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleSourceRootSyncContributorTest.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/syncAction/GradleSourceRootSyncContributorTest.kt @@ -3,7 +3,7 @@ package org.jetbrains.plugins.gradle.importing.syncAction import com.intellij.gradle.toolingExtension.modelAction.GradleModelFetchPhase import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType -import com.intellij.openapi.externalSystem.util.ListenerAssertion +import com.intellij.platform.testFramework.assertion.listenerAssertion.ListenerAssertion import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.use import com.intellij.platform.backend.workspace.workspaceModel diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java index f6e09d31cf26..9a987b2d34ac 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/tasks/MavenShortcutsManager.java @@ -15,6 +15,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.DisposableWrapperList; import com.intellij.util.messages.MessageBusConnection; +import com.intellij.util.ui.update.MergingQueueUtil; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import org.jetbrains.annotations.NonNls; @@ -183,7 +184,7 @@ public final class MavenShortcutsManager implements Disposable { } } - myUpdateQueue.queue(new Update(MavenShortcutsManager.this) { + MergingQueueUtil.queueTracked(myUpdateQueue, new Update(MavenShortcutsManager.this) { @Override public void run() { List projectToUpdate;