diff --git a/platform/platform-tests/testSrc/com/intellij/util/AlarmTest.java b/platform/platform-tests/testSrc/com/intellij/util/AlarmTest.java index bde2e349210f..f53953413f7b 100644 --- a/platform/platform-tests/testSrc/com/intellij/util/AlarmTest.java +++ b/platform/platform-tests/testSrc/com/intellij/util/AlarmTest.java @@ -34,7 +34,7 @@ package com.intellij.util; import java.util.stream.Collectors; import java.util.stream.Stream; -public class AlarmTest extends PlatformTestCase { + public class AlarmTest extends PlatformTestCase { public void testTwoAddsWithZeroDelayMustExecuteSequentially() throws Exception { Alarm alarm = new Alarm(getTestRootDisposable()); assertRequestsExecuteSequentially(alarm); @@ -85,37 +85,41 @@ public class AlarmTest extends PlatformTestCase { public void testOneAlarmDoesNotStartTooManyThreads() { Alarm alarm = new Alarm(getTestRootDisposable()); - Map before = Thread.getAllStackTraces(); AtomicInteger executed = new AtomicInteger(); int N = 100000; - for (int i = 0; i < N; i++) { - alarm.addRequest(executed::incrementAndGet, 10); - } - while (executed.get() != N) { - UIUtil.dispatchAllInvocationEvents(); - } + checkNotTooManyThreadsCreatedIn(()->{ + for (int i = 0; i < N; i++) { + alarm.addRequest(executed::incrementAndGet, 10); + } + while (executed.get() != N) { + UIUtil.dispatchAllInvocationEvents(); + } + }); + } + + private static void checkNotTooManyThreadsCreatedIn(Runnable runnable) { + Map before = Thread.getAllStackTraces(); + runnable.run(); Map after = Thread.getAllStackTraces(); Map> diff = new HashMap<>(); after.forEach((key, value) -> diff.put(key, Arrays.asList(value))); - before.keySet().forEach(diff::remove); + diff.keySet().removeAll(before.keySet()); if (!(after.size() - before.size() < 10)) { - fail("before: "+before.size()+"; after: "+after.size()+"Diff:\n"+diff); + fail("before: "+before.size()+"; after: "+after.size()+"; Diff:\n"+diff); } } public void testManyAlarmsDoNotStartTooManyThreads() { - Map before = Thread.getAllStackTraces(); - AtomicInteger executed = new AtomicInteger(); - int N = 100000; - List alarms = Stream.generate(() -> new Alarm(getTestRootDisposable())).limit(N).collect(Collectors.toList()); - alarms.forEach(alarm -> alarm.addRequest(executed::incrementAndGet, 10)); + checkNotTooManyThreadsCreatedIn(()->{ + AtomicInteger executed = new AtomicInteger(); + int N = 100000; + List alarms = Stream.generate(() -> new Alarm(getTestRootDisposable())).limit(N).collect(Collectors.toList()); + alarms.forEach(alarm -> alarm.addRequest(executed::incrementAndGet, 10)); - while (executed.get() != N) { - UIUtil.dispatchAllInvocationEvents(); - } - Map after = Thread.getAllStackTraces(); - LOG.debug("before: "+before.size()+"; after: "+after.size()); - assertTrue(after.size() - before.size() < 10); + while (executed.get() != N) { + UIUtil.dispatchAllInvocationEvents(); + } + }); } public void testOrderIsPreservedAfterModalitySwitching() {