From 06284f3fa54d7c2c8f5a81f6edba37a39a3a2d34 Mon Sep 17 00:00:00 2001 From: Sergei Vorobyov Date: Wed, 2 Dec 2020 13:37:18 +0300 Subject: [PATCH] IJ-CR-4284 added quick test completion on import failure GitOrigin-RevId: d0cdd1ea2c9abf6a87662032ab03500be0541b91 --- .../gradle/util/GradleImportingTestUtil.kt | 58 +++++++++++++------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/GradleImportingTestUtil.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/GradleImportingTestUtil.kt index 2698fb4e272c..3f4b8203e7df 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/GradleImportingTestUtil.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/util/GradleImportingTestUtil.kt @@ -18,6 +18,7 @@ import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.ThrowableComputable import com.intellij.testFramework.PlatformTestUtil import org.jetbrains.concurrency.AsyncPromise +import org.jetbrains.concurrency.Promise import java.util.concurrent.TimeUnit @@ -27,10 +28,7 @@ import java.util.concurrent.TimeUnit * @throws java.lang.AssertionError if import is failed or isn't started */ fun waitForProjectReload(action: ThrowableComputable): R { - val promise = AsyncPromise() - whenProjectDataLoaded { - promise.setResult(null) - } + val promise = getProjectDataLoadPromise() val result = action.compute() invokeAndWaitIfNeeded { PlatformTestUtil.waitForPromise(promise, TimeUnit.MINUTES.toMillis(1)) @@ -59,34 +57,56 @@ fun whenResolveTaskStarted(action: () -> Unit, parentDisposable: Disposable) { }, parentDisposable) } -fun whenResolveTaskFinished(action: (Project) -> Unit) { +private fun getProjectDataLoadPromise(): Promise { + return getResolveTaskFinishPromise() + .thenAsync(::getProjectDataLoadPromise) +} + +private fun getResolveTaskFinishPromise(): Promise { + val promise = AsyncPromise() val parentDisposable = Disposer.newDisposable() ExternalSystemProgressNotificationManager.getInstance() .addNotificationListener(object : ExternalSystemTaskNotificationListenerAdapter() { override fun onSuccess(id: ExternalSystemTaskId) { if (isResolveTask(id)) { Disposer.dispose(parentDisposable) - action(id.findProject()!!) + promise.setResult(id.findProject()!!) + } + } + + override fun onFailure(id: ExternalSystemTaskId, e: Exception) { + if (isResolveTask(id)) { + Disposer.dispose(parentDisposable) + promise.setError(e) + } + } + + override fun onCancel(id: ExternalSystemTaskId) { + if (isResolveTask(id)) { + Disposer.dispose(parentDisposable) + promise.cancel() } } }, parentDisposable) + return promise } -fun whenProjectDataLoaded(action: () -> Unit) { - whenResolveTaskFinished { project -> - whenProjectDataLoaded(project) { - action() - } - } -} - -private fun whenProjectDataLoaded(project: Project, action: () -> Unit) { +private fun getProjectDataLoadPromise(project: Project): Promise { + val promise = AsyncPromise() val parentDisposable = Disposer.newDisposable() val connection = project.messageBus.connect(parentDisposable) - connection.subscribe(ProjectDataImportListener.TOPIC, ProjectDataImportListener { - Disposer.dispose(parentDisposable) - invokeLater { - action() + connection.subscribe(ProjectDataImportListener.TOPIC, object : ProjectDataImportListener { + override fun onImportFinished(projectPath: String?) { + Disposer.dispose(parentDisposable) + invokeLater { + promise.setResult(project) + } + } + + override fun onImportFailed(projectPath: String?) { + Disposer.dispose(parentDisposable) + promise.setError("Import failed for $projectPath") } }) + return promise } \ No newline at end of file