0
0
mirror of https://github.com/ankidroid/Anki-Android.git synced 2024-09-20 03:52:15 +02:00

test: ensure non-zero coverage for androidTest reports

there are many toolchain incompatibilities which can result in a
false-positive androidTest test run, but with zero actual coverage
tallied

this adds a finalization task that scans the coverage report looking
for an aggregate coverage count that is non-zero
This commit is contained in:
Mike Hardy 2024-06-23 23:44:53 -05:00
parent 850c391d43
commit b15994cad0

View File

@ -1,4 +1,5 @@
import groovy.transform.Memoized
import groovy.xml.XmlParser
apply plugin: 'jacoco'
@ -167,3 +168,39 @@ def androidTestReport = tasks.register('jacocoAndroidTestReport', JacocoReport)
])
}
androidTestReport.configure { dependsOn('connectedPlayDebugAndroidTest') }
// Issue 16640 - some emulators run, but register zero coverage
tasks.register('assertNonzeroAndroidTestCoverage') {
doLast {
File jacocoReport = layout.buildDirectory.dir("reports/jacoco/jacocoAndroidTestReport/jacocoAndroidTestReport.xml").get().asFile
if (!jacocoReport.exists())
throw new FileNotFoundException("jacocoAndroidTestReport.xml was not found after running jacocoAndroidTestReport")
XmlParser xmlParser = new XmlParser()
xmlParser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
xmlParser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
Node reportRoot = xmlParser.parse(jacocoReport)
boolean hasCovered = false
// https://github.com/jacoco/jacoco/blob/5aabb2eb60bbcd05df968005f1746ba19dcd5361/org.jacoco.report/src/org/jacoco/report/internal/xml/ReportElement.java#L190
for (Node child : reportRoot.children()) {
if (child.name() != "counter")
continue;
if (child.attribute("covered") == "0") {
logger.warn("jacoco registered zero code coverage for counter type %s", child.attribute("type"))
} else {
hasCovered = true
}
}
if (!hasCovered)
throw new GradleScriptException("androidTest registered zero code coverage in jacocoAndroidTestReport.xml. Probably some incompatibilities in the toolchain.", null)
}
}
afterEvaluate {
tasks.named('jacocoAndroidTestReport').configure { finalizedBy('assertNonzeroAndroidTestCoverage') }
tasks.named('jacocoTestReport').configure { finalizedBy('assertNonzeroAndroidTestCoverage') }
}