From d49ca87cd21a399cf2db7f303b1582aa1a8906da Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Mon, 11 Jul 2022 12:53:58 +0200 Subject: [PATCH] [test] Enable Gradle integration testing for JS sourcemaps --- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 129 +++++++++++++++--- .../app/src/main/kotlin/main.kt | 0 .../build.gradle.kts | 54 ++++++++ .../lib/src/main/kotlin/foo.kt | 0 .../settings.gradle | 2 + .../build.gradle | 37 ----- .../settings.gradle | 1 - 7 files changed, 165 insertions(+), 58 deletions(-) rename libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/{kotlin2JsProjectWithSourceMapInline => kotlin2JsProjectWithSourceMap}/app/src/main/kotlin/main.kt (100%) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/build.gradle.kts rename libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/{kotlin2JsProjectWithSourceMapInline => kotlin2JsProjectWithSourceMap}/lib/src/main/kotlin/foo.kt (100%) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/settings.gradle delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/build.gradle delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index e488769e248..e0a80b4cc37 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -615,48 +615,137 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean) } } - @DisplayName("source map is generated") @GradleTest + fun testKotlinJsSourceMap(gradleVersion: GradleVersion) { + project("kotlin2JsProjectWithSourceMap", gradleVersion) { + build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { + val mapFilePath = projectPath + .resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js.map") + assertFileContains( + mapFilePath, + "\"../../../../../app/src/main/kotlin/main.kt\"", + "\"../../../../../lib/src/main/kotlin/foo.kt\"", + "\"sourcesContent\":[null", + ) + } + } + } + + @DisplayName("prefix is added to paths in source map") @DisabledIf( "org.jetbrains.kotlin.gradle.AbstractKotlin2JsGradlePluginIT#getIrBackend", disabledReason = "Source maps are not supported in IR backend" ) - fun testKotlinJsSourceMap(gradleVersion: GradleVersion) { - project("kotlin2JsNoOutputFileProject", gradleVersion) { - buildGradle.appendText( + @GradleTest + fun testKotlinJsSourceMapCustomPrefix(gradleVersion: GradleVersion) { + project("kotlin2JsProjectWithSourceMap", gradleVersion) { + buildGradleKts.appendText( """ + |project("app") { + | tasks.withType { + | kotlinOptions.sourceMapPrefix = "appPrefix/" + | } + |} + | + |project("lib") { + | tasks.withType { + | kotlinOptions.sourceMapPrefix = "libPrefix/" + | } + |} | - |compileKotlin2Js.kotlinOptions.sourceMap = true - |compileKotlin2Js.kotlinOptions.sourceMapPrefix = "prefixprefix/" - |compileKotlin2Js.kotlinOptions.outputFile = "${'$'}{buildDir}/kotlin2js/main/app.js" """.trimMargin() ) + build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { + val mapFilePath = projectPath + .resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js.map") + assertFileContains( + mapFilePath, + "\"appPrefix/src/main/kotlin/main.kt\"", + "\"appPrefix/libPrefix/src/main/kotlin/foo.kt\"", + ) + } + } + } - build("build") { - val mapFilePath = projectPath.resolve("build/kotlin2js/main/app.js.map") - assertFileExists(mapFilePath) - val sourceFilePath = "prefixprefix/src/main/kotlin/example/Dummy.kt" - assertFileContains(mapFilePath, "\"$sourceFilePath\"") + @DisplayName("path in source maps are remapped for custom outputFile") + @DisabledIf( + "org.jetbrains.kotlin.gradle.AbstractKotlin2JsGradlePluginIT#getIrBackend", + disabledReason = "Source maps are not supported in IR backend" + ) + @GradleTest + fun testKotlinJsSourceMapCustomOutputFile(gradleVersion: GradleVersion) { + project("kotlin2JsProjectWithSourceMap", gradleVersion) { + val taskSelector = if (irBackend) + "named(\"compileDevelopmentExecutableKotlinJs\")" + else + "withType" + buildGradleKts.appendText( + """ + |project("app") { + | tasks.$taskSelector { + | kotlinOptions.outputFile = "${'$'}{buildDir}/kotlin2js/app.js" + | } + |} + | + """.trimMargin() + ) + build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { + val mapFilePath = subProject("app").projectPath + .resolve("build/kotlin2js/app.js.map") + assertFileContains( + mapFilePath, + "\"../../src/main/kotlin/main.kt\"", + "\"../../../../../lib/src/main/kotlin/foo.kt\"", + ) + } + } + } + + @DisplayName("source map is not generated when disabled") + @GradleTest + fun testKotlinJsSourceMapDisabled(gradleVersion: GradleVersion) { + project("kotlin2JsProjectWithSourceMap", gradleVersion) { + buildGradleKts.appendText( + """ + |allprojects { + | tasks.withType { + | kotlinOptions.sourceMap = false + | } + |} + | + """.trimMargin() + ) + build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { + val jsFilePath = projectPath.resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js") + assertFileExists(jsFilePath) + assertFileNotExists(Path("$jsFilePath.map")) } } } @DisplayName("sources can be embedded into source map") - @GradleTest @DisabledIf( "org.jetbrains.kotlin.gradle.AbstractKotlin2JsGradlePluginIT#getIrBackend", disabledReason = "Source maps are not supported in IR backend" ) - fun testKotlinJsSourceMapInline(gradleVersion: GradleVersion) { - project("kotlin2JsProjectWithSourceMapInline", gradleVersion) { - build("build") { - val mapFilePath = subProject("app").kotlinClassesDir().resolve("app.js.map") - assertFileExists(mapFilePath) + @GradleTest + fun testKotlinJsSourceMapEmbedSources(gradleVersion: GradleVersion) { + project("kotlin2JsProjectWithSourceMap", gradleVersion) { + buildGradleKts.appendText( + """ + |allprojects { + | tasks.withType { + | kotlinOptions.sourceMapEmbedSources = "always" + | } + |} + | + """.trimMargin() + ) + build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") { + val mapFilePath = projectPath.resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js.map") assertFileContains( mapFilePath, - "\"./src/main/kotlin/main.kt\"", - "\"./src/main/kotlin/foo.kt\"", "\"fun main(args: Array) {", "\"inline fun foo(): String {", ) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/app/src/main/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/app/src/main/kotlin/main.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/app/src/main/kotlin/main.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/app/src/main/kotlin/main.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/build.gradle.kts new file mode 100644 index 00000000000..1b2c665245f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/build.gradle.kts @@ -0,0 +1,54 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile +import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink +import kotlin.text.toBoolean + +plugins { + kotlin("js") +} + +repositories { + mavenLocal() + mavenCentral() +} + +allprojects { + apply(plugin = "org.jetbrains.kotlin.js") + + repositories { + mavenLocal() + mavenCentral() + } +} + +val useIrBackend = (findProperty("kotlin.js.useIrBackend") as? String?)?.toBoolean() ?: false + +val backend = if (useIrBackend) { + KotlinJsCompilerType.IR +} else { + KotlinJsCompilerType.LEGACY +} + +project("lib") { + kotlin { + js(backend) { + browser() + } + } +} + +project("app") { + kotlin { + js(backend) { + browser() + binaries.executable() + } + dependencies { + implementation(project(":lib")) + } + } + + tasks.withType() { + kotlinOptions.sourceMap = true + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/lib/src/main/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/lib/src/main/kotlin/foo.kt similarity index 100% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/lib/src/main/kotlin/foo.kt rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/lib/src/main/kotlin/foo.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/settings.gradle new file mode 100644 index 00000000000..51b84f94107 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMap/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "kotlin2JsProjectWithSourceMap" +include "app", "lib" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/build.gradle deleted file mode 100644 index 2e48b0dcbe8..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -buildscript { - repositories { - mavenLocal() - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - plugins.apply('org.jetbrains.kotlin.platform.js') - - repositories { - mavenLocal() - mavenCentral() - } - - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" - } - - compileKotlin2Js { - kotlinOptions.freeCompilerArgs = [ "-Xskip-metadata-version-check" ] - kotlinOptions.sourceMap = true - kotlinOptions.sourceMapPrefix = "./" - kotlinOptions.sourceMapEmbedSources = "always" - } -} - -project("app") { - dependencies { - implementation project(":lib") - } -} - - diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/settings.gradle deleted file mode 100644 index c0b70ce1c99..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin2JsProjectWithSourceMapInline/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app', ':lib' \ No newline at end of file