Move test utility for instrumenting classes using JaCoCo

Change-Id: I4b2913a0ed82d487e2912fb29d0540aa513e2f9b
diff --git a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicTest.java b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicTest.java
index 266745e..9c33f50 100644
--- a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicTest.java
@@ -3,9 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.constantdynamic;
 
-import static com.android.tools.r8.utils.DescriptorUtils.JAVA_PACKAGE_SEPARATOR;
-import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assume.assumeTrue;
@@ -15,12 +12,10 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.cf.CfVersion;
+import com.android.tools.r8.jacoco.JacocoClasses;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.ZipUtils;
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -141,60 +136,6 @@
         temp);
   }
 
-  // Two sets of class files with and without JaCoCo off line instrumentation.
-  private static class JacocoClasses {
-    private final Path dir;
-
-    private final Path originalJar;
-    private final Path instrumentedJar;
-
-    // Create JacocoClasses with just one class provided as bytes.
-    private JacocoClasses(byte[] clazz, TemporaryFolder temp) throws IOException {
-      dir = temp.newFolder().toPath();
-
-      // Write the class to a .class file with package sub-directories.
-      String typeName = extractClassName(clazz);
-      int lastDotIndex = typeName.lastIndexOf('.');
-      String pkg = typeName.substring(0, lastDotIndex);
-      String baseFileName = typeName.substring(lastDotIndex + 1) + CLASS_EXTENSION;
-      Path original = dir.resolve("original");
-      Files.createDirectories(original);
-      Path packageDir = original.resolve(pkg.replace(JAVA_PACKAGE_SEPARATOR, File.separatorChar));
-      Files.createDirectories(packageDir);
-      Path classFile = packageDir.resolve(baseFileName);
-      Files.write(classFile, clazz);
-
-      // Run offline instrumentation.
-      Path instrumented = dir.resolve("instrumented");
-      Files.createDirectories(instrumented);
-      runJacocoInstrumentation(original, instrumented);
-      originalJar = dir.resolve("original" + JAR_EXTENSION);
-      ZipUtils.zip(originalJar, original);
-      instrumentedJar = dir.resolve("instrumented" + JAR_EXTENSION);
-      ZipUtils.zip(instrumentedJar, instrumented);
-    }
-
-    public Path getOriginal() {
-      return originalJar;
-    }
-
-    public Path getInstrumented() {
-      return instrumentedJar;
-    }
-
-    public List<String> generateReport(Path jacocoExec) throws IOException {
-      Path report = dir.resolve("report.scv");
-      ProcessResult result = ToolHelper.runJaCoCoReport(originalJar, jacocoExec, report);
-      assertEquals(result.toString(), 0, result.exitCode);
-      return Files.readAllLines(report);
-    }
-
-    private void runJacocoInstrumentation(Path input, Path outdir) throws IOException {
-      ProcessResult result = ToolHelper.runJaCoCoInstrument(input, outdir);
-      assertEquals(result.toString(), 0, result.exitCode);
-    }
-  }
-
   static class TestRunner {
 
     public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/jacoco/JacocoClasses.java b/src/test/java/com/android/tools/r8/jacoco/JacocoClasses.java
new file mode 100644
index 0000000..0149669
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/jacoco/JacocoClasses.java
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.jacoco;
+
+import static com.android.tools.r8.utils.DescriptorUtils.JAVA_PACKAGE_SEPARATOR;
+import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.utils.ZipUtils;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import org.junit.rules.TemporaryFolder;
+
+// Two sets of class files with and without JaCoCo offline instrumentation.
+public class JacocoClasses {
+
+  private final Path dir;
+
+  private final Path originalJar;
+  private final Path instrumentedJar;
+
+  // Create JacocoClasses with just one class provided as bytes.
+  public JacocoClasses(byte[] clazz, TemporaryFolder temp) throws IOException {
+    dir = temp.newFolder().toPath();
+
+    // Write the class to a .class file with package sub-directories.
+    String typeName = TestBase.extractClassName(clazz);
+    int lastDotIndex = typeName.lastIndexOf('.');
+    String pkg = typeName.substring(0, lastDotIndex);
+    String baseFileName = typeName.substring(lastDotIndex + 1) + CLASS_EXTENSION;
+    Path original = dir.resolve("original");
+    Files.createDirectories(original);
+    Path packageDir = original.resolve(pkg.replace(JAVA_PACKAGE_SEPARATOR, File.separatorChar));
+    Files.createDirectories(packageDir);
+    Path classFile = packageDir.resolve(baseFileName);
+    Files.write(classFile, clazz);
+
+    // Run offline instrumentation.
+    Path instrumented = dir.resolve("instrumented");
+    Files.createDirectories(instrumented);
+    runJacocoInstrumentation(original, instrumented);
+    originalJar = dir.resolve("original" + JAR_EXTENSION);
+    ZipUtils.zip(originalJar, original);
+    instrumentedJar = dir.resolve("instrumented" + JAR_EXTENSION);
+    ZipUtils.zip(instrumentedJar, instrumented);
+  }
+
+  public Path getOriginal() {
+    return originalJar;
+  }
+
+  public Path getInstrumented() {
+    return instrumentedJar;
+  }
+
+  public List<String> generateReport(Path jacocoExec) throws IOException {
+    Path report = dir.resolve("report.scv");
+    ProcessResult result = ToolHelper.runJaCoCoReport(originalJar, jacocoExec, report);
+    assertEquals(result.toString(), 0, result.exitCode);
+    return Files.readAllLines(report);
+  }
+
+  private void runJacocoInstrumentation(Path input, Path outdir) throws IOException {
+    ProcessResult result = ToolHelper.runJaCoCoInstrument(input, outdir);
+    assertEquals(result.toString(), 0, result.exitCode);
+  }
+}