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 + " \n total: $count " )
68+ println (" test executed: $count " )
69+ }
70+ }
0 commit comments