From 525561eec36e09fab99315d1b58a83c2e83597b1 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 10 Jan 2018 13:41:48 +0700 Subject: [PATCH] [gradle-plugin] Add tests for custom targets and artifact paths --- build.gradle | 6 +- .../kotlin-native-gradle-plugin/build.gradle | 6 +- .../settings.gradle | 7 +- .../test/IncrementalSpecification.groovy | 1 - .../gradle/plugin/test/KonanProject.groovy | 6 +- .../plugin/test/LibrarySpecification.groovy | 2 - .../plugin/test/PathSpecification.groovy | 38 ++++++++++ .../plugin/test/TaskSpecification.groovy | 74 +++++++++++++++++++ 8 files changed, 131 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index d23d55fbb1a..c0777dcfc60 100644 --- a/build.gradle +++ b/build.gradle @@ -158,7 +158,11 @@ task gradlePluginJar { dependsOn gradle.includedBuild('kotlin-native-gradle-plugin').task(':shadowJar') } -task uploadGradlePlugin { +task gradlePluginCheck() { + dependsOn gradle.includedBuild('kotlin-native-gradle-plugin').task(':check') +} + +task gradlePluginUpload { dependsOn gradle.includedBuild('kotlin-native-gradle-plugin').task(':bintrayUpload') } diff --git a/tools/kotlin-native-gradle-plugin/build.gradle b/tools/kotlin-native-gradle-plugin/build.gradle index 4d979c868bd..88dd9c9cea4 100644 --- a/tools/kotlin-native-gradle-plugin/build.gradle +++ b/tools/kotlin-native-gradle-plugin/build.gradle @@ -97,7 +97,7 @@ test { if (project.hasProperty("konan.home")) { systemProperty("konan.home", project.property("konan.home")) } else { - dependsOn ':dist' + // The Koltin/Native compiler must be built before test execution. systemProperty("konan.home", distDir.absolutePath) } if (project.hasProperty("konan.jvmArgs")) { @@ -108,6 +108,10 @@ test { if (project.hasProperty("maxParallelForks")) { maxParallelForks=project.property("maxParallelForks") } + if (project.hasProperty("filter")) { + filter.includeTestsMatching project.property("filter") + } + } processResources { diff --git a/tools/kotlin-native-gradle-plugin/settings.gradle b/tools/kotlin-native-gradle-plugin/settings.gradle index 9157a1bfcb5..3d4e8769a9e 100644 --- a/tools/kotlin-native-gradle-plugin/settings.gradle +++ b/tools/kotlin-native-gradle-plugin/settings.gradle @@ -1 +1,6 @@ -rootProject.name = "kotlin-native-gradle-plugin" \ No newline at end of file +rootProject.name = "kotlin-native-gradle-plugin" +// A hack to run the gradle plugin build not from the root build without +// specifying '--include-build ../../shared' in the command line. +if (gradle.parent == null) { + includeBuild '../../shared' +} \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy index fd09fa825f3..19706852671 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy @@ -2,7 +2,6 @@ package org.jetbrains.kotlin.gradle.plugin.test import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome -import spock.lang.IgnoreIf import spock.lang.Unroll class IncrementalSpecification extends BaseKonanSpecification { diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy index 80d9f6add7e..7b5abea5dfa 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy @@ -1,7 +1,6 @@ package org.jetbrains.kotlin.gradle.plugin.test import org.gradle.testkit.runner.GradleRunner -import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.TargetManager import java.nio.file.Files @@ -12,7 +11,9 @@ enum ArtifactType { PROGRAM("program"), LIBRARY("library"), BITCODE("bitcode"), - INTEROP("interop") + INTEROP("interop"), + DYNAMIC("dynamic"), + FRAMEWORK("framework") String type ArtifactType(String type) { this.type = type } @@ -199,7 +200,6 @@ class KonanProject { konan.home=$konanHome ${!konanJvmArgs.isEmpty() ? "konan.jvmArgs=$konanJvmArgs\n" : ""} """.stripIndent()) - println(propertiesFile.text) return propertiesFile } diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/LibrarySpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/LibrarySpecification.groovy index 0782e3553c1..9dbf83ca8c8 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/LibrarySpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/LibrarySpecification.groovy @@ -1,7 +1,5 @@ package org.jetbrains.kotlin.gradle.plugin.test -import spock.lang.Ignore - class LibrarySpecification extends BaseKonanSpecification { def libraries = [ diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy index 83103b774dc..a586d227a38 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/PathSpecification.groovy @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.gradle.plugin.test import org.gradle.testkit.runner.TaskOutcome +import org.jetbrains.kotlin.konan.target.TargetManager class PathSpecification extends BaseKonanSpecification { @@ -8,6 +9,43 @@ class PathSpecification extends BaseKonanSpecification { project.konanBuildDir.toPath().resolve(path).toFile().exists() } + def 'Plugin should provide a correct path to the artifacts created'() { + expect: + def project = KonanProject.createEmpty( + projectDirectory, + new TargetManager('host') + .getTargets() + .findAll { k, v -> v.enabled } + .collect { k, v -> k } + ) { KonanProject it -> + it.generateSrcFile("main.kt") + it.generateDefFile("interop.def", "") + it.buildFile.append(""" + konanArtifacts { + program('program') + library('library') + bitcode('bitcode') + interop('interop') + framework('framework') + dynamic('dynamic') + } + + task checkArtifacts(type: DefaultTask) { + dependsOn(':build') + doLast { + for(artifact in konanArtifacts) { + for (target in artifact) { + if (!target.artifact.exists()) throw new Exception("Artifact doesn't exist. Type: \${artifact.name}, target: \${target.target}") + } + } + } + } + """.stripIndent()) + } + project.createRunner().withArguments("checkArtifacts").build() + + } + def 'Plugin should create all necessary directories'() { when: def project = KonanProject.createWithInterop(projectDirectory) diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/TaskSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/TaskSpecification.groovy index 31bbb5e8ed5..fe7aeaa6524 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/TaskSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/TaskSpecification.groovy @@ -2,6 +2,9 @@ package org.jetbrains.kotlin.gradle.plugin.test import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome +import org.jetbrains.kotlin.konan.target.KonanTarget +import org.jetbrains.kotlin.konan.target.TargetManager +import spock.lang.Requires import spock.lang.Unroll class TaskSpecification extends BaseKonanSpecification { @@ -55,6 +58,77 @@ class TaskSpecification extends BaseKonanSpecification { "includeDirs" | "" } + @Requires({ TargetManager.host == KonanTarget.MACBOOK }) + def 'Plugin should create framework tasks only for Apple targets'() { + when: + def project = KonanProject.createEmpty(projectDirectory) { KonanProject it -> + it.buildFile.append(""" + konan.targets = ['wasm32', 'macbook', 'iphone', 'iphone_sim'] + + konanArtifacts { + framework('foo') + } + """.stripIndent()) + } + def result = project.createRunner().withArguments('tasks', '--all').build() + + then: + !compilationTaskExists(result,'foo', 'wasm32') + compilationTaskExists (result,'foo', 'macbook') + compilationTaskExists (result,'foo', 'iphone') + compilationTaskExists (result,'foo', 'iphone_sim') + } + + def 'Plugin should support different targets for different artifacts'() { + when: + def project = KonanProject.createEmpty(projectDirectory, ['host']) { KonanProject it -> + it.buildFile.append(""" + konanArtifacts { + program('defaultTarget') + program('customTarget', targets: ['wasm32']) + program('customTargets', targets: ['host', 'wasm32']) + } + """.stripIndent()) + } + def result = project.createRunner().withArguments('tasks', '--all').build() + def hostName = TargetManager.getHostName() + + then: + compilationTaskExists (result, 'defaultTarget', hostName) + !compilationTaskExists(result, 'defaultTarget', 'wasm32') + !compilationTaskExists(result, 'customTarget', hostName) + compilationTaskExists (result, 'customTarget', 'wasm32') + compilationTaskExists (result, 'customTargets', hostName) + compilationTaskExists (result, 'customTargets', 'wasm32') + } + + def 'Plugin should not create dynamic task for wasm'() { + when: + def project = KonanProject.createEmpty(projectDirectory) { KonanProject it -> + it.buildFile.append(""" + konan.targets = ['wasm32'] + + konanArtifacts { + dynamic('foo') + } + """.stripIndent()) + } + def result = project.createRunner().withArguments('tasks', '--all').build() + + then: + !compilationTaskExists(result, 'foo', 'wasm32') + } + + + boolean taskExists(BuildResult result, String taskName) { + def taskNameForSearch = taskName.startsWith(':') ? taskName.substring(1) : taskName + return result.output.contains(taskNameForSearch) + } + + boolean compilationTaskExists(BuildResult result, String artifactName, String targetName) { + return taskExists(result, KonanProject.compilationTask(artifactName, targetName)) + } + BuildResult failOnPropertyAccess(KonanProject project, String property) { project.buildFile.append(""" task testTask(type: DefaultTask) {