diff options
author | Yiming Pan <yimingpan@google.com> | 2022-01-28 16:59:22 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-01-28 16:59:22 +0000 |
commit | 6d2cd22d94a9702a3adee6356d32569ebc6599ea (patch) | |
tree | e226b7311c5bd6cbf83e3d03f826b127ccf180ff | |
parent | 5f1a37d6e7ac9e8adf53fa537a5f5cb7b6849e43 (diff) | |
parent | e8d50bdbdc2612682655bc9264858e29ad3b271a (diff) | |
download | platform_testing-6d2cd22d94a9702a3adee6356d32569ebc6599ea.tar.gz |
Merge "Verify that Java coverage report can be generated."
-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(); + } } |