Skip to content

Commit

Permalink
[Infra] Count tests in CI (#5181)
Browse files Browse the repository at this point in the history
* count tests

* make ciBuild depend on test aggregation
  • Loading branch information
martinbonnin authored Aug 16, 2023
1 parent 22720f6 commit b141b76
Show file tree
Hide file tree
Showing 13 changed files with 121 additions and 16 deletions.
26 changes: 26 additions & 0 deletions build-logic/src/main/kotlin/Common.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@

import org.gradle.api.Project
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.Usage
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest


fun Project.commonSetup() {
pluginManager.withPlugin("org.jetbrains.kotlin.jvm") {
tasks.register("ft") {
Expand All @@ -19,4 +24,25 @@ fun Project.commonSetup() {
}
}
}

configureTestAggregation()
}

private fun Project.configureTestAggregation() {
val configuration = configurations.create("apolloTestAggregationProducer") {
isCanBeConsumed = true
isCanBeResolved = false

attributes {
attribute(USAGE_ATTRIBUTE, objects.named(Usage::class.java, "apolloTestAggregation"))
}
}

tasks.withType(AbstractTestTask::class.java).configureEach {
configuration.getOutgoing().artifact(
this.binaryResultsDirectory
) {
setType(ArtifactTypeDefinition.DIRECTORY_TYPE)
}
}
}
70 changes: 70 additions & 0 deletions build-logic/src/main/kotlin/RootProject.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@

import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.internal.tasks.testing.junit.result.TestClassResult
import org.gradle.api.internal.tasks.testing.junit.result.TestResultSerializer
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import java.io.File

fun Project.rootSetup(ciBuild: TaskProvider<Task>) {
val apolloTestAggregationConsumer = configurations.create("apolloTestAggregationConsumer") {
isCanBeConsumed = false
isCanBeResolved = true

attributes {
attribute(org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, objects.named(org.gradle.api.attributes.Usage::class.java, "apolloTestAggregation"))
}
}

allprojects.forEach {
dependencies.add("apolloTestAggregationConsumer", it)
}

val task = tasks.register("apolloTestAggregation", GenerateApolloTestAggregation::class.java) {
binaryTestResults.from(apolloTestAggregationConsumer)

output = file("build/apolloTestAggregation.txt")
}

ciBuild.configure {
dependsOn(task)
}
}

abstract class GenerateApolloTestAggregation : DefaultTask() {
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val binaryTestResults: ConfigurableFileCollection

@get:OutputFile
abstract var output: File

@TaskAction
fun taskAction() {
var count = 0
val result = binaryTestResults.files.map { binaryDir ->
val classResults = mutableListOf<TestClassResult>()
TestResultSerializer(binaryDir).read {
classResults.add(this)
}

binaryDir.parentFile to classResults
}.flatMap { (parent, classResults) ->
classResults.map { classResult ->
count += classResult.results.size
String.format("%-100s - %-40s - %5d", classResult.className, parent.name, classResult.results.size)
}
}.sorted()
.joinToString("\n")

output.writeText(result + "\ntotal: $count")
println("test executed: $count")
}
}
6 changes: 5 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import JapiCmp.configureJapiCmp
import org.gradle.api.internal.tasks.testing.junit.result.TestClassResult
import org.gradle.api.internal.tasks.testing.junit.result.TestResultSerializer

plugins {
id("apollo.library") apply false
Expand Down Expand Up @@ -93,7 +95,7 @@ tasks.register("ciTestsNoGradle") {
}
}

tasks.register("ciBuild") {
val ciBuild = tasks.register("ciBuild") {
description = "Execute the 'build' task in each subproject"
dependsOn(subprojectTasks("build"))
}
Expand Down Expand Up @@ -160,3 +162,5 @@ tasks.register("rmbuild") {
}.count()
}
}

