From 330669bb22c3075c4b4b912a72800ebb4fa5258c Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Wed, 2 Sep 2020 18:07:50 +0200 Subject: [PATCH] NonBlockingReadActionImpl.waitForAsyncTaskCompletion: don't hang forever in dumb mode in tests GitOrigin-RevId: 9381545ea8199d1da001e26d1686569b19a4bd9a --- .../application/impl/NonBlockingReadActionImpl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java index aaa0389e574b..e1daa46805fe 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java @@ -594,6 +594,11 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { return ContainerUtil.find(myConstraints, t -> !t.isCorrectContext()); } + /** + * Waits and pumps UI events until all submitted non-blocking read actions have completed. But only if they have chance to: + * in dumb mode, submissions with {@link #inSmartMode} are ignored, because dumbness works differently in tests, + * and a test might never switch to the smart mode at all. + */ @TestOnly public static void waitForAsyncTaskCompletion() { assert !ApplicationManager.getApplication().isWriteAccessAllowed(); @@ -604,6 +609,12 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { @TestOnly private static void waitForTask(@NotNull Submission task) { + for (ContextConstraint constraint : task.builder.myConstraints) { + if (constraint instanceof InSmartMode && !constraint.isCorrectContext()) { + return; + } + } + int iteration = 0; while (!task.isDone() && iteration++ < 60_000) { UIUtil.dispatchAllInvocationEvents();