Always print class id in proto comparison test

A name of class file was used for added and removed classes
before the change.
The change is required for reusing the test data in js proto comparison
tests (there is no classfiles in js, so it is hard to
emulate jvm classfiles names for inner/nested classes).
This commit is contained in:
Alexey Tsvetkov
2017-06-15 19:00:14 +03:00
parent 5dd4e4cdd4
commit cc24b9f4ad
7 changed files with 39 additions and 39 deletions
@@ -37,8 +37,9 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() {
val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old") val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old")
val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new") val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new")
val oldClassMap = oldClassFiles.associateBy { it.name }
val newClassMap = newClassFiles.associateBy { it.name } val oldClassMap = oldClassFiles.map { LocalFileKotlinClass.create(it)!!.let { it.classId to it } }.toMap()
val newClassMap = newClassFiles.map { LocalFileKotlinClass.create(it)!!.let { it.classId to it } }.toMap()
val sb = StringBuilder() val sb = StringBuilder()
val p = Printer(sb) val p = Printer(sb)
@@ -46,17 +47,17 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() {
val oldSetOfNames = oldClassFiles.map { it.name }.toSet() val oldSetOfNames = oldClassFiles.map { it.name }.toSet()
val newSetOfNames = newClassFiles.map { it.name }.toSet() val newSetOfNames = newClassFiles.map { it.name }.toSet()
val removedNames = (oldSetOfNames - newSetOfNames).sorted() val removedNames = (oldClassMap.keys - newClassMap.keys).map { it.toString() }.sorted()
removedNames.forEach { removedNames.forEach {
p.println("REMOVED: class $it") p.println("REMOVED: class $it")
} }
val addedNames = (newSetOfNames - oldSetOfNames).sorted() val addedNames = (newClassMap.keys - oldClassMap.keys).map { it.toString() }.sorted()
addedNames.forEach { addedNames.forEach {
p.println("ADDED: class $it") p.println("ADDED: class $it")
} }
val commonNames = oldSetOfNames.intersect(newSetOfNames).sorted() val commonNames = oldClassMap.keys.intersect(newClassMap.keys).sortedBy { it.toString() }
for(name in commonNames) { for(name in commonNames) {
p.printDifference(oldClassMap[name]!!, newClassMap[name]!!) p.printDifference(oldClassMap[name]!!, newClassMap[name]!!)
@@ -78,31 +79,30 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() {
return File(classesDirectory, "test").listFiles() { it -> it.name.endsWith(".class") }?.sortedBy { it.name }!! return File(classesDirectory, "test").listFiles() { it -> it.name.endsWith(".class") }?.sortedBy { it.name }!!
} }
private fun Printer.printDifference(oldClassFile: File, newClassFile: File) { private fun Printer.printDifference(oldClass: LocalFileKotlinClass, newClass: LocalFileKotlinClass) {
fun KotlinJvmBinaryClass.readProto(): ProtoMapValue? { fun KotlinJvmBinaryClass.readProto(): ProtoMapValue? {
assert(classHeader.metadataVersion.isCompatible()) { "Incompatible class ($classHeader): $location" } assert(classHeader.metadataVersion.isCompatible()) { "Incompatible class ($classHeader): $location" }
val bytes by lazy { BitEncoding.decodeBytes(classHeader.data!!) }
val strings by lazy { classHeader.strings!! }
return when (classHeader.kind) { return when (classHeader.kind) {
KotlinClassHeader.Kind.CLASS, KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { KotlinClassHeader.Kind.CLASS -> {
ProtoMapValue( ProtoMapValue(false, bytes, strings)
classHeader.kind != KotlinClassHeader.Kind.CLASS, }
BitEncoding.decodeBytes(classHeader.data!!), KotlinClassHeader.Kind.FILE_FACADE,
classHeader.strings!! KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> {
) ProtoMapValue(true, bytes, strings)
} }
else -> { else -> {
println("skip $classId") println("skip $classId")
return null null
} }
} }
} }
val oldClass = LocalFileKotlinClass.create(oldClassFile)!! val diff = difference(oldClass.readProto() ?: return,
val newClass = LocalFileKotlinClass.create(newClassFile)!! newClass.readProto() ?: return)
val diff = difference(
oldClass.readProto() ?: return,
newClass.readProto() ?: return
)
val changes = SmartList<String>() val changes = SmartList<String>()
@@ -1,12 +1,12 @@
REMOVED: class ClassWithChangedCompanionObject$FirstName.class REMOVED: class test/ClassWithChangedCompanionObject.FirstName
REMOVED: class ClassWithRemovedCompanionObject$Companion.class REMOVED: class test/ClassWithRemovedCompanionObject.Companion
ADDED: class ClassWithAddedCompanionObject$Companion.class ADDED: class test/ClassWithAddedCompanionObject.Companion
ADDED: class ClassWithChangedCompanionObject$SecondName.class ADDED: class test/ClassWithChangedCompanionObject.SecondName
changes in test/ClassWithAddedCompanionObject: CLASS_SIGNATURE, MEMBERS changes in test/ClassWithAddedCompanionObject: CLASS_SIGNATURE, MEMBERS
[Companion] [Companion]
changes in test/ClassWithChangedCompanionObject: CLASS_SIGNATURE, MEMBERS changes in test/ClassWithChangedCompanionObject: CLASS_SIGNATURE, MEMBERS
[FirstName, SecondName] [FirstName, SecondName]
changes in test/ClassWithChangedVisibilityForCompanionObject.Companion: CLASS_SIGNATURE
changes in test/ClassWithChangedVisibilityForCompanionObject: NONE changes in test/ClassWithChangedVisibilityForCompanionObject: NONE
changes in test/ClassWithChangedVisibilityForCompanionObject.Companion: CLASS_SIGNATURE
changes in test/ClassWithRemovedCompanionObject: CLASS_SIGNATURE, MEMBERS changes in test/ClassWithRemovedCompanionObject: CLASS_SIGNATURE, MEMBERS
[Companion] [Companion]
@@ -1,9 +1,9 @@
REMOVED: class ClassWithNestedClasses$NestedClassRemoved.class REMOVED: class test/ClassWithNestedClasses.NestedClassRemoved
ADDED: class ClassWithNestedClasses$InnerClassAdded.class ADDED: class test/ClassWithNestedClasses.InnerClassAdded
ADDED: class ClassWithNestedClasses$NestedClassAdded.class ADDED: class test/ClassWithNestedClasses.NestedClassAdded
changes in test/ClassWithChangedVisibilityForNestedClasses: NONE
changes in test/ClassWithChangedVisibilityForNestedClasses.InnerClass: CLASS_SIGNATURE changes in test/ClassWithChangedVisibilityForNestedClasses.InnerClass: CLASS_SIGNATURE
changes in test/ClassWithChangedVisibilityForNestedClasses.NestedClass: CLASS_SIGNATURE changes in test/ClassWithChangedVisibilityForNestedClasses.NestedClass: CLASS_SIGNATURE
changes in test/ClassWithChangedVisibilityForNestedClasses: NONE
changes in test/ClassWithNestedClasses.InnerClass: NONE
changes in test/ClassWithNestedClasses: MEMBERS changes in test/ClassWithNestedClasses: MEMBERS
[InnerClassAdded, NestedClassAdded, NestedClassRemoved] [InnerClassAdded, NestedClassAdded, NestedClassRemoved]
changes in test/ClassWithNestedClasses.InnerClass: NONE
@@ -1,5 +1,5 @@
ADDED: class Base$C.class ADDED: class test/Base.C
changes in test/Base.A: NONE
changes in test/Base.B: NONE
changes in test/Base: CLASS_SIGNATURE, MEMBERS changes in test/Base: CLASS_SIGNATURE, MEMBERS
[C] [C]
changes in test/Base.A: NONE
changes in test/Base.B: NONE
@@ -15,10 +15,10 @@ changes in test/EnumFlagUnchanged: NONE
changes in test/FinalFlagAdded: NONE changes in test/FinalFlagAdded: NONE
changes in test/FinalFlagRemoved: NONE changes in test/FinalFlagRemoved: NONE
changes in test/FinalFlagUnchanged: NONE changes in test/FinalFlagUnchanged: NONE
changes in test/InnerClassHolder: NONE
changes in test/InnerClassHolder.InnerFlagAdded: CLASS_SIGNATURE changes in test/InnerClassHolder.InnerFlagAdded: CLASS_SIGNATURE
changes in test/InnerClassHolder.InnerFlagRemoved: CLASS_SIGNATURE changes in test/InnerClassHolder.InnerFlagRemoved: CLASS_SIGNATURE
changes in test/InnerClassHolder.InnerFlagUnchanged: NONE changes in test/InnerClassHolder.InnerFlagUnchanged: NONE
changes in test/InnerClassHolder: NONE
changes in test/InternalFlagAdded: CLASS_SIGNATURE changes in test/InternalFlagAdded: CLASS_SIGNATURE
changes in test/InternalFlagRemoved: CLASS_SIGNATURE changes in test/InternalFlagRemoved: CLASS_SIGNATURE
changes in test/InternalFlagUnchanged: NONE changes in test/InternalFlagUnchanged: NONE
@@ -28,10 +28,10 @@ changes in test/OpenFlagUnchanged: NONE
changes in test/PrivateFlagAdded: CLASS_SIGNATURE changes in test/PrivateFlagAdded: CLASS_SIGNATURE
changes in test/PrivateFlagRemoved: CLASS_SIGNATURE changes in test/PrivateFlagRemoved: CLASS_SIGNATURE
changes in test/PrivateFlagUnchanged: NONE changes in test/PrivateFlagUnchanged: NONE
changes in test/ProtectedClassHolder: NONE
changes in test/ProtectedClassHolder.ProtectedFlagAdded: CLASS_SIGNATURE changes in test/ProtectedClassHolder.ProtectedFlagAdded: CLASS_SIGNATURE
changes in test/ProtectedClassHolder.ProtectedFlagRemoved: CLASS_SIGNATURE changes in test/ProtectedClassHolder.ProtectedFlagRemoved: CLASS_SIGNATURE
changes in test/ProtectedClassHolder.ProtectedFlagUnchanged: NONE changes in test/ProtectedClassHolder.ProtectedFlagUnchanged: NONE
changes in test/ProtectedClassHolder: NONE
changes in test/PublicFlagAdded: NONE changes in test/PublicFlagAdded: NONE
changes in test/PublicFlagRemoved: NONE changes in test/PublicFlagRemoved: NONE
changes in test/PublicFlagUnchanged: NONE changes in test/PublicFlagUnchanged: NONE
@@ -1,3 +1,3 @@
REMOVED: class MainKt$Companion.class REMOVED: class test/MainKt.Companion
REMOVED: class TestPackage.class REMOVED: class test/TestPackage
changes in test/MainKt: CLASS_SIGNATURE changes in test/MainKt: CLASS_SIGNATURE
@@ -1,3 +1,3 @@
ADDED: class MainKt$Companion.class ADDED: class test/MainKt.Companion
ADDED: class TestPackage.class ADDED: class test/TestPackage
changes in test/MainKt: CLASS_SIGNATURE changes in test/MainKt: CLASS_SIGNATURE