diff --git a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt index d7bdc23a2e4..02322a86a33 100644 --- a/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt +++ b/packages/flutter_tools/gradle/src/main/kotlin/FlutterPluginUtils.kt @@ -12,12 +12,14 @@ import com.android.build.gradle.tasks.ProcessAndroidResources import com.android.builder.model.BuildType import com.flutter.gradle.plugins.PluginHandler import com.flutter.gradle.tasks.DeepLinkJsonFromManifestTask +import com.flutter.gradle.tasks.PrintTask import groovy.lang.Closure import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.UnknownTaskException import org.gradle.api.logging.Logger +import org.gradle.kotlin.dsl.register import java.io.File import java.nio.charset.StandardCharsets import java.util.Properties @@ -708,12 +710,10 @@ object FlutterPluginUtils { @JvmStatic @JvmName("addTaskForJavaVersion") internal fun addTaskForJavaVersion(project: Project) { - project.tasks.register("javaVersion") { + project.tasks.register("javaVersion") { description = "Print the current java version used by gradle. see: " + "https://docs.gradle.org/current/javadoc/org/gradle/api/JavaVersion.html" - doLast { - println(VersionFetcher.getJavaVersion()) - } + message.set(VersionFetcher.getJavaVersion().toString()) } } @@ -727,11 +727,9 @@ object FlutterPluginUtils { @JvmStatic @JvmName("addTaskForKGPVersion") internal fun addTaskForKGPVersion(project: Project) { - project.tasks.register("kgpVersion") { + project.tasks.register("kgpVersion") { description = "Print the current kgp version used by the project." - doLast { - println("KGP Version: " + VersionFetcher.getKGPVersion(project).toString()) - } + message.set(project.provider { "KGP Version: " + VersionFetcher.getKGPVersion(project).toString() }) } } @@ -748,16 +746,19 @@ object FlutterPluginUtils { @JvmStatic @JvmName("addTaskForPrintBuildVariants") internal fun addTaskForPrintBuildVariants(project: Project) { - // Groovy was dynamically getting a different subtype here than our Kotlin getAndroidExtension method. - // TODO(gmackall): We should take another pass at the different types we are using in our conversion of - // the groovy `flutter.android` lines. - val androidExtension = project.extensions.getByType(AbstractAppExtension::class.java) - project.tasks.register("printBuildVariants") { + project.tasks.register("printBuildVariants") { description = "Prints out all build variants for this Android project" - doLast { + project.provider { + // Groovy was dynamically getting a different subtype here than our Kotlin getAndroidExtension method. + // TODO(gmackall): We should take another pass at the different types we are using in our conversion of + // the groovy `flutter.android` lines. + val androidExtension = project.extensions.getByType(AbstractAppExtension::class.java) + + val messageBuilder = StringBuilder() androidExtension.applicationVariants.forEach { variant -> - println("BuildVariant: ${variant.name}") + messageBuilder.append("BuildVariant: ${variant.name}\n") } + message.set(messageBuilder.toString()) } } } diff --git a/packages/flutter_tools/gradle/src/main/kotlin/tasks/PrintTask.kt b/packages/flutter_tools/gradle/src/main/kotlin/tasks/PrintTask.kt new file mode 100644 index 00000000000..2977d5c4665 --- /dev/null +++ b/packages/flutter_tools/gradle/src/main/kotlin/tasks/PrintTask.kt @@ -0,0 +1,16 @@ +package com.flutter.gradle.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction + +abstract class PrintTask : DefaultTask() { + @get:Input + abstract val message: Property + + @TaskAction + fun run() { + println(message.get()) + } +} diff --git a/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginTest.kt b/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginTest.kt index 146c7b89628..7951568069d 100644 --- a/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginTest.kt +++ b/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginTest.kt @@ -10,6 +10,7 @@ import com.android.build.gradle.internal.core.InternalBaseVariant import com.android.build.gradle.tasks.MergeSourceSetFolders import com.android.build.gradle.tasks.ProcessAndroidResources import com.flutter.gradle.tasks.FlutterTask +import com.flutter.gradle.tasks.PrintTask import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject @@ -28,6 +29,7 @@ import org.junit.jupiter.api.io.TempDir import java.nio.file.Path import kotlin.io.path.writeText import kotlin.test.Test +import kotlin.test.assertContains class FlutterPluginTest { @Test @@ -88,8 +90,15 @@ class FlutterPluginTest { flutterPlugin.apply(project) verify { project.tasks.register("generateLockfiles", any()) } - verify { project.tasks.register("javaVersion", any()) } - verify { project.tasks.register("printBuildVariants", any()) } + + val registeredPrintTasks = mutableListOf() + verify { + project.tasks.register(capture(registeredPrintTasks), PrintTask::class.java, any()) + } + + assertContains(registeredPrintTasks, "javaVersion") + assertContains(registeredPrintTasks, "kgpVersion") + assertContains(registeredPrintTasks, "printBuildVariants") } @Test diff --git a/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginUtilsTest.kt b/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginUtilsTest.kt index 9e429f1dfb1..1e61ee771eb 100644 --- a/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginUtilsTest.kt +++ b/packages/flutter_tools/gradle/src/test/kotlin/FlutterPluginUtilsTest.kt @@ -10,6 +10,7 @@ import com.android.build.gradle.internal.dsl.CmakeOptions import com.android.build.gradle.internal.dsl.DefaultConfig import com.android.builder.model.BuildType import com.flutter.gradle.plugins.PluginHandler +import com.flutter.gradle.tasks.PrintTask import io.mockk.called import io.mockk.every import io.mockk.mockk @@ -24,6 +25,8 @@ import org.gradle.api.UnknownTaskException import org.gradle.api.file.Directory import org.gradle.api.file.DirectoryProperty import org.gradle.api.logging.Logger +import org.gradle.api.tasks.TaskContainer +import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.io.TempDir @@ -34,6 +37,7 @@ import kotlin.io.path.createDirectory import kotlin.test.Test import kotlin.test.assertContains import kotlin.test.assertEquals +import kotlin.test.assertNotNull class FlutterPluginUtilsTest { companion object { @@ -1006,40 +1010,54 @@ class FlutterPluginUtilsTest { } } - // addTaskForJavaVersion @Test fun `addTaskForJavaVersion adds task for Java version`() { val project = mockk() - every { project.tasks.register(any(), any>()) } returns mockk() - val captureSlot = slot>() - FlutterPluginUtils.addTaskForJavaVersion(project) - verify { project.tasks.register("javaVersion", capture(captureSlot)) } + val taskContainer = mockk() + every { project.tasks } returns taskContainer + val mockTaskProvider = mockk>() + val mockPrintTask = mockk(relaxed = true) + val captureSlot = slot>() + + every { + project.tasks.register(eq("javaVersion"), PrintTask::class.java, capture(captureSlot)) + } returns mockTaskProvider + + FlutterPluginUtils.addTaskForJavaVersion(project) + captureSlot.captured.execute(mockPrintTask) - val mockTask = mockk() - every { mockTask.description = any() } returns Unit - every { mockTask.doLast(any>()) } returns mockk() - captureSlot.captured.execute(mockTask) verify { - mockTask.description = "Print the current java version used by gradle. see: " + + mockPrintTask.description = "Print the current java version used by gradle. see: " + "https://docs.gradle.org/current/javadoc/org/gradle/api/JavaVersion.html" } + verify { + mockPrintTask.message.set( + withArg { assertNotNull(it.toIntOrNull(), message = "$it java version is not an int") } + ) + } } // addTaskForKGPVersion @Test fun `addTaskForKGPVersion adds task for KGP version`() { val project = mockk() - every { project.tasks.register(any(), any>()) } returns mockk() - val captureSlot = slot>() - FlutterPluginUtils.addTaskForKGPVersion(project) - verify { project.tasks.register("kgpVersion", capture(captureSlot)) } + val taskContainer = mockk() + every { project.tasks } returns taskContainer + val mockTaskProvider = mockk>() + val mockPrintTask = mockk(relaxed = true) + val captureSlot = slot>() + + every { + project.tasks.register(eq("kgpVersion"), PrintTask::class.java, capture(captureSlot)) + } returns mockTaskProvider + every { project.provider(any()) } returns mockTaskProvider + every { mockTaskProvider.configure(any()).hint(PrintTask::class) } + + FlutterPluginUtils.addTaskForKGPVersion(project) + captureSlot.captured.execute(mockPrintTask) - val mockTask = mockk() - every { mockTask.description = any() } returns Unit - every { mockTask.doLast(any>()) } returns mockk() - captureSlot.captured.execute(mockTask) verify { - mockTask.description = "Print the current kgp version used by the project." + mockPrintTask.description = "Print the current kgp version used by the project." } } @@ -1047,21 +1065,23 @@ class FlutterPluginUtilsTest { @Test fun `addTaskForPrintBuildVariants adds task for printing build variants`() { val project = mockk() - every { project.extensions.getByType(AbstractAppExtension::class.java) } returns mockk() - every { project.tasks.register(any(), any>()) } returns mockk() - val captureSlot = slot>() + val taskContainer = mockk() + every { project.tasks } returns taskContainer + val mockTaskProvider = mockk>() + val mockPrintTask = mockk(relaxed = true) + val captureSlot = slot>() + + every { + project.tasks.register(eq("printBuildVariants"), PrintTask::class.java, capture(captureSlot)) + } returns mockTaskProvider + every { project.provider(any()) } returns mockTaskProvider + every { mockTaskProvider.configure(any()).hint(PrintTask::class) } FlutterPluginUtils.addTaskForPrintBuildVariants(project) - - verify { project.tasks.register("printBuildVariants", capture(captureSlot)) } - val mockTask = mockk() - every { mockTask.description = any() } returns Unit - every { mockTask.doLast(any>()) } returns mockk() - - captureSlot.captured.execute(mockTask) + captureSlot.captured.execute(mockPrintTask) verify { - mockTask.description = "Prints out all build variants for this Android project" + mockPrintTask.description = "Prints out all build variants for this Android project" } } }