From 4a44581ae33ccff8332fe125f9b9a3dc7edd5f51 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Wed, 6 Sep 2023 09:25:16 +0530 Subject: [PATCH] tests(tooling-api): add test to ensure task events are dispatched when configuration cache is enabled (#1173) --- subprojects/tooling-api-impl/build.gradle.kts | 1 + .../progress/ForwardingProgressListener.kt | 6 +- .../impl/MultiModuleAndroidProjectTest.kt | 66 +++++++++++++++++-- .../tooling/testing/ToolingApiTestLauncher.kt | 12 ++-- 4 files changed, 75 insertions(+), 10 deletions(-) diff --git a/subprojects/tooling-api-impl/build.gradle.kts b/subprojects/tooling-api-impl/build.gradle.kts index 74e6667dd..971c15fd9 100644 --- a/subprojects/tooling-api-impl/build.gradle.kts +++ b/subprojects/tooling-api-impl/build.gradle.kts @@ -55,6 +55,7 @@ project.tasks.getByName("jar") { project.tasks.getByName("shadowJar") { finalizedBy("copyJar") } dependencies { + implementation(projects.buildInfo) implementation(projects.shared) implementation(projects.subprojects.toolingApi) diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/progress/ForwardingProgressListener.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/progress/ForwardingProgressListener.kt index 1d5800036..ea5e352ff 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/progress/ForwardingProgressListener.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/progress/ForwardingProgressListener.kt @@ -45,7 +45,6 @@ import org.gradle.tooling.events.work.WorkItemStartEvent * A [ProgressListener] which forwards all of its event to [IToolingApiClient]. * @author Akash Yadav */ -@Suppress("UnstableApiUsage") class ForwardingProgressListener : ProgressListener { override fun statusChanged(event: ProgressEvent?) { @@ -66,30 +65,35 @@ class ForwardingProgressListener : ProgressListener { is ProjectConfigurationFinishEvent -> EventTransformer.projectConfigurationFinish(event) else -> EventTransformer.projectConfigurationProgress(event) } + is TaskProgressEvent -> when (event) { is TaskStartEvent -> EventTransformer.taskStart(event) is TaskFinishEvent -> EventTransformer.taskFinish(event) else -> EventTransformer.taskProgress(event) } + is TestProgressEvent -> when (event) { is TestStartEvent -> EventTransformer.testStart(event) is TestFinishEvent -> EventTransformer.testFinish(event) else -> EventTransformer.testProgress(event) } + is TransformProgressEvent -> when (event) { is TransformStartEvent -> EventTransformer.transformStart(event) is TransformFinishEvent -> EventTransformer.transformFinish(event) else -> EventTransformer.transformProgress(event) } + is WorkItemProgressEvent -> when (event) { is WorkItemStartEvent -> EventTransformer.workStart(event) is WorkItemFinishEvent -> EventTransformer.workFinish(event) else -> EventTransformer.workProgress(event) } + is StatusEvent -> EventTransformer.statusEvent(event) else -> when (event) { diff --git a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt index 6283dd150..20c0ffac0 100644 --- a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt +++ b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/MultiModuleAndroidProjectTest.kt @@ -26,22 +26,21 @@ import com.itsaky.androidide.tooling.api.IJavaProject import com.itsaky.androidide.tooling.api.IProject import com.itsaky.androidide.tooling.api.IToolingApiServer import com.itsaky.androidide.tooling.api.ProjectType -import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams -import com.itsaky.androidide.tooling.api.messages.result.InitializeResult +import com.itsaky.androidide.tooling.api.messages.TaskExecutionMessage import com.itsaky.androidide.tooling.api.models.AndroidProjectMetadata import com.itsaky.androidide.tooling.api.models.JavaModuleExternalDependency import com.itsaky.androidide.tooling.api.models.JavaModuleProjectDependency import com.itsaky.androidide.tooling.api.models.JavaProjectMetadata import com.itsaky.androidide.tooling.api.models.params.StringParameter +import com.itsaky.androidide.tooling.events.ProgressEvent +import com.itsaky.androidide.tooling.events.task.TaskStartEvent import com.itsaky.androidide.tooling.testing.ToolingApiTestLauncher import com.itsaky.androidide.tooling.testing.ToolingApiTestLauncher.MultiVersionTestClient -import com.itsaky.androidide.utils.FileProvider import com.itsaky.androidide.utils.ILogger import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 -import kotlin.io.path.deleteExisting -import kotlin.io.path.pathString +import java.util.concurrent.CompletableFuture /** @author Akash Yadav */ @RunWith(JUnit4::class) @@ -54,6 +53,63 @@ class MultiModuleAndroidProjectTest { doAssertions(project, server) } + @Test + fun `test task name should be shown if gradle configuration cache is enabled`() { + + // Issue #1173 + + val taskPaths = mutableListOf() + val client = object : MultiVersionTestClient() { + + override fun getBuildArguments(): CompletableFuture> { + return CompletableFuture.completedFuture(super.getBuildArguments().get().toMutableList() + .also { it.add("--configuration-cache") }) + } + + override fun onProgressEvent(event: ProgressEvent) { + if (event is TaskStartEvent) { + taskPaths.add(event.descriptor.taskPath) + } + } + } + + val (server, project, result) = ToolingApiTestLauncher().launchServer(client = client) + assertThat(server).isNotNull() + assertThat(project).isNotNull() + assertThat(result?.isSuccessful).isTrue() + + println("Executed tasks during initialization : " + taskPaths.joinToString( + separator = System.lineSeparator())) + taskPaths.clear() + + val (isSuccessful, failure) = server.executeTasks(TaskExecutionMessage( + projectPath = ":android-library", + tasks = listOf("assembleDebug"), + gradleDistribution = client.gradleDistParams + )).get() + + if (failure != null) { + println("Failure: $failure") + } + + assertThat(isSuccessful).isTrue() + assertThat(failure).isNull() + + assertThat(taskPaths).isNotNull() + assertThat(taskPaths.size).isGreaterThan(10) + assertThat(taskPaths).containsAtLeastElementsIn( + arrayOf( + "preBuild", + "generateDebugResources", + "compileDebugJavaWithJavac", + "assembleDebug" + ).map { ":android-library:$it" } + ) + println( + "Executed tasks during build : " + taskPaths.joinToString(separator = System.lineSeparator()) + ) + } + private fun doAssertions(project: IProject, server: IToolingApiServer) { assertThat(project).isNotNull() diff --git a/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt b/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt index 6bc6e0880..d67cfdf49 100644 --- a/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt +++ b/subprojects/tooling-api-testing/src/main/java/com/itsaky/androidide/tooling/testing/ToolingApiTestLauncher.kt @@ -69,7 +69,7 @@ class ToolingApiTestLauncher { client: MultiVersionTestClient = MultiVersionTestClient(), initParams: InitializeProjectParams = InitializeProjectParams( projectDir.pathString, - GradleDistributionParams.forVersion(client.gradleVersion) + client.gradleDistParams ), log: ILogger = ILogger.newInstance("BuildOutputLogger") ): Triple { @@ -123,13 +123,17 @@ class ToolingApiTestLauncher { return cmd } - class MultiVersionTestClient( + open class MultiVersionTestClient( private val projectDir: Path = FileProvider.testProjectRoot(), var agpVersion: String = DEFAULT_AGP_VERSION, var gradleVersion: String = DEFAULT_GRADLE_VERSION, - val log: ILogger = ILogger.newInstance(MultiVersionTestClient::class.simpleName) + private val log: ILogger = ILogger.newInstance(MultiVersionTestClient::class.simpleName), + private val extraArgs : List = emptyList() ) : IToolingApiClient { + val gradleDistParams: GradleDistributionParams + get() = GradleDistributionParams.forVersion(this.gradleVersion) + companion object { const val buildFile = "build.gradle" @@ -176,7 +180,7 @@ class ToolingApiTestLauncher { override fun onProgressEvent(event: ProgressEvent) {} override fun getBuildArguments(): CompletableFuture> { - return CompletableFuture.completedFuture(listOf("--stacktrace", "--info")) + return CompletableFuture.completedFuture(mutableListOf("--stacktrace", "--info").also { it.addAll(extraArgs) }) } override fun checkGradleWrapperAvailability(): CompletableFuture =