From 5bc13aa57165fe83a88c71a8b3ced7c23a9be554 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 16 Feb 2016 16:13:42 +0300 Subject: [PATCH] Build incremental testing utils to kotlin-build-common-test.jar KT-8487 Original commit: 7a7562d6856f8d8d5d7f6594ff65ff1e94c2cdcf --- .../kannotator-jps-plugin-test.iml | 5 +- .../build/kannotator/KannotatorJpsTest.java | 2 +- .../jps/build/AbstractIncrementalJpsTest.kt | 6 +- .../classFilesComparison.kt | 178 ------------------ 4 files changed, 5 insertions(+), 186 deletions(-) delete mode 100644 jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt diff --git a/jps/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml b/jps/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml index e99b5a3918b..a6a5f690c4a 100644 --- a/jps/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml +++ b/jps/jps-plugin/kannotator-jps-plugin-test/kannotator-jps-plugin-test.iml @@ -7,10 +7,11 @@ + + - - + \ No newline at end of file diff --git a/jps/jps-plugin/kannotator-jps-plugin-test/test/org/jetbrains/kotlin/jps/build/kannotator/KannotatorJpsTest.java b/jps/jps-plugin/kannotator-jps-plugin-test/test/org/jetbrains/kotlin/jps/build/kannotator/KannotatorJpsTest.java index ea0dbc4c9f5..39c0146cdca 100644 --- a/jps/jps-plugin/kannotator-jps-plugin-test/test/org/jetbrains/kotlin/jps/build/kannotator/KannotatorJpsTest.java +++ b/jps/jps-plugin/kannotator-jps-plugin-test/test/org/jetbrains/kotlin/jps/build/kannotator/KannotatorJpsTest.java @@ -21,8 +21,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleSourceRoot; +import org.jetbrains.kotlin.incremental.testingUtils.ClassFilesComparisonKt; import org.jetbrains.kotlin.jps.build.AbstractKotlinJpsBuildTestCase; -import org.jetbrains.kotlin.jps.build.classFilesComparison.ClassFilesComparisonKt; import java.io.File; import java.io.IOException; diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt index d285c1c5626..a1c52bc10a2 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt @@ -46,11 +46,7 @@ import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.incremental.LookupSymbol import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.incremental.testingUtils.Modification -import org.jetbrains.kotlin.incremental.testingUtils.TouchPolicy -import org.jetbrains.kotlin.incremental.testingUtils.copyTestSources -import org.jetbrains.kotlin.incremental.testingUtils.getModificationsToPerform -import org.jetbrains.kotlin.jps.build.classFilesComparison.assertEqualDirectories +import org.jetbrains.kotlin.incremental.testingUtils.* import org.jetbrains.kotlin.jps.incremental.JpsLookupStorageProvider import org.jetbrains.kotlin.jps.incremental.KotlinDataContainerTarget import org.jetbrains.kotlin.jps.incremental.getKotlinCache diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt deleted file mode 100644 index 64f7260b6f5..00000000000 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.jps.build.classFilesComparison - -import com.google.common.collect.Sets -import com.google.common.hash.Hashing -import com.google.common.io.Files -import com.google.protobuf.ExtensionRegistry -import com.intellij.openapi.util.io.FileUtil -import org.jetbrains.kotlin.incremental.LocalFileKotlinClass -import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader -import org.jetbrains.kotlin.serialization.DebugProtoBuf -import org.jetbrains.kotlin.serialization.jvm.BitEncoding -import org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf -import org.jetbrains.kotlin.utils.Printer -import org.jetbrains.org.objectweb.asm.ClassReader -import org.jetbrains.org.objectweb.asm.util.TraceClassVisitor -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import java.io.ByteArrayInputStream -import java.io.File -import java.io.PrintWriter -import java.io.StringWriter -import java.util.* -import kotlin.comparisons.* - - -// Set this to true if you want to dump all bytecode (test will fail in this case) -val DUMP_ALL = System.getProperty("comparison.dump.all") == "true" - -fun File.hash() = Files.hash(this, Hashing.crc32()) - -fun getDirectoryString(dir: File, interestingPaths: List): String { - val buf = StringBuilder() - val p = Printer(buf) - - - fun addDirContent(dir: File) { - p.pushIndent() - - val listFiles = dir.listFiles() - assertNotNull(listFiles) - - val children = listFiles!!.sortedWith(compareBy({ it.isDirectory }, { it.name })) - for (child in children) { - if (child.isDirectory) { - p.println(child.name) - addDirContent(child) - } - else { - p.println(child.name, " ", child.hash()) - } - } - - p.popIndent() - } - - - p.println(".") - addDirContent(dir) - - for (path in interestingPaths) { - p.println("================", path, "================") - p.println(fileToStringRepresentation(File(dir, path))) - p.println() - p.println() - } - - return buf.toString() -} - -fun getAllRelativePaths(dir: File): Set { - val result = HashSet() - FileUtil.processFilesRecursively(dir) { - if (it!!.isFile) { - result.add(FileUtil.getRelativePath(dir, it)!!) - } - - true - } - - return result -} - -fun assertEqualDirectories(expected: File, actual: File, forgiveExtraFiles: Boolean) { - val pathsInExpected = getAllRelativePaths(expected) - val pathsInActual = getAllRelativePaths(actual) - - val commonPaths = Sets.intersection(pathsInExpected, pathsInActual) - val changedPaths = commonPaths - .filter { DUMP_ALL || !Arrays.equals(File(expected, it).readBytes(), File(actual, it).readBytes()) } - .sorted() - - val expectedString = getDirectoryString(expected, changedPaths) - val actualString = getDirectoryString(actual, changedPaths) - - if (DUMP_ALL) { - assertEquals(expectedString, actualString + " ") - } - - if (forgiveExtraFiles) { - // If compilation fails, output may be different for full rebuild and partial make. Parsing output (directory string) for simplicity. - if (changedPaths.isEmpty()) { - val expectedListingLines = expectedString.split('\n').toList() - val actualListingLines = actualString.split('\n').toList() - if (actualListingLines.containsAll(expectedListingLines)) { - return - } - } - } - - assertEquals(expectedString, actualString) -} - -fun classFileToString(classFile: File): String { - val out = StringWriter() - - val traceVisitor = TraceClassVisitor(PrintWriter(out)) - ClassReader(classFile.readBytes()).accept(traceVisitor, 0) - - val classHeader = LocalFileKotlinClass.create(classFile)?.classHeader - - val annotationDataEncoded = classHeader?.data - if (annotationDataEncoded != null) { - ByteArrayInputStream(BitEncoding.decodeBytes(annotationDataEncoded)).use { - input -> - - out.write("\n------ string table types proto -----\n${DebugJvmProtoBuf.StringTableTypes.parseDelimitedFrom(input)}") - - if (!classHeader!!.metadataVersion.isCompatible()) { - error("Incompatible class ($classHeader): $classFile") - } - - when (classHeader.kind) { - KotlinClassHeader.Kind.FILE_FACADE -> - out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") - KotlinClassHeader.Kind.CLASS -> - out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}") - KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> - out.write("\n------ multi-file part proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}") - else -> throw IllegalStateException() - } - } - } - - return out.toString() -} - -fun getExtensionRegistry(): ExtensionRegistry { - val registry = ExtensionRegistry.newInstance()!! - DebugJvmProtoBuf.registerAllExtensions(registry) - return registry -} - -fun fileToStringRepresentation(file: File): String { - return when { - file.name.endsWith(".class") -> { - classFileToString(file) - } - else -> { - file.readText() - } - } -}