diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/KotlinProjectIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/KotlinProjectIT.kt index 524b43beada..a073b638bc2 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/KotlinProjectIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/KotlinProjectIT.kt @@ -5,267 +5,331 @@ package org.jetbrains.kotlin.gradle.model -import org.jetbrains.kotlin.gradle.BaseGradleIT -import org.jetbrains.kotlin.gradle.util.AGPVersion -import org.jetbrains.kotlin.test.util.KtTestUtil -import org.junit.Test +import org.gradle.api.logging.configuration.WarningMode +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertNotEquals import kotlin.test.assertTrue -class KotlinProjectIT : BaseGradleIT() { - override fun defaultBuildOptions(): BuildOptions { - return super.defaultBuildOptions().copy( - androidGradlePluginVersion = AGPVersion.v3_4_1, - androidHome = KtTestUtil.findAndroidSdk() - ) - } +@DisplayName("Kotlin plugin model") +@OtherGradlePluginTests +class KotlinProjectIT : KGPBaseTest() { + override val defaultBuildOptions = super.defaultBuildOptions.copy( + androidVersion = TestVersions.AGP.AGP_34, + ) - @Test - fun testKotlinProject() { - val project = Project("kotlinProject") - val kotlinProject = project.getModels(KotlinProject::class.java).getModel(":")!! + @DisplayName("Valid model is available in Kotlin only project") + @GradleTest + fun testKotlinProject(gradleVersion: GradleVersion) { + project("kotlinProject", gradleVersion) { + getModels { + with(getModel(":")!!) { + assertBasics( + "kotlinProject", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JVM, + "DEFAULT" + ) + assertTrue(expectedByDependencies.isEmpty()) - kotlinProject.assertBasics( - "kotlinProject", - defaultBuildOptions().kotlinVersion, - KotlinProject.ProjectType.PLATFORM_JVM, - "DEFAULT" - ) - assertTrue(kotlinProject.expectedByDependencies.isEmpty()) + assertEquals(2, sourceSets.size) + val mainSourceSet = sourceSets.single { it.name == "main" } + val testSourceSet = sourceSets.single { it.name == "test" } - assertEquals(2, kotlinProject.sourceSets.size) - val mainSourceSet = kotlinProject.sourceSets.find { it.name == "main" }!! - val testSourceSet = kotlinProject.sourceSets.find { it.name == "test" }!! + mainSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) + testSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) - mainSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) - testSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) + assertEquals(2, mainSourceSet.sourceDirectories.size) + assertTrue( + mainSourceSet.sourceDirectories.contains( + projectPath.resolve("src/main/kotlin").toFile() + ) + ) + assertTrue( + mainSourceSet.sourceDirectories.contains( + projectPath.resolve("src/main/java").toFile() + ) + ) + assertEquals(1, mainSourceSet.resourcesDirectories.size) + assertTrue( + mainSourceSet.resourcesDirectories.contains( + projectPath.resolve("src/main/resources").toFile() + ) + ) + assertEquals( + projectPath.resolve("build/classes/kotlin/main").toFile(), + mainSourceSet.classesOutputDirectory + ) + assertEquals( + projectPath.resolve("build/resources/main").toFile(), + mainSourceSet.resourcesOutputDirectory + ) + assertTrue(mainSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("guava") }) + assertFalse(mainSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("testng") }) - assertEquals(2, mainSourceSet.sourceDirectories.size) - assertTrue(mainSourceSet.sourceDirectories.contains(project.projectDir.resolve("src/main/kotlin"))) - assertTrue(mainSourceSet.sourceDirectories.contains(project.projectDir.resolve("src/main/java"))) - assertEquals(1, mainSourceSet.resourcesDirectories.size) - assertTrue(mainSourceSet.resourcesDirectories.contains(project.projectDir.resolve("src/main/resources"))) - assertEquals(project.projectDir.resolve("build/classes/kotlin/main"), mainSourceSet.classesOutputDirectory) - assertEquals(project.projectDir.resolve("build/resources/main"), mainSourceSet.resourcesOutputDirectory) - assertTrue(mainSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("guava") }) - assertFalse(mainSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("testng") }) - - assertEquals(2, testSourceSet.sourceDirectories.size) - assertTrue(testSourceSet.sourceDirectories.contains(project.projectDir.resolve("src/test/kotlin"))) - assertTrue(testSourceSet.sourceDirectories.contains(project.projectDir.resolve("src/test/java"))) - assertEquals(1, testSourceSet.resourcesDirectories.size) - assertTrue(testSourceSet.resourcesDirectories.contains(project.projectDir.resolve("src/test/resources"))) - assertEquals(project.projectDir.resolve("build/classes/kotlin/test"), testSourceSet.classesOutputDirectory) - assertEquals(project.projectDir.resolve("build/resources/test"), testSourceSet.resourcesOutputDirectory) - assertTrue(testSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("guava") }) - assertTrue(testSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("testng") }) - } - - @Test - fun testKotlinJavaProject() { - val project = Project("kotlinJavaProject") - val kotlinProject = project.getModels(KotlinProject::class.java).getModel(":")!! - - kotlinProject.assertBasics( - "kotlinJavaProject", - defaultBuildOptions().kotlinVersion, - KotlinProject.ProjectType.PLATFORM_JVM, - "DEFAULT" - ) - - assertEquals(3, kotlinProject.sourceSets.size) - val mainSourceSet = kotlinProject.sourceSets.find { it.name == "main" }!! - val deploySourceSet = kotlinProject.sourceSets.find { it.name == "deploy" }!! - val testSourceSet = kotlinProject.sourceSets.find { it.name == "test" }!! - - mainSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) - deploySourceSet.assertBasics("deploy", SourceSet.SourceSetType.PRODUCTION, emptySet()) - testSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) - } - - @Test - fun testMultiplatformProject() { - val project = Project("multiplatformProject") - val models = project.getModels(KotlinProject::class.java) - - val libKotlinProject = models.getModel(":lib")!! - val libJsKotlinProject = models.getModel(":libJs")!! - val libJvmKotlinProject = models.getModel(":libJvm")!! - - libKotlinProject.assertBasics("lib", defaultBuildOptions().kotlinVersion, KotlinProject.ProjectType.PLATFORM_COMMON, "DEFAULT") - libJsKotlinProject.assertBasics("libJs", defaultBuildOptions().kotlinVersion, KotlinProject.ProjectType.PLATFORM_JS, "DEFAULT") - libJvmKotlinProject.assertBasics("libJvm", defaultBuildOptions().kotlinVersion, KotlinProject.ProjectType.PLATFORM_JVM, "DEFAULT") - - assertEquals(1, libJsKotlinProject.expectedByDependencies.size) - assertTrue(libJsKotlinProject.expectedByDependencies.contains(":lib")) - - assertEquals(1, libJvmKotlinProject.expectedByDependencies.size) - assertTrue(libJvmKotlinProject.expectedByDependencies.contains(":lib")) - - - assertEquals(2, libJsKotlinProject.sourceSets.size) - val mainJsSourceSet = libJsKotlinProject.sourceSets.find { it.name == "main" }!! - val testJsSourceSet = libJsKotlinProject.sourceSets.find { it.name == "test" }!! - - mainJsSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) - testJsSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) - - assertEquals(1, mainJsSourceSet.sourceDirectories.size) - assertTrue(mainJsSourceSet.sourceDirectories.contains(project.projectDir.resolve("libJs/src/main/kotlin"))) - assertEquals(1, mainJsSourceSet.resourcesDirectories.size) - assertTrue(mainJsSourceSet.resourcesDirectories.contains(project.projectDir.resolve("libJs/src/main/resources"))) - assertEquals(project.projectDir.resolve("libJs/build/classes/kotlin/main"), mainJsSourceSet.classesOutputDirectory) - assertEquals(project.projectDir.resolve("libJs/build/resources/main"), mainJsSourceSet.resourcesOutputDirectory) - - assertEquals(1, testJsSourceSet.sourceDirectories.size) - assertTrue(testJsSourceSet.sourceDirectories.contains(project.projectDir.resolve("libJs/src/test/kotlin"))) - assertEquals(1, testJsSourceSet.resourcesDirectories.size) - assertTrue(testJsSourceSet.resourcesDirectories.contains(project.projectDir.resolve("libJs/src/test/resources"))) - assertEquals(project.projectDir.resolve("libJs/build/classes/kotlin/test"), testJsSourceSet.classesOutputDirectory) - assertEquals(project.projectDir.resolve("libJs/build/resources/test"), testJsSourceSet.resourcesOutputDirectory) - } - - @Test - fun testAndroidProject() { - val project = Project("AndroidExtensionsProject") - val kotlinProject = project.getModels(KotlinProject::class.java).getModel(":app")!! - - kotlinProject.assertBasics( - "app", - defaultBuildOptions().kotlinVersion, - KotlinProject.ProjectType.PLATFORM_JVM, - "DEFAULT" - ) - - assertTrue(kotlinProject.expectedByDependencies.isEmpty()) - assertEquals(5, kotlinProject.sourceSets.size) - - val sourceSets = kotlinProject.sourceSets.sortedBy { it.name } - - fun SourceSet.verifySourceSet( - name: String, type: SourceSet.SourceSetType, friends: List, sources: List, resources: List, - classesOutputDir: String, resourcesOutputDir: String - ) { - assertEquals(name, name) - assertEquals(type, this.type) - - assertEquals(friends.size, friendSourceSets.size) - assertEquals(friends, friendSourceSets) - - assertEquals(sources.size, sourceDirectories.size) - assertEquals(sources.map { project.projectDir.resolve(it) }, sourceDirectories) - - assertEquals(resources.size, resourcesDirectories.size) - assertEquals(resources.map { project.projectDir.resolve(it) }, resourcesDirectories) - - assertEquals(project.projectDir.resolve(classesOutputDir), classesOutputDirectory) - assertEquals(project.projectDir.resolve(resourcesOutputDir), resourcesOutputDirectory) - - assertNotEquals(0, compilerArguments.currentArguments.size) - assertNotEquals(0, compilerArguments.defaultArguments.size) + assertEquals(2, testSourceSet.sourceDirectories.size) + assertTrue(testSourceSet.sourceDirectories.contains(projectPath.resolve("src/test/kotlin").toFile())) + assertTrue(testSourceSet.sourceDirectories.contains(projectPath.resolve("src/test/java").toFile())) + assertEquals(1, testSourceSet.resourcesDirectories.size) + assertTrue(testSourceSet.resourcesDirectories.contains(projectPath.resolve("src/test/resources").toFile())) + assertEquals(projectPath.resolve("build/classes/kotlin/test").toFile(), testSourceSet.classesOutputDirectory) + assertEquals(projectPath.resolve("build/resources/test").toFile(), testSourceSet.resourcesOutputDirectory) + assertTrue(testSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("guava") }) + assertTrue(testSourceSet.compilerArguments.compileClasspath.any { it.absolutePath.contains("testng") }) + } + } } - - sourceSets[0].verifySourceSet( - "debug", - SourceSet.SourceSetType.PRODUCTION, - listOf(), - listOf( - "app/src/debug/kotlin", - "app/src/debug/java", - "app/src/main/kotlin", - "app/src/main/java" - ), - listOf( - "app/src/debug/resources", - "app/src/main/resources" - ), - "app/build/tmp/kotlin-classes/debug", "app/build/processedResources/debug" - ) - sourceSets[1].verifySourceSet( - "debugAndroidTest", - SourceSet.SourceSetType.TEST, - listOf("debug"), - listOf( - "app/src/debugAndroidTest/kotlin", - "app/src/androidTest/kotlin", - "app/src/androidTest/java", - "app/src/androidTestDebug/kotlin", - "app/src/androidTestDebug/java" - ), - listOf( - "app/src/debugAndroidTest/resources", - "app/src/androidTest/resources", - "app/src/androidTestDebug/resources" - ), - "app/build/tmp/kotlin-classes/debugAndroidTest", "app/build/processedResources/debugAndroidTest" - ) - sourceSets[2].verifySourceSet( - "debugUnitTest", - SourceSet.SourceSetType.TEST, - listOf("debug"), - listOf( - "app/src/debugUnitTest/kotlin", - "app/src/test/kotlin", - "app/src/test/java", - "app/src/testDebug/kotlin", - "app/src/testDebug/java" - ), - listOf( - "app/src/debugUnitTest/resources", - "app/src/test/resources", - "app/src/testDebug/resources" - ), - "app/build/tmp/kotlin-classes/debugUnitTest", "app/build/processedResources/debugUnitTest" - ) - sourceSets[3].verifySourceSet( - "release", - SourceSet.SourceSetType.PRODUCTION, - listOf(), - listOf( - "app/src/release/kotlin", - "app/src/release/java", - "app/src/main/kotlin", - "app/src/main/java" - ), - listOf( - "app/src/release/resources", - "app/src/main/resources" - ), - "app/build/tmp/kotlin-classes/release", "app/build/processedResources/release" - ) - sourceSets[4].verifySourceSet( - "releaseUnitTest", - SourceSet.SourceSetType.TEST, - listOf("release"), - listOf( - "app/src/releaseUnitTest/kotlin", - "app/src/test/kotlin", - "app/src/test/java", - "app/src/testRelease/kotlin", - "app/src/testRelease/java" - ), - listOf( - "app/src/releaseUnitTest/resources", - "app/src/test/resources", - "app/src/testRelease/resources" - ), - "app/build/tmp/kotlin-classes/releaseUnitTest", "app/build/processedResources/releaseUnitTest" - ) } - @Test - fun testCoroutinesProjectDSL() { - val project = Project("coroutinesProjectDSL") - val kotlinProject = project.getModels(KotlinProject::class.java).getModel(":")!! + @DisplayName("Valid model in mixed Kotlin-Java project") + @GradleTest + fun testKotlinJavaProject(gradleVersion: GradleVersion) { + project("kotlinJavaProject", gradleVersion) { + getModels { + with(getModel(":")!!) { + assertBasics( + "kotlinJavaProject", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JVM, + "DEFAULT" + ) - kotlinProject.assertBasics( - "coroutinesProjectDSL", - defaultBuildOptions().kotlinVersion, - KotlinProject.ProjectType.PLATFORM_JVM, - "ENABLE" - ) + assertEquals(3, sourceSets.size) + val mainSourceSet = sourceSets.single { it.name == "main" } + val deploySourceSet = sourceSets.single { it.name == "deploy" } + val testSourceSet = sourceSets.single { it.name == "test" } + + mainSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) + deploySourceSet.assertBasics("deploy", SourceSet.SourceSetType.PRODUCTION, emptySet()) + testSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) + } + } + } + } + + @DisplayName("Valid model in multiplatform project") + @GradleTest + fun testMultiplatformProject(gradleVersion: GradleVersion) { + project("multiplatformProject", gradleVersion) { + getModels { + val libKotlinProject = getModel(":lib")!! + val libJsKotlinProject = getModel(":libJs")!! + val libJvmKotlinProject = getModel(":libJvm")!! + + libKotlinProject.assertBasics( + "lib", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_COMMON, + "DEFAULT" + ) + libJsKotlinProject.assertBasics( + "libJs", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JS, + "DEFAULT" + ) + libJvmKotlinProject.assertBasics( + "libJvm", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JVM, + "DEFAULT" + ) + + assertEquals(1, libJsKotlinProject.expectedByDependencies.size) + assertTrue(libJsKotlinProject.expectedByDependencies.contains(":lib")) + + assertEquals(1, libJvmKotlinProject.expectedByDependencies.size) + assertTrue(libJvmKotlinProject.expectedByDependencies.contains(":lib")) + + + assertEquals(2, libJsKotlinProject.sourceSets.size) + val mainJsSourceSet = libJsKotlinProject.sourceSets.single { it.name == "main" } + val testJsSourceSet = libJsKotlinProject.sourceSets.single { it.name == "test" } + + mainJsSourceSet.assertBasics("main", SourceSet.SourceSetType.PRODUCTION, emptySet()) + testJsSourceSet.assertBasics("test", SourceSet.SourceSetType.TEST, listOf("main")) + + assertEquals(1, mainJsSourceSet.sourceDirectories.size) + assertTrue(mainJsSourceSet.sourceDirectories.contains(projectPath.resolve("libJs/src/main/kotlin").toFile())) + assertEquals(1, mainJsSourceSet.resourcesDirectories.size) + assertTrue(mainJsSourceSet.resourcesDirectories.contains(projectPath.resolve("libJs/src/main/resources").toFile())) + assertEquals(projectPath.resolve("libJs/build/classes/kotlin/main").toFile(), mainJsSourceSet.classesOutputDirectory) + assertEquals(projectPath.resolve("libJs/build/resources/main").toFile(), mainJsSourceSet.resourcesOutputDirectory) + + assertEquals(1, testJsSourceSet.sourceDirectories.size) + assertTrue(testJsSourceSet.sourceDirectories.contains(projectPath.resolve("libJs/src/test/kotlin").toFile())) + assertEquals(1, testJsSourceSet.resourcesDirectories.size) + assertTrue(testJsSourceSet.resourcesDirectories.contains(projectPath.resolve("libJs/src/test/resources").toFile())) + assertEquals(projectPath.resolve("libJs/build/classes/kotlin/test").toFile(), testJsSourceSet.classesOutputDirectory) + assertEquals(projectPath.resolve("libJs/build/resources/test").toFile(), testJsSourceSet.resourcesOutputDirectory) + } + } + } + + @DisplayName("Kotlin-android project model is valid") + @GradleTest + fun testAndroidProject(gradleVersion: GradleVersion) { + project( + "AndroidExtensionsProject", + gradleVersion, + buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Summary) + ) { + getModels { + with(getModel(":app")!!) { + assertBasics( + "app", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JVM, + "DEFAULT" + ) + + assertTrue(expectedByDependencies.isEmpty()) + assertEquals(5, sourceSets.size) + + val sourceSets = sourceSets.sortedBy { it.name } + + sourceSets[0].verifySourceSet( + this@project, + "debug", + SourceSet.SourceSetType.PRODUCTION, + listOf(), + listOf( + "app/src/debug/kotlin", + "app/src/debug/java", + "app/src/main/kotlin", + "app/src/main/java" + ), + listOf( + "app/src/debug/resources", + "app/src/main/resources" + ), + "app/build/tmp/kotlin-classes/debug", "app/build/processedResources/debug" + ) + sourceSets[1].verifySourceSet( + this@project, + "debugAndroidTest", + SourceSet.SourceSetType.TEST, + listOf("debug"), + listOf( + "app/src/debugAndroidTest/kotlin", + "app/src/androidTest/kotlin", + "app/src/androidTest/java", + "app/src/androidTestDebug/kotlin", + "app/src/androidTestDebug/java" + ), + listOf( + "app/src/debugAndroidTest/resources", + "app/src/androidTest/resources", + "app/src/androidTestDebug/resources" + ), + "app/build/tmp/kotlin-classes/debugAndroidTest", "app/build/processedResources/debugAndroidTest" + ) + sourceSets[2].verifySourceSet( + this@project, + "debugUnitTest", + SourceSet.SourceSetType.TEST, + listOf("debug"), + listOf( + "app/src/debugUnitTest/kotlin", + "app/src/test/kotlin", + "app/src/test/java", + "app/src/testDebug/kotlin", + "app/src/testDebug/java" + ), + listOf( + "app/src/debugUnitTest/resources", + "app/src/test/resources", + "app/src/testDebug/resources" + ), + "app/build/tmp/kotlin-classes/debugUnitTest", "app/build/processedResources/debugUnitTest" + ) + sourceSets[3].verifySourceSet( + this@project, + "release", + SourceSet.SourceSetType.PRODUCTION, + listOf(), + listOf( + "app/src/release/kotlin", + "app/src/release/java", + "app/src/main/kotlin", + "app/src/main/java" + ), + listOf( + "app/src/release/resources", + "app/src/main/resources" + ), + "app/build/tmp/kotlin-classes/release", "app/build/processedResources/release" + ) + sourceSets[4].verifySourceSet( + this@project, + "releaseUnitTest", + SourceSet.SourceSetType.TEST, + listOf("release"), + listOf( + "app/src/releaseUnitTest/kotlin", + "app/src/test/kotlin", + "app/src/test/java", + "app/src/testRelease/kotlin", + "app/src/testRelease/java" + ), + listOf( + "app/src/releaseUnitTest/resources", + "app/src/test/resources", + "app/src/testRelease/resources" + ), + "app/build/tmp/kotlin-classes/releaseUnitTest", "app/build/processedResources/releaseUnitTest" + ) + } + } + } + } + + private fun SourceSet.verifySourceSet( + testProject: TestProject, + name: String, + type: SourceSet.SourceSetType, + friends: List, + sources: List, + resources: List, + classesOutputDir: String, + resourcesOutputDir: String + ) { + assertEquals(name, name) + assertEquals(type, this.type) + + assertEquals(friends.size, friendSourceSets.size) + assertEquals(friends, friendSourceSets) + + assertEquals(sources.size, sourceDirectories.size) + assertEquals(sources.map { testProject.projectPath.resolve(it).toFile() }, sourceDirectories) + + assertEquals(resources.size, resourcesDirectories.size) + assertEquals(resources.map { testProject.projectPath.resolve(it).toFile() }, resourcesDirectories) + + assertEquals(testProject.projectPath.resolve(classesOutputDir).toFile(), classesOutputDirectory) + assertEquals(testProject.projectPath.resolve(resourcesOutputDir).toFile(), resourcesOutputDirectory) + + assertNotEquals(0, compilerArguments.currentArguments.size) + assertNotEquals(0, compilerArguments.defaultArguments.size) + } + + + @DisplayName("Project with coroutines dsl enabled has valid model") + @GradleTest + fun testCoroutinesProjectDSL(gradleVersion: GradleVersion) { + project("coroutinesProjectDSL", gradleVersion) { + getModels { + getModel(":")!!.assertBasics( + "coroutinesProjectDSL", + defaultBuildOptions.kotlinVersion, + KotlinProject.ProjectType.PLATFORM_JVM, + "ENABLE" + ) + } + } } companion object {