From 7c00f6447d2b0be7ab3e9cb0df86aed69b39a455 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 15 Nov 2022 15:39:50 +0100 Subject: [PATCH] [Gradle] Implement IdeaKotlinDependencyForwardCompatibilityTest KT-54825 --- .../build.gradle.kts | 1 + ...otlinDependencyForwardCompatibilityTest.kt | 79 +++++++++++++++++++ .../tcs/TestIdeaKotlinInstances.kt | 4 +- 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-idea-proto/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/proto/tcs/IdeaKotlinDependencyForwardCompatibilityTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts index 45ccebc908c..b25d09d8205 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { embedded("com.google.protobuf:protobuf-java:3.21.9") embedded("com.google.protobuf:protobuf-kotlin:3.21.9") testImplementation(project(":kotlin-test:kotlin-test-junit")) + testImplementation(kotlin("reflect")) testImplementation(testFixtures(project(":kotlin-gradle-plugin-idea"))) } diff --git a/libraries/tools/kotlin-gradle-plugin-idea-proto/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/proto/tcs/IdeaKotlinDependencyForwardCompatibilityTest.kt b/libraries/tools/kotlin-gradle-plugin-idea-proto/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/proto/tcs/IdeaKotlinDependencyForwardCompatibilityTest.kt new file mode 100644 index 00000000000..2d8a1513a58 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea-proto/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/proto/tcs/IdeaKotlinDependencyForwardCompatibilityTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.idea.proto.tcs + +import org.jetbrains.kotlin.gradle.idea.proto.classLoaderForBackwardsCompatibleClasses +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinSourceDependency +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinUnresolvedBinaryDependency +import org.jetbrains.kotlin.gradle.idea.testFixtures.serialize.TestIdeaKotlinSerializationContext +import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.TestIdeaKotlinDependencySerializer +import org.jetbrains.kotlin.gradle.idea.testFixtures.tcs.TestIdeaKotlinInstances +import org.junit.Test +import kotlin.reflect.KProperty0 +import kotlin.test.assertEquals +import kotlin.test.fail + +class IdeaKotlinDependencyForwardCompatibilityTest { + + @Test + fun `test - simple unresolved binary dependency`() { + val binary = oldBinaryOf(TestIdeaKotlinInstances::simpleUnresolvedBinaryDependency) + val deserialized = deserializeOrFail(binary) + + assertEquals(TestIdeaKotlinInstances.simpleUnresolvedBinaryDependency.cause, deserialized.cause) + assertEquals(TestIdeaKotlinInstances.simpleUnresolvedBinaryDependency.coordinates, deserialized.coordinates) + assertEquals(TestIdeaKotlinInstances.simpleUnresolvedBinaryDependency.extras, deserialized.extras) + } + + @Test + fun `test - simple resolved binary dependency`() { + val binary = oldBinaryOf(TestIdeaKotlinInstances::simpleResolvedBinaryDependency) + val deserialized = deserializeOrFail(binary) + + assertEquals(TestIdeaKotlinInstances.simpleResolvedBinaryDependency.coordinates, deserialized.coordinates) + assertEquals(TestIdeaKotlinInstances.simpleResolvedBinaryDependency.binaryType, deserialized.binaryType) + assertEquals(TestIdeaKotlinInstances.simpleResolvedBinaryDependency.binaryFile, deserialized.binaryFile) + assertEquals(TestIdeaKotlinInstances.simpleResolvedBinaryDependency.extras, deserialized.extras) + } + + @Test + fun `test - simple source dependency`() { + val binary = oldBinaryOf(TestIdeaKotlinInstances::simpleSourceDependency) + val deserialized = deserializeOrFail(binary) + + assertEquals(TestIdeaKotlinInstances.simpleSourceDependency.type, deserialized.type) + assertEquals(TestIdeaKotlinInstances.simpleSourceDependency.coordinates, deserialized.coordinates) + assertEquals(TestIdeaKotlinInstances.simpleSourceDependency.extras, deserialized.extras) + } +} + +private inline fun deserializeOrFail(data: ByteArray): T { + val context = TestIdeaKotlinSerializationContext() + val deserialized = context.IdeaKotlinDependency(data) ?: fail( + "Failed to deserialize ${T::class.java.name}. Reports:\n" + context.logger.reports.joinToString("\n") + ) + + return deserialized as T +} + +private fun oldBinaryOf(property: KProperty0): ByteArray { + val classLoader = classLoaderForBackwardsCompatibleClasses() + val testIdeaKotlinInstancesClazz = classLoader.loadClass(TestIdeaKotlinInstances::class.java.name).kotlin + + val testIdeaKotlinInstances = testIdeaKotlinInstancesClazz.objectInstance + ?: error("Failed to get ${TestIdeaKotlinInstances::class.java.name} instance") + + val member = testIdeaKotlinInstancesClazz.members + .firstOrNull { it.name == property.name } + ?: error("Failed to get '${property.name}' member") + + val dependencyInstance = member.call(testIdeaKotlinInstances) + ?: error("Failed to get '${property.name}'") + + return TestIdeaKotlinDependencySerializer(classLoader).serialize(dependencyInstance) +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/TestIdeaKotlinInstances.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/TestIdeaKotlinInstances.kt index 25181e6ea51..895ec4efffc 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/TestIdeaKotlinInstances.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/idea/testFixtures/tcs/TestIdeaKotlinInstances.kt @@ -47,8 +47,8 @@ object TestIdeaKotlinInstances { ) val simpleSourceDependency = IdeaKotlinSourceDependency( - coordinates = TestIdeaKotlinInstances.simpleSourceCoordinates, + coordinates = simpleSourceCoordinates, type = IdeaKotlinSourceDependency.Type.Regular, - extras = TestIdeaKotlinInstances.extrasWithIntAndStrings.toMutableExtras() + extras = extrasWithIntAndStrings.toMutableExtras() ) } \ No newline at end of file