a couple of tests proving that LaterInvocator.ensureFlushRequested is really needed

This commit is contained in:
peter
2016-12-06 14:49:56 +01:00
parent bd57faba6f
commit 7bda896e1b
@@ -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());
}
});
}
}