From bf8c7075bc5b8ad04688bf700b068a3c6730107a Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 26 Mar 2018 13:03:03 +0300 Subject: [PATCH] Don't spam to error log from kapt3 successful tests --- .../kapt3/test/AbstractKotlinKapt3Test.kt | 105 ++++++++++-------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt index dec007ded39..b62f743d15c 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt @@ -23,7 +23,7 @@ import com.sun.tools.javac.comp.CompileStates import com.sun.tools.javac.tree.JCTree.JCCompilationUnit import com.sun.tools.javac.util.JCDiagnostic import com.sun.tools.javac.util.Log -import junit.framework.TestCase +import junit.framework.ComparisonFailure import org.jetbrains.kotlin.checkers.CheckerTestUtil import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector @@ -33,13 +33,9 @@ import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.codegen.CodegenTestFiles import org.jetbrains.kotlin.codegen.GenerationUtils import org.jetbrains.kotlin.codegen.state.GenerationState -import org.jetbrains.kotlin.kapt3.Kapt3BuilderFactory -import org.jetbrains.kotlin.kapt3.KaptContext -import org.jetbrains.kotlin.kapt3.doAnnotationProcessing +import org.jetbrains.kotlin.kapt3.* import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject import org.jetbrains.kotlin.kapt3.javac.KaptJavaLog -import org.jetbrains.kotlin.kapt3.parseJavaFiles -import org.jetbrains.kotlin.kapt3.prettyPrint import org.jetbrains.kotlin.kapt3.stubs.ClassFileToSourceStubConverter import org.jetbrains.kotlin.kapt3.util.KaptLogger import org.jetbrains.kotlin.psi.KtFile @@ -50,19 +46,30 @@ import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.util.trimTrailingWhitespacesAndAddNewlineAtEOF import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance +import java.io.ByteArrayOutputStream import java.io.File +import java.io.PrintStream import java.nio.file.Files import java.util.* import com.sun.tools.javac.util.List as JavacList + abstract class AbstractKotlinKapt3Test : CodegenTestCase() { companion object { - val FILE_SEPARATOR = "\n\n////////////////////\n\n" - val messageCollector = PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false) + const val FILE_SEPARATOR = "\n\n////////////////////\n\n" + val ERR_BYTE_STREAM = ByteArrayOutputStream() + private val ERR_PRINT_STREAM = PrintStream(ERR_BYTE_STREAM) + + val messageCollector = PrintingMessageCollector(ERR_PRINT_STREAM, MessageRenderer.PLAIN_FULL_PATHS, false) } private val tempFiles = mutableListOf() + override fun tearDown() { + ERR_BYTE_STREAM.reset() + super.tearDown() + } + private fun createTempFile(prefix: String, suffix: String, text: String): File { return File.createTempFile(prefix, suffix).apply { writeText(text) @@ -108,18 +115,18 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { val logger = KaptLogger(isVerbose = true, messageCollector = messageCollector) val javacOptions = wholeFile.getOptionValues("JAVAC_OPTION") - .map { opt -> - val (key, value) = opt.split('=').map { it.trim() }.also { assert(it.size == 2) } - key to value - }.toMap() + .map { opt -> + val (key, value) = opt.split('=').map { it.trim() }.also { assert(it.size == 2) } + key to value + }.toMap() val kaptContext = KaptContext(logger, generationState.project, generationState.bindingContext, classBuilderFactory.compiledClasses, - classBuilderFactory.origins, generationState, mapDiagnosticLocations = true, + classBuilderFactory.origins, generationState, mapDiagnosticLocations = true, processorOptions = emptyMap(), javacOptions = javacOptions) val javaFiles = files - .filter { it.name.toLowerCase().endsWith(".java") } - .map { createTempFile(it.name.substringBeforeLast('.'), ".java", it.content) } + .filter { it.name.toLowerCase().endsWith(".java") } + .map { createTempFile(it.name.substringBeforeLast('.'), ".java", it.content) } try { check(kaptContext, javaFiles, txtFile, wholeFile) @@ -134,10 +141,10 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { } protected fun convert( - kaptContext: KaptContext, - javaFiles: List, - generateNonExistentClass: Boolean, - correctErrorTypes: Boolean + kaptContext: KaptContext, + javaFiles: List, + generateNonExistentClass: Boolean, + correctErrorTypes: Boolean ): JavacList { val converter = ClassFileToSourceStubConverter(kaptContext, generateNonExistentClass, correctErrorTypes) @@ -181,9 +188,9 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { protected fun File.getOptionValues(name: String) = getRawOptionValues(name).map { it.drop("// ".length + name.length).trim() } protected abstract fun check( - kaptContext: KaptContext, - javaFiles: List, - txtFile: File, + kaptContext: KaptContext, + javaFiles: List, + txtFile: File, wholeFile: File) } @@ -225,44 +232,46 @@ open class AbstractClassFileToSourceStubConverterTest : AbstractKotlinKapt3Test( if (validate) kaptContext.compiler.enterTrees(convertedFiles) val actualRaw = convertedFiles - .sortedBy { it.sourceFile.name } - .joinToString(FILE_SEPARATOR) { it.prettyPrint(kaptContext.context) } + .sortedBy { it.sourceFile.name } + .joinToString(FILE_SEPARATOR) { it.prettyPrint(kaptContext.context) } val actual = StringUtil.convertLineSeparators(actualRaw.trim({ it <= ' ' })) - .trimTrailingWhitespacesAndAddNewlineAtEOF() - .let { removeMetadataAnnotationContents(it) } + .trimTrailingWhitespacesAndAddNewlineAtEOF() + .let { removeMetadataAnnotationContents(it) } if (kaptContext.compiler.shouldStop(CompileStates.CompileState.ENTER)) { val log = Log.instance(kaptContext.context) as KaptJavaLog val actualErrors = log.reportedDiagnostics - .filter { it.type == JCDiagnostic.DiagnosticType.ERROR } - .map { - // Unfortunately, we can't use the file name as it can contain temporary prefix - val name = it.source?.name?.substringAfterLast("/") ?: "" - val kind = when (name.substringAfterLast(".").toLowerCase()) { - "kt" -> "kotlin" - "java" -> "java" - else -> "other" - } - - val javaLocation = "($kind:${it.lineNumber}:${it.columnNumber}) " - javaLocation + it.getMessage(Locale.US).lines().first() + .filter { it.type == JCDiagnostic.DiagnosticType.ERROR } + .map { + // Unfortunately, we can't use the file name as it can contain temporary prefix + val name = it.source?.name?.substringAfterLast("/") ?: "" + val kind = when (name.substringAfterLast(".").toLowerCase()) { + "kt" -> "kotlin" + "java" -> "java" + else -> "other" } - .map { "// " + EXPECTED_ERROR + it } - .sorted() + + val javaLocation = "($kind:${it.lineNumber}:${it.columnNumber}) " + javaLocation + it.getMessage(Locale.US).lines().first() + } + .map { "// " + EXPECTED_ERROR + it } + .sorted() log.flush() val lineSeparator = System.getProperty("line.separator") - System.err.println(actualErrors.joinToString(lineSeparator)) + val actualErrorsStr = actualErrors.joinToString(lineSeparator) if (expectedErrors.isEmpty()) { - error("There were errors during analysis. See errors above. Stubs:\n\n$actual") + error("There were errors during analysis:\n$actualErrorsStr\n\nStubs:\n\n$actual") } else { - TestCase.assertEquals("Expected error matching failed", - expectedErrors.joinToString(lineSeparator), - actualErrors.joinToString(lineSeparator)) + val expectedErrorsStr = expectedErrors.joinToString(lineSeparator) + if (expectedErrorsStr != actualErrorsStr) { + System.err.println(ERR_BYTE_STREAM.toString("UTF8")) + throw ComparisonFailure("Expected error matching failed", expectedErrorsStr, actualErrorsStr) + } } } KotlinTestUtils.assertEqualsToFile(txtFile, actual) @@ -275,9 +284,9 @@ abstract class AbstractKotlinKaptContextTest : AbstractKotlinKapt3Test() { val sourceOutputDir = Files.createTempDirectory("kaptRunner").toFile() try { kaptContext.doAnnotationProcessing(emptyList(), listOf(JavaKaptContextTest.simpleProcessor()), - compileClasspath = PathUtil.getJdkClassesRootsFromCurrentJre() + PathUtil.kotlinPathsForIdeaPlugin.stdlibPath, - annotationProcessingClasspath = emptyList(), annotationProcessors = "", - sourcesOutputDir = sourceOutputDir, classesOutputDir = sourceOutputDir, + compileClasspath = PathUtil.getJdkClassesRootsFromCurrentJre() + PathUtil.kotlinPathsForIdeaPlugin.stdlibPath, + annotationProcessingClasspath = emptyList(), annotationProcessors = "", + sourcesOutputDir = sourceOutputDir, classesOutputDir = sourceOutputDir, additionalSources = compilationUnits, withJdk = true) val javaFiles = sourceOutputDir.walkTopDown().filter { it.isFile && it.extension == "java" }