tests(tooling-api): add test to ensure task events are dispatched when configuration cache is enabled (#1173)

This commit is contained in:
Akash Yadav
2023-09-06 09:25:16 +05:30
parent 47ecf43b9c
commit 4a44581ae3
4 changed files with 75 additions and 10 deletions
@@ -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)
@@ -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) {
@@ -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<String>()
val client = object : MultiVersionTestClient() {
override fun getBuildArguments(): CompletableFuture<List<String>> {
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()
@@ -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<IToolingApiServer, IProject, InitializeResult?> {
@@ -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<String> = 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<List<String>> {
return CompletableFuture.completedFuture(listOf("--stacktrace", "--info"))
return CompletableFuture.completedFuture(mutableListOf("--stacktrace", "--info").also { it.addAll(extraArgs) })
}
override fun checkGradleWrapperAvailability(): CompletableFuture<GradleWrapperCheckResult> =