diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java index c8902987347c..cdf4f4b21ede 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java @@ -15,10 +15,12 @@ */ package com.intellij.openapi.application.impl; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Conditions; +import com.intellij.openapi.util.EmptyRunnable; import com.intellij.testFramework.LoggedErrorProcessor; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.SkipInHeadlessEnvironment; @@ -34,6 +36,7 @@ import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; @SuppressWarnings({"SSBasedInspection", "SynchronizeOnThis"}) @SkipInHeadlessEnvironment @@ -577,4 +580,33 @@ public class LaterInvocatorTest extends PlatformTestCase { assertTrue(e.getMessage(), e.getMessage().contains("Access is allowed from event dispatch thread only")); } } + + public void testDispatchInvocationEventsWorksForJustSubmitted() { + Application app = ApplicationManager.getApplication(); + app.invokeAndWait(() -> { + app.invokeLater(() -> { + myOrder.add("1"); + assertOrderedEquals(myOrder, "1"); + UIUtil.dispatchAllInvocationEvents(); + assertOrderedEquals(myOrder, "1", "2"); + }); + app.invokeLater(new MyRunnable("2")); + UIUtil.dispatchAllInvocationEvents(); + }); + assertOrderedEquals(myOrder, "1", "2"); + } + + public void testDispatchInvocationEventsVsInvokeLaterFromBgThreadRace() { + Application app = ApplicationManager.getApplication(); + app.invokeAndWait(() -> { + for (int i = 0; i < 1000; i++) { + AtomicBoolean executed = new AtomicBoolean(); + app.executeOnPooledThread(() -> app.invokeLater(EmptyRunnable.INSTANCE)); + app.invokeLater(() -> executed.set(true)); + UIUtil.dispatchAllInvocationEvents(); + assertTrue(executed.get()); + } + }); + + } }