Skip to content

Commit b141b76

Browse files
authored
[Infra] Count tests in CI (#5181)
* count tests * make ciBuild depend on test aggregation
1 parent 22720f6 commit b141b76

File tree

13 files changed

+121
-16
lines changed

13 files changed

+121
-16
lines changed

build-logic/src/main/kotlin/Common.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11

22
import org.gradle.api.Project
3+
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
4+
import org.gradle.api.attributes.Usage
5+
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
6+
import org.gradle.api.tasks.testing.AbstractTestTask
37
import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest
48

9+
510
fun Project.commonSetup() {
611
pluginManager.withPlugin("org.jetbrains.kotlin.jvm") {
712
tasks.register("ft") {
@@ -19,4 +24,25 @@ fun Project.commonSetup() {
1924
}
2025
}
2126
}
27+
28+
configureTestAggregation()
29+
}
30+
31+
private fun Project.configureTestAggregation() {
32+
val configuration = configurations.create("apolloTestAggregationProducer") {
33+
isCanBeConsumed = true
34+
isCanBeResolved = false
35+
36+
attributes {
37+
attribute(USAGE_ATTRIBUTE, objects.named(Usage::class.java, "apolloTestAggregation"))
38+
}
39+
}
40+
41+
tasks.withType(AbstractTestTask::class.java).configureEach {
42+
configuration.getOutgoing().artifact(
43+
this.binaryResultsDirectory
44+
) {
45+
setType(ArtifactTypeDefinition.DIRECTORY_TYPE)
46+
}
47+
}
2248
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
2+
import org.gradle.api.DefaultTask
3+
import org.gradle.api.Project
4+
import org.gradle.api.Task
5+
import org.gradle.api.file.ConfigurableFileCollection
6+
import org.gradle.api.internal.tasks.testing.junit.result.TestClassResult
7+
import org.gradle.api.internal.tasks.testing.junit.result.TestResultSerializer
8+
import org.gradle.api.tasks.InputFiles
9+
import org.gradle.api.tasks.OutputFile
10+
import org.gradle.api.tasks.PathSensitive
11+
import org.gradle.api.tasks.PathSensitivity
12+
import org.gradle.api.tasks.TaskAction
13+
import org.gradle.api.tasks.TaskProvider
14+
import java.io.File
15+
16+
fun Project.rootSetup(ciBuild: TaskProvider<Task>) {
17+
val apolloTestAggregationConsumer = configurations.create("apolloTestAggregationConsumer") {
18+
isCanBeConsumed = false
19+
isCanBeResolved = true
20+
21+
attributes {
22+
attribute(org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, objects.named(org.gradle.api.attributes.Usage::class.java, "apolloTestAggregation"))
23+
}
24+
}
25+
26+
allprojects.forEach {
27+
dependencies.add("apolloTestAggregationConsumer", it)
28+
}
29+
30+
val task = tasks.register("apolloTestAggregation", GenerateApolloTestAggregation::class.java) {
31+
binaryTestResults.from(apolloTestAggregationConsumer)
32+
33+
output = file("build/apolloTestAggregation.txt")
34+
}
35+
36+
ciBuild.configure {
37+
dependsOn(task)
38+
}
39+
}
40+
41+
abstract class GenerateApolloTestAggregation : DefaultTask() {
42+
@get:InputFiles
43+
@get:PathSensitive(PathSensitivity.RELATIVE)
44+
abstract val binaryTestResults: ConfigurableFileCollection
45+
46+
@get:OutputFile
47+
abstract var output: File
48+
49+
@TaskAction
50+
fun taskAction() {
51+
var count = 0
52+
val result = binaryTestResults.files.map { binaryDir ->
53+
val classResults = mutableListOf<TestClassResult>()
54+
TestResultSerializer(binaryDir).read {
55+
classResults.add(this)
56+
}
57+
58+
binaryDir.parentFile to classResults
59+
}.flatMap { (parent, classResults) ->
60+
classResults.map { classResult ->
61+
count += classResult.results.size
62+
String.format("%-100s - %-40s - %5d", classResult.className, parent.name, classResult.results.size)
63+
}
64+
}.sorted()
65+
.joinToString("\n")
66+
67+
output.writeText(result + "\ntotal: $count")
68+
println("test executed: $count")
69+
}
70+
}

build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import JapiCmp.configureJapiCmp
2+
import org.gradle.api.internal.tasks.testing.junit.result.TestClassResult
3+
import org.gradle.api.internal.tasks.testing.junit.result.TestResultSerializer
24

35
plugins {
46
id("apollo.library") apply false
@@ -93,7 +95,7 @@ tasks.register("ciTestsNoGradle") {
9395
}
9496
}
9597

96-
tasks.register("ciBuild") {
98+
val ciBuild = tasks.register("ciBuild") {
9799
description = "Execute the 'build' task in each subproject"
98100
dependsOn(subprojectTasks("build"))
99101
}
@@ -160,3 +162,5 @@ tasks.register("rmbuild") {
160162
}.count()
161163
}
162164
}
165+
166+
rootSetup(ciBuild)

libraries/apollo-ast/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,4 @@ tasks.withType<KotlinNativeTest>().configureEach {
9696

9797
tasks.withType<KotlinJsTest>().configureEach {
9898
environment("MODULE_ROOT", projectDir.toString())
99-
}
99+
}

tests/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55

66
rootProject.configureNode()
77

8-
tasks.register("ciBuild") {
8+
val ciBuild = tasks.register("ciBuild") {
99
description = """Execute the 'build' task in subprojects and the `termination:run` task too"""
1010
subprojects {
1111
this@register.dependsOn(tasks.matching { it.name == "build" })
@@ -15,3 +15,5 @@ tasks.register("ciBuild") {
1515
checkGitStatus()
1616
}
1717
}
18+
19+
rootSetup(ciBuild)

tests/multi-module-1/child/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ plugins {
66

77
dependencies {
88
implementation(libs.apollo.runtime)
9-
implementation(project(":multi-module-1:root"))
9+
implementation(project(":multi-module-1-root"))
1010
testImplementation(libs.kotlin.test.junit)
1111
}
1212

1313
apollo {
1414
service("service") {
15-
dependsOn(project(":multi-module-1:root"))
15+
dependsOn(project(":multi-module-1-root"))
1616
packageName.set("multimodule1.child")
1717
flattenModels.set(false)
1818
}

tests/multi-module-1/file-path/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ plugins {
66

77
dependencies {
88
implementation(libs.apollo.runtime)
9-
implementation(project(":multi-module-1:root"))
9+
implementation(project(":multi-module-1-root"))
1010
testImplementation(libs.kotlin.test.junit)
1111
}
1212

1313
apollo {
1414
service("service") {
1515
packageNamesFromFilePaths()
16-
dependsOn(project(":multi-module-1:root"))
16+
dependsOn(project(":multi-module-1-root"))
1717
}
1818
}

tests/multi-module-1/root/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ apollo {
1313
packageName.set("multimodule1.root")
1414
generateApolloMetadata.set(true)
1515
mapScalar("Long", "kotlin.Long")
16-
isADependencyOf(project(":multi-module-1:child"))
17-
isADependencyOf(project(":multi-module-1:file-path"))
16+
isADependencyOf(project(":multi-module-1-child"))
17+
isADependencyOf(project(":multi-module-1-file-path"))
1818
}
1919
}

tests/multi-module-2/child/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ plugins {
66

77
dependencies {
88
implementation(libs.apollo.runtime)
9-
implementation(project(":multi-module-2:root"))
9+
implementation(project(":multi-module-2-root"))
1010
testImplementation(libs.kotlin.test.junit)
1111
}
1212

1313
apollo {
1414
service("multimodule2") {
1515
packageName.set("multimodule2.child")
1616
flattenModels.set(false)
17-
dependsOn(project(":multi-module-2:root"))
17+
dependsOn(project(":multi-module-2-root"))
1818
}
1919
}

tests/multi-module-2/root/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependencies {
1111
apollo {
1212
service("multimodule2") {
1313
packageName.set("multimodule2.root")
14-
isADependencyOf(project(":multi-module-2:child"))
14+
isADependencyOf(project(":multi-module-2-child"))
1515
generateApolloMetadata.set(true)
1616
generateDataBuilders.set(true)
1717
}

0 commit comments

Comments
 (0)