Migration DukatIntegrationIT tests to new DSL

^KT-45745 In Progress
This commit is contained in:
Yahor Berdnikau
2022-01-21 16:45:14 +01:00
committed by TeamCityServer
parent 883432fbb8
commit d754c60c32
7 changed files with 279 additions and 275 deletions
@@ -7,443 +7,447 @@ package org.jetbrains.kotlin.gradle
import com.google.gson.Gson
import org.gradle.api.logging.configuration.WarningMode
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.targets.js.dukat.ExternalsOutputFormat
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
import org.jetbrains.kotlin.gradle.util.modify
import org.junit.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import kotlin.io.path.readText
class DukatIntegrationIT : BaseGradleIT() {
@Test
fun testSeparateDukatKotlinDslRootDependencies() {
@DisplayName("Dukat standalone")
@JsGradlePluginTests
class DukatIntegrationStandaloneIT : KGPBaseTest() {
@DisplayName("Kotlin DSL and root dependencies")
@GradleTest
fun testSeparateDukatKotlinDslRootDependencies(gradleVersion: GradleVersion) {
testSeparateDukat(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.ROOT
)
}
@Test
fun testSeparateDukatKotlinDslExtDependencies() {
@DisplayName("Kotlin DSL and external dependencies")
@GradleTest
fun testSeparateDukatKotlinDslExtDependencies(gradleVersion: GradleVersion) {
testSeparateDukat(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.EXTENSION
)
}
@Test
fun testSeparateDukatGroovyDslRootDependencies() {
@DisplayName("Groovy DSL and root dependencies")
@GradleTest
fun testSeparateDukatGroovyDslRootDependencies(gradleVersion: GradleVersion) {
testSeparateDukat(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.ROOT
)
}
@Test
fun testSeparateDukatGroovyDslExtDependencies() {
@DisplayName("Groovy DSL and external dependencies")
@GradleTest
fun testSeparateDukatGroovyDslExtDependencies(gradleVersion: GradleVersion) {
testSeparateDukat(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.EXTENSION
)
}
private fun testSeparateDukat(
gradleVersion: GradleVersion,
dslType: DslType,
dependenciesLocation: DependenciesLocation
) {
val project = Project(
projectName = projectName(dslType, dependenciesLocation),
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.build("generateExternals") {
assertSuccessful()
project(
projectName = projectName(dslType, dependenciesLocation, PROJECTS_PREFIX),
gradleVersion
) {
build("generateExternals")
}
}
}
@Test
fun testIntegratedDukatKotlinDslRootDependencies() {
@DisplayName("Dukat integrated")
@JsGradlePluginTests
class DukatIntegratedIntegrationIT : KGPBaseTest() {
@DisplayName("Kotlin DSL and root dependencies")
@GradleTest
fun testIntegratedDukatKotlinDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukat(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatKotlinDslExtDependencies() {
@DisplayName("Kotlin DSL and external dependencies")
@GradleTest
fun testIntegratedDukatKotlinDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukat(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.EXTENSION
)
}
@Test
fun testIntegratedDukatGroovyDslRootDependencies() {
@DisplayName("Groovy DSL and root dependencies")
@GradleTest
fun testIntegratedDukatGroovyDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukat(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatGroovyDslExtDependencies() {
@DisplayName("Groovy DSL and external dependencies")
@GradleTest
fun testIntegratedDukatGroovyDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukat(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.EXTENSION
)
}
private fun testIntegratedDukat(
gradleVersion: GradleVersion,
dslType: DslType,
dependenciesLocation: DependenciesLocation
) {
val projectName = projectName(dslType, dependenciesLocation)
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
project(
projectName = projectName(dslType, dependenciesLocation, PROJECTS_PREFIX),
gradleVersion
) {
gradleProperties.modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
val externalSrcs = "build/externals/$projectName/src"
project.build("compileKotlinJs") {
assertSuccessful()
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
build("compileKotlinJs") {
assertFileInProjectExists("build/externals/${projectName(dslType, dependenciesLocation)}/src/index.module_decamelize.kt")
}
}
}
@Test
fun testIntegratedDukatWithChangeKotlinDslRootDependencies() {
@DisplayName("Kotlin DSL: change in root dependencies")
@GradleTest
fun testIntegratedDukatWithChangeKotlinDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithChange(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatWithChangeKotlinDslExtDependencies() {
@DisplayName("Kotlin DSL: change in external dependencies")
@GradleTest
fun testIntegratedDukatWithChangeKotlinDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithChange(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.EXTENSION
)
}
@Test
fun testIntegratedDukatWithChangeGroovyDslRootDependencies() {
@DisplayName("Groovy DSL: change in root dependencies")
@GradleTest
fun testIntegratedDukatWithChangeGroovyDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithChange(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatWithChangeGroovyDslExtDependencies() {
@DisplayName("Groovy DSL: change in external dependencies")
@GradleTest
fun testIntegratedDukatWithChangeGroovyDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithChange(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.EXTENSION
)
}
private fun testIntegratedDukatWithChange(
gradleVersion: GradleVersion,
dslType: DslType,
dependenciesLocation: DependenciesLocation
) {
val projectName = projectName(dslType, dependenciesLocation)
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
project(
projectName = projectName(dslType, dependenciesLocation, PROJECTS_PREFIX),
gradleVersion
) {
gradleProperties.modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
val externalSrcs = "build/externals/$projectName/src"
project.build("compileKotlinJs") {
assertSuccessful()
val externalSrcs = "build/externals/${projectName(dslType, dependenciesLocation)}/src"
build("compileKotlinJs") {
assertFileInProjectExists("$externalSrcs/index.module_decamelize.kt")
}
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
}
buildFileForDslType(dslType).modify { buildScript ->
buildScript
.replace(
"""implementation(npm("left-pad", "1.3.0"))""",
"""implementation(npm("left-pad", "1.3.0", true))"""
)
.replace(
"""implementation(npm("decamelize", "4.0.0", true))""",
"""implementation(npm("decamelize", "4.0.0"))"""
)
}
project.gradleBuildScript().modify { buildScript ->
buildScript
.replace(
"""implementation(npm("left-pad", "1.3.0"))""",
"""implementation(npm("left-pad", "1.3.0", true))"""
)
.replace(
"""implementation(npm("decamelize", "4.0.0", true))""",
"""implementation(npm("decamelize", "4.0.0"))"""
)
}
project.build("generateExternalsIntegrated") {
assertSuccessful()
assertSingleFileExists(externalSrcs, "index.module_left-pad.kt")
build("generateExternalsIntegrated") {
assertFileInProjectExists("$externalSrcs/index.module_left-pad.kt")
}
}
}
@Test
fun testIntegratedDukatWithFalseDefaultKotlinDslRootDependencies() {
@DisplayName("Kotlin DSL: with false default root dependencies")
@GradleTest
fun testIntegratedDukatWithFalseDefaultKotlinDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithFalseDefault(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatWithFalseDefaultKotlinDslExtDependencies() {
@DisplayName("Kotlin DSL: with false external dependencies")
@GradleTest
fun testIntegratedDukatWithFalseDefaultKotlinDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithFalseDefault(
gradleVersion,
DslType.KOTLIN,
DependenciesLocation.EXTENSION
)
}
@Test
fun testIntegratedDukatWithFalseDefaultGroovyDslRootDependencies() {
@DisplayName("Groovy DSL: with false root dependencies")
@GradleTest
fun testIntegratedDukatWithFalseDefaultGroovyDslRootDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithFalseDefault(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.ROOT
)
}
@Test
fun testIntegratedDukatWithFalseDefaultGroovyDslExtDependencies() {
@DisplayName("Groovy DSL: with false external dependencies")
@GradleTest
fun testIntegratedDukatWithFalseDefaultGroovyDslExtDependencies(gradleVersion: GradleVersion) {
testIntegratedDukatWithFalseDefault(
gradleVersion,
DslType.GROOVY,
DependenciesLocation.EXTENSION
)
}
private fun testIntegratedDukatWithFalseDefault(
gradleVersion: GradleVersion,
dslType: DslType,
dependenciesLocation: DependenciesLocation
) {
val projectName = projectName(dslType, dependenciesLocation)
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"""
project(
projectName = projectName(dslType, dependenciesLocation, PROJECTS_PREFIX),
gradleVersion
) {
gradleProperties.modify {
"""
kotlin.js.generate.externals=true
${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}
""".trimIndent()
}
buildFileForDslType(dslType).modify { buildScript ->
buildScript
.replace(
"""implementation(npm("decamelize", "4.0.0", true))""",
"""implementation(npm("decamelize", "4.0.0", false))"""
)
}
val externalSrcs = "build/externals/${projectName(dslType, dependenciesLocation)}/src"
build("generateExternalsIntegrated") {
assertFileInProjectExists("$externalSrcs/index.module_left-pad.kt")
}
}
}
}
project.gradleBuildScript().modify { buildScript ->
buildScript
.replace(
"""implementation(npm("decamelize", "4.0.0", true))""",
"""implementation(npm("decamelize", "4.0.0", false))"""
)
}
@DisplayName("Dukat in js BOTH mode")
@JsGradlePluginTests
class DukatIntegrationBothModeIT : KGPBaseTest() {
val externalSrcs = "build/externals/$projectName/src"
project.build("generateExternalsIntegrated") {
assertSuccessful()
@DisplayName("Dependencies are generated only once")
@GradleTest
fun testBothOnlyOnceGenerateDependencies(gradleVersion: GradleVersion) {
project("dukat-integration/both", gradleVersion) {
gradleProperties.modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
assertSingleFileExists(externalSrcs, "index.module_left-pad.kt")
val externalSrcs = "build/externals/both-js-ir/src"
build("compileKotlinJsLegacy") {
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertFileInProjectExists("$externalSrcs/index.module_decamelize.kt")
val legacyExternals = projectPath.resolve("build/externals/both-js-legacy/src")
assertFileNotExists(legacyExternals)
}
build(
"compileKotlinJsLegacy",
"--rerun-tasks"
) {
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertFileInProjectExists("$externalSrcs/index.module_decamelize.kt")
}
}
}
@Test
fun testBothOnlyOnceGenerateDependencies() {
val project = Project(
projectName = "both",
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}"
}
val externalSrcs = "build/externals/both-js-ir/src"
project.build("compileKotlinJsLegacy") {
assertSuccessful()
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
val legacyExternals = "build/externals/both-js-legacy/src"
val directoryFile = fileInWorkingDir(legacyExternals)
assertTrue(
!directoryFile.exists(),
"[$legacyExternals] should not contain files"
)
}
project.build(
"compileKotlinJsLegacy",
"--rerun-tasks"
) {
assertSuccessful()
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
}
}
@Test
fun testCompilationLegacyBinariesGroovyDsl() {
@DisplayName("Groovy DSL: compilation")
@GradleTest
fun testCompilationLegacyBinariesGroovyDsl(gradleVersion: GradleVersion) {
testCompilationLegacyBinaries(
gradleVersion,
DslType.GROOVY
)
}
@Test
fun testCompilationLegacyBinariesKotlinDsl() {
@DisplayName("Kotlin DSL: compilation")
@GradleTest
fun testCompilationLegacyBinariesKotlinDsl(gradleVersion: GradleVersion) {
testCompilationLegacyBinaries(
gradleVersion,
DslType.KOTLIN
)
}
private fun testCompilationLegacyBinaries(
gradleVersion: GradleVersion,
dslType: DslType
) {
val projectName = projectName(dslType, DependenciesLocation.EXTENSION)
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.build("compileKotlinJs") {
assertSuccessful()
project(
projectName(dslType, DependenciesLocation.EXTENSION, PROJECTS_PREFIX),
gradleVersion
) {
build("compileKotlinJs")
}
}
@Test
fun testAssembleBothBinaries() {
val projectName = "both"
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.build("assemble", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) {
assertSuccessful()
@DisplayName("Assemble both binaries")
@GradleTest
fun testAssembleBothBinaries(gradleVersion: GradleVersion) {
project("${PROJECTS_PREFIX}/both", gradleVersion) {
// Warning mode 'Summary' because
// > Execution optimizations have been disabled for task ':kotlinSourcesJar' to ensure correctness due to the following reasons
build(
"assemble",
buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Summary)
)
}
}
@Test
fun testCompileLegacyBothBinaries() {
val projectName = "both"
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"""
@DisplayName("Compile both binaries in legacy mode")
@GradleTest
fun testCompileLegacyBothBinaries(gradleVersion: GradleVersion) {
project("$PROJECTS_PREFIX/both", gradleVersion) {
gradleProperties.modify {
"""
${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.BINARY}
""".trimIndent()
}
}
val externalSrcs = "build/externals/both-js-legacy/src"
project.build("compileKotlinJsLegacy") {
assertSuccessful()
val externalSrcs = "build/externals/both-js-legacy/src"
build("compileKotlinJsLegacy") {
assertFileInProjectExists("$externalSrcs/index.d.jar")
assertSingleFileExists(externalSrcs, "index.d.jar")
val irExternals = "build/externals/both-js-ir/src"
val directoryFile = fileInWorkingDir(irExternals)
assertTrue(
!directoryFile.exists(),
"[$irExternals] should not contain files"
)
}
}
@Test
fun testAssembleBothSource() {
val projectName = "both"
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"""
${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}
""".trimIndent()
}
val externalSrcs = "build/externals/both-js-ir/src"
project.build("assemble", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) {
assertSuccessful()
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
val legacyExternals = "build/externals/both-js-legacy/src"
val directoryFile = fileInWorkingDir(legacyExternals)
assertTrue(
!directoryFile.exists(),
"[$legacyExternals] should not contain files"
)
}
}
@Test
fun testWithoutGenerateExternals() {
val projectName = "without-generate-externals"
val project = Project(
projectName = projectName,
directoryPrefix = "dukat-integration"
)
project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.build("assemble", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) {
assertSuccessful()
assertTasksNotExecuted(":generateExternalsIntegrated")
assertFalse("Dukat don't need to be dependency for thus project") {
fileInWorkingDir("build/js/packages/without-generate-externals")
.resolve(NpmProject.PACKAGE_JSON)
.let {
Gson().fromJson(it.readText(), PackageJson::class.java)
}.dependencies.containsKey("dukat")
val irExternals = "build/externals/both-js-ir/src"
assertFileInProjectNotExists(irExternals)
}
}
}
private fun projectName(
dslType: DslType,
dependenciesLocation: DependenciesLocation
): String =
"${dslType.value}-${dependenciesLocation.value}"
@DisplayName("Assemble both sources")
@GradleTest
fun testAssembleBothSource(gradleVersion: GradleVersion) {
project("$PROJECTS_PREFIX/both", gradleVersion) {
gradleProperties.modify {
"""
${ExternalsOutputFormat.externalsOutputFormatProperty}=${ExternalsOutputFormat.SOURCE}
""".trimIndent()
}
private enum class DslType(
val value: String
) {
KOTLIN("kotlin-dsl"),
GROOVY("groovy-dsl")
val externalSrcs = "build/externals/both-js-ir/src"
build("assemble", buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Summary)) {
assertTasksExecuted(":irGenerateExternalsIntegrated")
assertFileInProjectExists("$externalSrcs/index.module_decamelize.kt")
val legacyExternals = "build/externals/both-js-legacy/src"
assertFileInProjectNotExists(legacyExternals)
}
}
}
private enum class DependenciesLocation(
val value: String
) {
ROOT("root"),
EXTENSION("ext")
@DisplayName("Without generating externals")
@GradleTest
fun testWithoutGenerateExternals(gradleVersion: GradleVersion) {
project("$PROJECTS_PREFIX/without-generate-externals", gradleVersion) {
build("assemble", buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Summary)) {
assertTasksSkipped(":generateExternalsIntegrated")
assert(
!projectPath
.resolve("build/js/packages/without-generate-externals")
.resolve(NpmProject.PACKAGE_JSON)
.let {
Gson().fromJson(it.readText(), PackageJson::class.java)
}
.dependencies
.containsKey("dukat")
) {
"Dukat don't need to be dependency for thus project"
}
}
}
}
}
private fun projectName(
dslType: DslType,
dependenciesLocation: DependenciesLocation,
directoryPrefix: String = ""
): String =
"$directoryPrefix/${dslType.value}-${dependenciesLocation.value}"
private enum class DslType(
val value: String
) {
KOTLIN("kotlin-dsl"),
GROOVY("groovy-dsl")
}
private enum class DependenciesLocation(
val value: String
) {
ROOT("root"),
EXTENSION("ext")
}
private fun TestProject.buildFileForDslType(dslType: DslType) =
when (dslType) {
DslType.KOTLIN -> buildGradleKts
DslType.GROOVY -> buildGradle
}
private const val PROJECTS_PREFIX = "dukat-integration"
@@ -1,5 +1,5 @@
plugins {
kotlin("js") version "<pluginMarkerVersion>"
kotlin("js")
}
repositories {
@@ -1,5 +1,5 @@
plugins {
id("org.jetbrains.kotlin.js") version "<pluginMarkerVersion>"
id("org.jetbrains.kotlin.js")
}
repositories {
@@ -1,5 +1,5 @@
plugins {
id("org.jetbrains.kotlin.js") version "<pluginMarkerVersion>"
id("org.jetbrains.kotlin.js")
}
repositories {
@@ -1,5 +1,5 @@
plugins {
kotlin("js") version "<pluginMarkerVersion>"
kotlin("js")
}
repositories {
@@ -1,5 +1,5 @@
plugins {
kotlin("js") version "<pluginMarkerVersion>"
kotlin("js")
}
repositories {
@@ -1,5 +1,5 @@
plugins {
kotlin("js") version "<pluginMarkerVersion>"
kotlin("js")
}
repositories {