diff options
author | Yiming Pan <yimingpan@google.com> | 2022-01-18 15:13:05 -0800 |
---|---|---|
committer | Yiming Pan <yimingpan@google.com> | 2022-01-27 14:25:24 -0800 |
commit | e8d50bdbdc2612682655bc9264858e29ad3b271a (patch) | |
tree | e7619b5cdea4e98c69f475d2c936f4573cc9a1b3 | |
parent | 6fdf05bab798203f6d3ff0ba5fd405d5ad3c0773 (diff) | |
download | platform_testing-e8d50bdbdc2612682655bc9264858e29ad3b271a.tar.gz |
Verify that Java coverage report can be generated.
Bug: 203214912
Test: presubmit
Change-Id: Ie4fba2101c4bcbb0053bf774e667f96ec0cbffa8
-rw-r--r-- | tests/codecoverage/hosttest/src/android/platform/test/CoverageSmokeTest.java | 72 |
1 files changed, 58 insertions, 14 deletions
diff --git a/tests/codecoverage/hosttest/src/android/platform/test/CoverageSmokeTest.java b/tests/codecoverage/hosttest/src/android/platform/test/CoverageSmokeTest.java index 226340dcd..03dff36da 100644 --- a/tests/codecoverage/hosttest/src/android/platform/test/CoverageSmokeTest.java +++ b/tests/codecoverage/hosttest/src/android/platform/test/CoverageSmokeTest.java @@ -1,7 +1,9 @@ package android.platform.test.coverage; +import static com.google.common.base.Verify.verifyNotNull; import static com.google.common.truth.Truth.assertThat; +import com.android.tradefed.build.IBuildInfo; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.metrics.proto.MetricMeasurement.Metric; import com.android.tradefed.result.TestRunResult; @@ -9,7 +11,23 @@ import com.android.tradefed.targetprep.TargetSetupError; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; import com.android.tradefed.testtype.junit4.DeviceTestRunOptions; +import com.android.tradefed.util.AdbRootElevator; +import com.android.tradefed.util.FileUtil; +import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.InputStream; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; + +import org.jacoco.core.analysis.Analyzer; +import org.jacoco.core.analysis.CoverageBuilder; +import org.jacoco.core.analysis.IBundleCoverage; +import org.jacoco.core.tools.ExecFileLoader; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,28 +36,54 @@ import org.junit.runner.RunWith; public final class CoverageSmokeTest extends BaseHostJUnit4Test { private static final String COVERAGE_MEASUREMENT_KEY = "coverageFilePath"; + private static final String INNER_JAR_PATH = + "out/target/common/obj/APPS/CoverageInstrumentationSampleTest_intermediates/jacoco-report-classes.jar"; - @Test - public void instrumentationTest_generatesJavaCoverage() - throws DeviceNotAvailableException, TargetSetupError { + @Before + public void runCoverageDeviceTests() throws DeviceNotAvailableException, TargetSetupError { installPackage("CoverageInstrumentationSampleTest.apk"); - - runCoverageDeviceTests(); - - TestRunResult testRunResult = getLastDeviceRunResults(); - Metric devicePathMetric = testRunResult.getRunProtoMetrics().get(COVERAGE_MEASUREMENT_KEY); - assertThat(devicePathMetric).isNotNull(); - String testCoveragePath = devicePathMetric.getMeasurements().getSingleString(); - assertThat(testCoveragePath).isNotNull(); - } - - private void runCoverageDeviceTests() throws DeviceNotAvailableException { DeviceTestRunOptions options = new DeviceTestRunOptions("android.platform.test.coverage") .setTestClassName( "android.platform.test.coverage.CoverageInstrumentationTest") .setTestMethodName("testCoveredMethod") + .setDisableHiddenApiCheck(true) .addInstrumentationArg("coverage", "true"); runDeviceTests(options); } + + @Test + public void instrumentationTest_generatesJavaCoverage() + throws DeviceNotAvailableException, IOException { + TestRunResult testRunResult = getLastDeviceRunResults(); + Metric devicePathMetric = testRunResult.getRunProtoMetrics().get(COVERAGE_MEASUREMENT_KEY); + String testCoveragePath = devicePathMetric.getMeasurements().getSingleString(); + ExecFileLoader execFileLoader = new ExecFileLoader(); + File coverageFile = null; + try (AdbRootElevator adbRoot = new AdbRootElevator(getDevice())) { + coverageFile = getDevice().pullFile(testCoveragePath); + execFileLoader.load(coverageFile); + } catch (DeviceNotAvailableException | IOException e) { + throw new RuntimeException(e); + } finally { + FileUtil.deleteFile(coverageFile); + } + CoverageBuilder builder = new CoverageBuilder(); + Analyzer analyzer = new Analyzer(execFileLoader.getExecutionDataStore(), builder); + IBuildInfo buildInfo = getBuild(); + File jacocoAllClassesJar = + verifyNotNull( + buildInfo.getFile("jacoco-report-classes-all.jar"), + "Could not get jacoco-report-classes-all.jar from the build."); + URI uri = URI.create("jar:file:" + jacocoAllClassesJar.getPath()); + try (FileSystem zip = FileSystems.newFileSystem(uri, ImmutableMap.of())) { + try (InputStream in = Files.newInputStream(zip.getPath(INNER_JAR_PATH))) { + analyzer.analyzeAll(in, "jacoco-report-classes.jar"); + } + } + IBundleCoverage coverage = builder.getBundle("JaCoCo Coverage Report"); + + assertThat(coverage).isNotNull(); + assertThat(coverage.getPackages()).isNotEmpty(); + } } |