From 6e4f6bbaacfd705e10b19a1a96deb6972967c519 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 28 Sep 2016 15:23:47 +0200 Subject: [PATCH] ensure test output appears in the console: ensure order: first clear the old output, then print current output --- .../sm/runner/SMTRunnerConsoleTest.java | 19 +++++++++++++++++++ .../testframework/CompositePrintable.java | 6 ++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java index 4a638a9149c8..39f324d601f4 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTRunnerConsoleTest.java @@ -17,6 +17,7 @@ package com.intellij.execution.testframework.sm.runner; import com.intellij.execution.process.ProcessOutputTypes; import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.testframework.CompositePrintable; import com.intellij.execution.testframework.Printable; import com.intellij.execution.testframework.Printer; import com.intellij.execution.testframework.TestConsoleProperties; @@ -27,6 +28,8 @@ import com.intellij.execution.testframework.sm.runner.ui.SMTestRunnerResultsForm import com.intellij.execution.testframework.ui.TestsOutputConsolePrinter; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.util.Disposer; +import com.intellij.psi.impl.DebugUtil; +import com.intellij.util.concurrency.Semaphore; import org.jetbrains.annotations.NotNull; /** @@ -536,6 +539,22 @@ public class SMTRunnerConsoleTest extends BaseSMTRunnerTestCase { assertAllOutputs(myMockResettablePrinter, "preved", "","Empty test suite.\n"); } + public void testEnsureOrderedClearFlush() throws Exception { + StringBuffer buf = new StringBuffer(); + String expected = ""; + for(int i = 0; i < 100; i++) { + expected += "1" ; + expected += "2" ; + CompositePrintable.invokeInAlarm(() -> buf.append("1"), false); + CompositePrintable.invokeInAlarm(() -> buf.append("2"), false); + } + Semaphore s = new Semaphore(); + s.down(); + CompositePrintable.invokeInAlarm(s::up, false); + assertTrue(s.waitFor(1000)); + assertEquals(expected, buf.toString()); + } + @NotNull private SMTestProxy startTestWithPrinter(final String testName) { myEventsProcessor.onTestStarted(new TestStartedEvent(testName, null)); diff --git a/platform/testRunner/src/com/intellij/execution/testframework/CompositePrintable.java b/platform/testRunner/src/com/intellij/execution/testframework/CompositePrintable.java index 46e5fa6c2800..9b4a7b04720e 100644 --- a/platform/testRunner/src/com/intellij/execution/testframework/CompositePrintable.java +++ b/platform/testRunner/src/com/intellij/execution/testframework/CompositePrintable.java @@ -31,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; public class CompositePrintable implements Printable, Disposable { public static final String NEW_LINE = "\n"; @@ -41,6 +42,7 @@ public class CompositePrintable implements Printable, Disposable { private int myCurrentSize = 0; private String myOutputFile = null; private String myFrameworkOutputFile; + private static final ExecutorService ourTestExecutorService = AppExecutorUtil.createBoundedApplicationPoolExecutor("tests", 1); public void flush() { synchronized (myNestedPrintables) { @@ -65,7 +67,7 @@ public class CompositePrintable implements Printable, Disposable { if (sync) { runnable.run(); } else { - AppExecutorUtil.getAppExecutorService().execute(runnable); + ourTestExecutorService.execute(runnable); } } @@ -140,7 +142,7 @@ public class CompositePrintable implements Printable, Disposable { public void setOutputFilePath(String outputFile) { myOutputFile = outputFile; } - + public void setFrameworkOutputFile(String frameworkOutputFile) { myFrameworkOutputFile = frameworkOutputFile; }