diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/CompatibilityTestUtil.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/CompatibilityTestUtil.kt new file mode 100644 index 00000000000..69c5db6b7ca --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/CompatibilityTestUtil.kt @@ -0,0 +1,62 @@ +/* + * 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.kpm.idea.testUtils + +import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProject +import org.jetbrains.kotlin.gradle.kpm.idea.serialize.IdeaKpmSerializationLogger +import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.TestIdeaKpmClassLoaderProjectSerializer +import java.io.File +import java.net.URLClassLoader +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertSame + +/* + * 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. + */ + +fun classLoaderForBackwardsCompatibleClasses(): ClassLoader { + val uris = classpathForBackwardsCompatibleClasses().map { file -> file.toURI().toURL() }.toTypedArray() + return URLClassLoader.newInstance(uris, null) +} + +fun classpathForBackwardsCompatibleClasses(): List { + val compatibilityTestClasspath = System.getProperty("compatibilityTestClasspath") + ?: error("Missing compatibilityTestClasspath system property") + + return compatibilityTestClasspath.split(";").map { path -> File(path) } + .onEach { file -> if (!file.exists()) println("[WARNING] Missing $file") } + .flatMap { file -> if (file.isDirectory) file.listFiles().orEmpty().toList() else listOf(file) } +} + +fun deserializeIdeaKpmProjectWithBackwardsCompatibleClasses(project: IdeaKpmProject): Any { + return deserializeIdeaKpmProjectWithBackwardsCompatibleClasses( + TestIdeaKpmClassLoaderProjectSerializer().serialize(project) + ) +} + +fun deserializeIdeaKpmProjectWithBackwardsCompatibleClasses(project: ByteArray): Any { + val classLoader = classLoaderForBackwardsCompatibleClasses() + val serializer = TestIdeaKpmClassLoaderProjectSerializer(classLoader) + + val deserialized = assertNotNull( + serializer.deserialize(project), + "Failed to deserialize project: ${serializer.reports}" + ) + + assertEquals( + 0, serializer.reports.count { it.severity > IdeaKpmSerializationLogger.Severity.WARNING }, + "Expected no severe deserialization reports. Found ${serializer.reports}" + ) + + assertSame( + classLoader, deserialized::class.java.classLoader, + "Expected model do be deserialized in with old classes" + ) + + return deserialized +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/GradleUtils.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/gradleUtils.kt similarity index 66% rename from libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/GradleUtils.kt rename to libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/gradleUtils.kt index c6560edc262..65b32ff4af9 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/GradleUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testUtils/gradleUtils.kt @@ -1,3 +1,10 @@ +/* + * 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.kpm.idea.testUtils + import org.gradle.api.Project import org.gradle.api.artifacts.verification.DependencyVerificationMode import org.gradle.api.internal.project.ProjectInternal @@ -5,6 +12,8 @@ import org.gradle.configurationcache.extensions.serviceOf import org.gradle.testfixtures.ProjectBuilder import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProject +import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectBinaryContainer +import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectContainer import org.jetbrains.kotlin.gradle.plugin.KotlinPm20PluginWrapper import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension @@ -13,11 +22,16 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -fun Project.buildIdeaKpmProjectModel(): IdeaKpmProject { +fun Project.buildIdeaKpmProject(): IdeaKpmProject { return serviceOf().getBuilder(IdeaKpmProject::class.java.name) .buildAll(IdeaKpmProject::class.java.name, this) as IdeaKpmProject } +fun Project.buildIdeaKpmProjectBinary(): IdeaKpmProjectBinaryContainer { + return serviceOf().getBuilder(IdeaKpmProjectContainer::class.java.name) + .buildAll(IdeaKpmProjectContainer::class.java.name, this) as IdeaKpmProjectBinaryContainer +} + fun createKpmProject(): Pair { val project = ProjectBuilder.builder().build() as ProjectInternal project.plugins.apply(KotlinPm20PluginWrapper::class.java)