From 1baaff94b3496d0173ae61eb10d1079634c8f609 Mon Sep 17 00:00:00 2001 From: Emily Ploszaj Date: Wed, 1 Oct 2025 15:20:20 -0500 Subject: [PATCH] Create unit test report workflow --- .github/workflows/unit-test-report.yml | 35 ++++++++++++++++++ .../plugins/BaseFirebaseLibraryPlugin.kt | 8 +++++ .../plugins/FirebaseAndroidLibraryPlugin.kt | 1 + .../plugins/FirebaseJavaLibraryPlugin.kt | 1 + .../gradle/plugins/report/UnitTestReport.kt | 9 ++--- .../plugins/report/UnitTestReportTask.kt | 36 +++++++++++++++++++ 6 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/unit-test-report.yml create mode 100644 plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReportTask.kt diff --git a/.github/workflows/unit-test-report.yml b/.github/workflows/unit-test-report.yml new file mode 100644 index 00000000000..001472c634c --- /dev/null +++ b/.github/workflows/unit-test-report.yml @@ -0,0 +1,35 @@ +name: Firebase AI Daily Tests + +on: + schedule: + - cron: 51 8 * * * # Runs automatically once a day + workflow_dispatch: # Allow triggering the workflow manually + +permissions: + contents: read + issues: write + +jobs: + dailies: + name: "Unit Test Report" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + submodules: true + + - name: Set up JDK 17 + uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + with: + java-version: 17 + distribution: temurin + cache: gradle + + - name: Generate Test Report + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: ./gradlew generateTestReport + + - name: Update tracking issue + run: gh issue edit 7421 --body-file test-report.md diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/BaseFirebaseLibraryPlugin.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/BaseFirebaseLibraryPlugin.kt index f856f3257a7..2f23b8c1dee 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/BaseFirebaseLibraryPlugin.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/BaseFirebaseLibraryPlugin.kt @@ -18,6 +18,7 @@ package com.google.firebase.gradle.plugins import com.android.build.gradle.LibraryExtension import com.google.firebase.gradle.plugins.ci.Coverage +import com.google.firebase.gradle.plugins.report.UnitTestReportTask import com.google.firebase.gradle.plugins.services.GMavenService import java.io.File import java.nio.file.Paths @@ -141,6 +142,13 @@ abstract class BaseFirebaseLibraryPlugin : Plugin { } } + protected fun registerUnitTestReportTask(project: Project) = + project.tasks.register("generateTestReport") { + outputFile.set(project.file("test-report.md")) + commitCount.set(8 as Integer) + apiToken.set(System.getenv("GH_TOKEN")) + } + protected fun getApiInfo( project: Project, srcDirs: ConfigurableFileCollection, diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseAndroidLibraryPlugin.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseAndroidLibraryPlugin.kt index 14ec07a7cae..c9cd88add6b 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseAndroidLibraryPlugin.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseAndroidLibraryPlugin.kt @@ -162,6 +162,7 @@ class FirebaseAndroidLibraryPlugin : BaseFirebaseLibraryPlugin() { } setupMetalavaSemver(project, firebaseLibrary) + registerUnitTestReportTask(project) } private fun setupApiInformationAnalysis(project: Project, android: LibraryExtension) { diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.kt index 0e5a6aa3a51..b29eff156c1 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/FirebaseJavaLibraryPlugin.kt @@ -105,6 +105,7 @@ class FirebaseJavaLibraryPlugin : BaseFirebaseLibraryPlugin() { } setupMetalavaSemver(project, firebaseLibrary) + registerUnitTestReportTask(project) } private fun setupApiInformationAnalysis(project: Project) { diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReport.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReport.kt index bdebda83068..4710935c23b 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReport.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReport.kt @@ -30,13 +30,14 @@ import java.time.Duration import java.util.regex.Matcher import java.util.regex.Pattern import org.gradle.internal.Pair +import java.io.File @SuppressWarnings("NewApi") class UnitTestReport(private val apiToken: String) { private val client: HttpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build() - fun createReport(commitCount: Int) { + fun createReport(outputFile: File, commitCount: Int) { val response = request("commits?per_page=$commitCount", JsonArray::class.java) val commits = response @@ -55,10 +56,10 @@ class UnitTestReport(private val apiToken: String) { ReportCommit(obj.get("sha").asString, pr) } .toList() - outputReport(commits) + outputReport(outputFile, commits) } - private fun outputReport(commits: List) { + private fun outputReport(outputFile: File, commits: List) { val reports: MutableList = ArrayList() for (commit in commits) { reports.addAll(parseTestReports(commit.sha)) @@ -82,7 +83,7 @@ class UnitTestReport(private val apiToken: String) { output.append("\n") try { - val writer = FileWriter("test-report.md") + val writer = FileWriter(outputFile) writer.append(output.toString()) writer.close() } catch (e: Exception) { diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReportTask.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReportTask.kt new file mode 100644 index 00000000000..0efff757063 --- /dev/null +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/report/UnitTestReportTask.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.firebase.gradle.plugins.report + +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction + +abstract class UnitTestReportTask: DefaultTask() { + @get:OutputFile abstract val outputFile: RegularFileProperty + + @get:Input abstract val commitCount: Property + + @get:Input abstract val apiToken: Property + + @TaskAction + fun make() { + UnitTestReport(apiToken.get()).createReport(outputFile.asFile.get(), commitCount.get().toInt()) + } +}