From 748789c7299ee47b28032bdaab5859b164eba4f3 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 28 Sep 2018 15:27:12 +0300 Subject: [PATCH] tests: print debug log from build process This will help to investigate in case of test failures. --- .../compiler/server/BuildManager.java | 2 +- .../compiler/BaseCompilerTestCase.java | 28 +++++++---- .../intellij.java.testFramework.iml | 1 + .../testFramework/CompilerTester.java | 47 ++++++++++++++++++- .../org/jetbrains/jps/cmdline/LogSetup.java | 9 ++-- 5 files changed, 71 insertions(+), 16 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java index f9783293dce4..6c7d1398012c 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/BuildManager.java @@ -1314,7 +1314,7 @@ public class BuildManager implements Disposable { } @NotNull - private File getBuildLogDirectory() { + public static File getBuildLogDirectory() { return new File(PathManager.getLogPath(), "build-log"); } diff --git a/java/compiler/tests/com/intellij/compiler/BaseCompilerTestCase.java b/java/compiler/tests/com/intellij/compiler/BaseCompilerTestCase.java index 665146b5668a..fb9f594aea46 100644 --- a/java/compiler/tests/com/intellij/compiler/BaseCompilerTestCase.java +++ b/java/compiler/tests/com/intellij/compiler/BaseCompilerTestCase.java @@ -23,10 +23,7 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.packaging.artifacts.Artifact; import com.intellij.packaging.artifacts.ArtifactManager; import com.intellij.packaging.impl.compiler.ArtifactCompileScope; -import com.intellij.testFramework.ModuleTestCase; -import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.testFramework.PsiTestUtil; -import com.intellij.testFramework.VfsTestUtil; +import com.intellij.testFramework.*; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.io.TestFileSystemBuilder; import com.intellij.util.ui.UIUtil; @@ -250,20 +247,31 @@ public abstract class BaseCompilerTestCase extends ModuleTestCase { }; PlatformTestUtil.saveProject(myProject); CompilerTestUtil.saveApplicationSettings(); + try { + CompilerTester.enableDebugLogging(); + } + catch (IOException e) { + throw new RuntimeException(e); + } action.accept(callback); }); - final long start = System.currentTimeMillis(); - while (!semaphore.waitFor(10)) { - if (System.currentTimeMillis() - start > 5 * 60 * 1000) { - throw new RuntimeException("timeout"); + try { + final long start = System.currentTimeMillis(); + while (!semaphore.waitFor(10)) { + if (System.currentTimeMillis() - start > 50 * 60 * 1000) { + throw new RuntimeException("timeout"); + } + if (SwingUtilities.isEventDispatchThread()) { + UIUtil.dispatchAllInvocationEvents(); + } } if (SwingUtilities.isEventDispatchThread()) { UIUtil.dispatchAllInvocationEvents(); } } - if (SwingUtilities.isEventDispatchThread()) { - UIUtil.dispatchAllInvocationEvents(); + finally { + CompilerTester.printBuildLog(); } return result.get(); diff --git a/java/testFramework/intellij.java.testFramework.iml b/java/testFramework/intellij.java.testFramework.iml index d9d52c0e1680..6aad792c5864 100644 --- a/java/testFramework/intellij.java.testFramework.iml +++ b/java/testFramework/intellij.java.testFramework.iml @@ -25,6 +25,7 @@ + diff --git a/java/testFramework/src/com/intellij/testFramework/CompilerTester.java b/java/testFramework/src/com/intellij/testFramework/CompilerTester.java index 3773b8ae922c..89d55dea89c1 100644 --- a/java/testFramework/src/com/intellij/testFramework/CompilerTester.java +++ b/java/testFramework/src/com/intellij/testFramework/CompilerTester.java @@ -3,6 +3,7 @@ package com.intellij.testFramework; import com.intellij.compiler.CompilerManagerImpl; import com.intellij.compiler.CompilerTestUtil; +import com.intellij.compiler.server.BuildManager; import com.intellij.diagnostic.ThreadDumper; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.PathMacros; @@ -21,6 +22,7 @@ import com.intellij.openapi.roots.CompilerProjectExtension; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VfsUtilCore; @@ -40,12 +42,12 @@ import com.intellij.util.io.FileTreePrinterKt; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.cmdline.LogSetup; import org.jetbrains.jps.model.serialization.JpsGlobalLoader; import org.junit.Assert; import javax.swing.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -221,6 +223,7 @@ public class CompilerTester { } } } + enableDebugLogging(); runnable.consume(callback); }); @@ -232,6 +235,7 @@ public class CompilerTester { } } + printBuildLog(); callback.throwException(); if (!((CompilerManagerImpl)CompilerManager.getInstance(getProject())).waitForExternalJavacToTerminate(1, TimeUnit.MINUTES)) { @@ -241,6 +245,45 @@ public class CompilerTester { return callback.getMessages(); } + public static void printBuildLog() { + File logDirectory = BuildManager.getBuildLogDirectory(); + File[] files = logDirectory.listFiles(file -> file.getName().endsWith(".log")); + if (files == null || files.length == 0) { + LOG.debug("No *.log files in " + logDirectory + " after build"); + return; + } + + Arrays.sort(files, Comparator.comparing(File::getName)); + for (File file : files) { + LOG.debug(file.getName() + ":"); + try { + List lines = FileUtil.loadLines(file); + for (String line : lines) { + LOG.debug(line); + } + } + catch (IOException e) { + LOG.debug("Failed to load contents: " + e.getMessage()); + } + } + } + + public static void enableDebugLogging() throws IOException { + File logDirectory = BuildManager.getBuildLogDirectory(); + FileUtil.delete(logDirectory); + FileUtil.createDirectory(logDirectory); + Properties properties = new Properties(); + try (InputStream config = LogSetup.readDefaultLogConfig()) { + properties.load(config); + } + + properties.setProperty("log4j.rootLogger", "debug, file"); + File logFile = new File(logDirectory, LogSetup.LOG_CONFIG_FILE_NAME); + try (OutputStream output = new BufferedOutputStream(new FileOutputStream(logFile))) { + properties.store(output, null); + } + } + private static void refreshVfs(String path) { VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(path)); if (vFile != null) { diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/LogSetup.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/LogSetup.java index 5aa940f5c48f..dbba1d9832a4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/LogSetup.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/LogSetup.java @@ -32,9 +32,8 @@ import java.nio.charset.StandardCharsets; */ public class LogSetup { - private static final String LOG_CONFIG_FILE_NAME = "build-log.properties"; + public static final String LOG_CONFIG_FILE_NAME = "build-log.properties"; private static final String LOG_FILE_NAME = "build.log"; - private static final String DEFAULT_LOGGER_CONFIG = "defaultLogConfig.properties"; private static final String LOG_FILE_MACRO = "$LOG_FILE_PATH$"; public static void initLoggers() { @@ -64,7 +63,7 @@ public class LogSetup { private static void ensureLogConfigExists(final File logConfig) throws IOException { if (!logConfig.exists()) { FileUtil.createIfDoesntExist(logConfig); - try(InputStream in = LogSetup.class.getResourceAsStream("/" + DEFAULT_LOGGER_CONFIG)) { + try(InputStream in = readDefaultLogConfig()) { if (in != null) { try (FileOutputStream out = new FileOutputStream(logConfig)) { FileUtil.copy(in, out); @@ -74,6 +73,10 @@ public class LogSetup { } } + public static InputStream readDefaultLogConfig() { + return LogSetup.class.getResourceAsStream("/defaultLogConfig.properties"); + } + private static class MyLoggerFactory implements Logger.Factory { @NotNull @Override