rootSetup(ciBuild)
2 changes: 1 addition & 1 deletion libraries/apollo-ast/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,4 @@ tasks.withType<KotlinNativeTest>().configureEach {

tasks.withType<KotlinJsTest>().configureEach {
environment("MODULE_ROOT", projectDir.toString())
}
}
4 changes: 3 additions & 1 deletion tests/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {

rootProject.configureNode()

tasks.register("ciBuild") {
val ciBuild = tasks.register("ciBuild") {
description = """Execute the 'build' task in subprojects and the `termination:run` task too"""
subprojects {
this@register.dependsOn(tasks.matching { it.name == "build" })
Expand All @@ -15,3 +15,5 @@ tasks.register("ciBuild") {
checkGitStatus()
}
}

rootSetup(ciBuild)
4 changes: 2 additions & 2 deletions tests/multi-module-1/child/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ plugins {

dependencies {
implementation(libs.apollo.runtime)
implementation(project(":multi-module-1:root"))
implementation(project(":multi-module-1-root"))
testImplementation(libs.kotlin.test.junit)
}

apollo {
service("service") {
dependsOn(project(":multi-module-1:root"))
dependsOn(project(":multi-module-1-root"))
packageName.set("multimodule1.child")
flattenModels.set(false)
}
Expand Down
4 changes: 2 additions & 2 deletions tests/multi-module-1/file-path/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ plugins {

dependencies {
implementation(libs.apollo.runtime)
implementation(project(":multi-module-1:root"))
implementation(project(":multi-module-1-root"))
testImplementation(libs.kotlin.test.junit)
}

apollo {
service("service") {
packageNamesFromFilePaths()
dependsOn(project(":multi-module-1:root"))
dependsOn(project(":multi-module-1-root"))
}
}
4 changes: 2 additions & 2 deletions tests/multi-module-1/root/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ apollo {
packageName.set("multimodule1.root")
generateApolloMetadata.set(true)
mapScalar("Long", "kotlin.Long")
isADependencyOf(project(":multi-module-1:child"))
isADependencyOf(project(":multi-module-1:file-path"))
isADependencyOf(project(":multi-module-1-child"))
isADependencyOf(project(":multi-module-1-file-path"))
}
}
4 changes: 2 additions & 2 deletions tests/multi-module-2/child/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ plugins {

dependencies {
implementation(libs.apollo.runtime)
implementation(project(":multi-module-2:root"))
implementation(project(":multi-module-2-root"))
testImplementation(libs.kotlin.test.junit)
}

apollo {
service("multimodule2") {
packageName.set("multimodule2.child")
flattenModels.set(false)
dependsOn(project(":multi-module-2:root"))
dependsOn(project(":multi-module-2-root"))
}
}
2 changes: 1 addition & 1 deletion tests/multi-module-2/root/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ dependencies {
apollo {
service("multimodule2") {
packageName.set("multimodule2.root")
isADependencyOf(project(":multi-module-2:child"))
isADependencyOf(project(":multi-module-2-child"))
generateApolloMetadata.set(true)
generateDataBuilders.set(true)
}
Expand Down
4 changes: 2 additions & 2 deletions tests/multi-module-3/child/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ plugins {

dependencies {
implementation(libs.apollo.runtime)
implementation(project(":multi-module-3:root"))
implementation(project(":multi-module-3-root"))
testImplementation(libs.kotlin.test.junit)
}

apollo {
service("multimodule3") {
packageName.set("multimodule3.child")
flattenModels.set(false)
dependsOn(project(":multi-module-3:root"))
dependsOn(project(":multi-module-3-root"))
}
}
2 changes: 1 addition & 1 deletion tests/multi-module-3/root/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ apollo {
service("multimodule3") {
packageName.set("multimodule3.root")
alwaysGenerateTypesMatching.set(listOf("Cat"))
isADependencyOf(project(":multi-module-3:child"))
isADependencyOf(project(":multi-module-3-child"))
generateApolloMetadata.set(true)
generateDataBuilders.set(true)
}
Expand Down
5 changes: 4 additions & 1 deletion tests/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ rootProject.projectDir
}
.filter { it.isDirectory && File(it, "build.gradle.kts").exists() }
.forEach {
val project = it.relativeTo(rootProject.projectDir).path.replace(File.separatorChar, ':')
// Do no create intermediate projects as they will fail for apolloTestAgreggation
// See https://stackoverflow.com/questions/21015353/gradle-intermediate-dir-of-multiproject-not-subproject
val project = it.relativeTo(rootProject.projectDir).path.replace(File.separatorChar, '-')
include(project)
project(":$project").projectDir = it
}

includeBuild("../")
Expand Down

0 comments on commit b141b76

Please sign in to comment.