diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java index cf06d937edae..2397585bf476 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java @@ -198,7 +198,7 @@ public class TestDiscoveryExtension extends RunConfigurationExtension { discoveryIndex.updateFromTestTrace(testMethodTrace, moduleName, frameworkPrefix); FileUtil.delete(testMethodTrace); } - catch (IOException e) { + catch (Throwable e) { LOG.error("Can not load " + testMethodTrace, e); } } diff --git a/platform/testFramework/src/com/intellij/InternalTestDiscoveryListener.java b/platform/testFramework/src/com/intellij/InternalTestDiscoveryListener.java index 1e9d39bc9b18..62a94b2866bf 100644 --- a/platform/testFramework/src/com/intellij/InternalTestDiscoveryListener.java +++ b/platform/testFramework/src/com/intellij/InternalTestDiscoveryListener.java @@ -18,17 +18,22 @@ package com.intellij; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.Alarm; import com.intellij.util.ArrayUtil; +import com.intellij.util.io.ZipUtil; import junit.framework.AssertionFailedError; import junit.framework.Test; import junit.framework.TestListener; import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; +import java.util.zip.ZipOutputStream; /** * Used in TestAll to collect data in command line @@ -87,26 +92,27 @@ public class InternalTestDiscoveryListener implements TestListener, Closeable { myCompletedMethodNames.add("j" + className + "." + methodName); if (myCompletedMethodNames.size() > 50) { - flushCurrentTraces(); + final String[] fullTestNames = ArrayUtil.toStringArray(myCompletedMethodNames); + myCompletedMethodNames.clear(); + myProcessTracesAlarm.addRequest(() -> { + flushCurrentTraces(fullTestNames); + }, 0); } } - protected void flushCurrentTraces() { - final String[] fullTestNames = ArrayUtil.toStringArray(myCompletedMethodNames); - myCompletedMethodNames.clear(); - myProcessTracesAlarm.addRequest(() -> { - System.out.println("Start compacting to index"); - try { - final Object index = getIndex(); - final Method method = Class.forName("com.intellij.execution.testDiscovery.TestDiscoveryExtension") - .getMethod("processAvailableTraces", fullTestNames.getClass(), myTracesDirectory.getClass(), String.class, String.class, myDiscoveryIndexClass); - method.invoke(null, fullTestNames, myTracesDirectory, myModuleName, "j", index); - System.out.println("Compacting done."); - } - catch (Throwable e) { - e.printStackTrace(); - } - }, 100); + protected void flushCurrentTraces(final String[] fullTestNames) { + System.out.println("Start compacting to index"); + try { + final Object index = getIndex(); + final Method method = Class.forName("com.intellij.execution.testDiscovery.TestDiscoveryExtension") + .getMethod("processAvailableTraces", fullTestNames.getClass(), myTracesDirectory.getClass(), String.class, String.class, + myDiscoveryIndexClass); + method.invoke(null, fullTestNames, myTracesDirectory, myModuleName, "j", index); + System.out.println("Compacting done."); + } + catch (Throwable e) { + e.printStackTrace(); + } } private static String getMethodName(Test test) { @@ -140,10 +146,34 @@ public class InternalTestDiscoveryListener implements TestListener, Closeable { @Override public void close() throws IOException { - myProcessTracesAlarm.cancelAllRequests(); + final String[] fullTestNames = ArrayUtil.toStringArray(myCompletedMethodNames); + myCompletedMethodNames.clear(); + flushCurrentTraces(fullTestNames); + zipOutput(myTracesDirectory); myProcessTracesAlarm.addRequest(() -> { - flushCurrentTraces(); Disposer.dispose(myProcessTracesAlarm); }, 0); } + + private static void zipOutput(String tracesDirectory) { + final File[] files = new File(tracesDirectory).listFiles(); + if (files == null) { + System.out.println("No traces found."); + return; + } + System.out.println("Preparing zip."); + try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(tracesDirectory + File.separator + "out.zip"))) { + for (File file : files) { + ZipUtil.addFileToZip(zipOutputStream, file, "/" + file.getName(), null, null); + } + System.out.println("Zip prepared."); + + for (File file : files) { + FileUtil.delete(file); + } + } + catch (Throwable ex) { + ex.printStackTrace(); + } + } }