Change tests checking ProGuard output to use DexInspector

Also add a system property to control running of ProGuard during testing

Change-Id: I447c495cda8bf8ae325c9d4bcd614e9b990f462a
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 2b73eb9..5cf4b10 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -39,26 +39,32 @@
 import java.nio.file.StandardOpenOption;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import java.util.jar.JarOutputStream;
 import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 import org.junit.Rule;
 import org.junit.rules.TemporaryFolder;
 
 public class TestBase {
 
+  // Actually running Proguard should only be during development.
+  private boolean runProguard = System.getProperty("run_proguard") != null;
+
   @Rule
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   /**
+   * Check if tests should also run Proguard when applicable.
+   */
+  protected boolean isRunProguard() {
+    return runProguard;
+  }
+
+  /**
    * Write lines of text to a temporary file.
    */
   protected Path writeTextToTempFile(String... lines) throws IOException {
@@ -80,6 +86,15 @@
   }
 
   /**
+   * Build an AndroidApp with the specified jar.
+   */
+  protected AndroidApp readJar(Path jar) {
+    return AndroidApp.builder()
+        .addProgramResourceProvider(ArchiveProgramResourceProvider.fromArchive(jar))
+        .build();
+  }
+
+  /**
    * Build an AndroidApp with the specified test classes.
    */
   protected static AndroidApp readClasses(Class... classes) throws IOException {
@@ -174,24 +189,6 @@
   }
 
   /**
-   * Read the names of classes in a jar.
-   */
-  protected Set<String> readClassesInJar(Path jar) throws IOException {
-    Set<String> result = new HashSet<>();
-    try (ZipFile zipFile = new ZipFile(jar.toFile())) {
-      final Enumeration<? extends ZipEntry> entries = zipFile.entries();
-      while (entries.hasMoreElements()) {
-        ZipEntry entry = entries.nextElement();
-        String name = entry.getName();
-        if (name.endsWith(".class")) {
-          result.add(name.substring(0, name.length() - ".class".length()).replace('/', '.'));
-        }
-      }
-    }
-    return result;
-  }
-
-  /**
    * Get the class name generated by javac.
    */
   protected String getJavacGeneratedClassName(Class clazz) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 1e07b94..5dcb059 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1119,7 +1119,8 @@
     }
   }
 
-  public static String runProguard(Path inJar, Path outJar, Path config) throws IOException {
+  public static String runProguard(Path inJar, Path outJar, Path config, Path map)
+      throws IOException {
     List<String> command = new ArrayList<>();
     command.add(PROGUARD);
     command.add("-forceprocessing");  // Proguard just checks the creation time on the in/out jars.
@@ -1131,6 +1132,9 @@
     command.add("-outjar");
     command.add(outJar.toString());
     command.add("-printmapping");
+    if (map != null) {
+      command.add(map.toString());
+    }
     ProcessBuilder builder = new ProcessBuilder(command);
     ToolHelper.ProcessResult result = ToolHelper.runProcess(builder);
     if (result.exitCode != 0) {
@@ -1139,7 +1143,6 @@
     return result.stdout;
   }
 
-
   public static class ProcessResult {
 
     public final int exitCode;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index cfbfa84..434f213 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -47,9 +47,6 @@
 import org.junit.Test;
 
 public class ForceProguardCompatibilityTest extends TestBase {
-  // Actually running Proguard should only be during development.
-  private final boolean RUN_PROGUARD = false;
-
   private void test(Class mainClass, Class mentionedClass, boolean forceProguardCompatibility)
       throws Exception {
     String proguardConfig = keepMainProguardConfiguration(mainClass, true, false);
@@ -160,11 +157,13 @@
       assertEquals(0, configuration.getRules().size());
     }
 
-    if (RUN_PROGUARD) {
+    if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
+      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
       FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
-      ToolHelper.runProguard(jarTestClasses(testClass), proguardedJar, proguardConfigFile);
+      ToolHelper.runProguard(jarTestClasses(testClass),
+          proguardedJar, proguardConfigFile, proguardMapFile);
     }
   }
 
@@ -199,16 +198,16 @@
       assertEquals(forceProguardCompatibility && containsCheckCast, !clazz.isAbstract());
     }
 
-    if (RUN_PROGUARD) {
+    if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
       FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
       ToolHelper.runProguard(jarTestClasses(ImmutableList.of(mainClass, instantiatedClass)),
-          proguardedJar, proguardConfigFile);
-      Set<String> classesAfterProguard = readClassesInJar(proguardedJar);
-      assertTrue(classesAfterProguard.contains(mainClass.getCanonicalName()));
+          proguardedJar, proguardConfigFile, null);
+      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      assertTrue(proguardInspector.clazz(mainClass).isPresent());
       assertEquals(
-          containsCheckCast, classesAfterProguard.contains(instantiatedClass.getCanonicalName()));
+          containsCheckCast, proguardInspector.clazz(instantiatedClass).isPresent());
     }
   }
 
@@ -288,19 +287,20 @@
       assertEquals(0, configuration.getRules().size());
     }
 
-    if (RUN_PROGUARD) {
+    if (isRunProguard()) {
       Path proguardedJar = File.createTempFile("proguarded", ".jar", temp.getRoot()).toPath();
       Path proguardConfigFile = File.createTempFile("proguard", ".config", temp.getRoot()).toPath();
+      Path proguardMapFile = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
       FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, forNameClass1, forNameClass2)),
-          proguardedJar, proguardConfigFile);
-      Set<String> classesAfterProguard = readClassesInJar(proguardedJar);
-      assertEquals(3, classesAfterProguard.size());
-      assertTrue(classesAfterProguard.contains(mainClass.getCanonicalName()));
-      if (!allowObfuscation) {
-        assertTrue(classesAfterProguard.contains(forNameClass1.getCanonicalName()));
-        assertTrue(classesAfterProguard.contains(forNameClass2.getCanonicalName()));
+          proguardedJar, proguardConfigFile, proguardMapFile);
+      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      assertEquals(3, proguardedInspector.allClasses().size());
+      assertTrue(proguardedInspector.clazz(mainClass).isPresent());
+      for (Class clazz : ImmutableList.of(forNameClass1, forNameClass2)) {
+        assertTrue(proguardedInspector.clazz(clazz).isPresent());
+        assertEquals(allowObfuscation, proguardedInspector.clazz(clazz).isRenamed());
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
index ca3fd2a..d578815 100644
--- a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
@@ -14,48 +14,42 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 import org.junit.Test;
 
 public class IncludeDescriptorClassesTest extends TestBase {
-  // Actually running Proguard should only be during development.
-  private final boolean RUN_PROGUARD = false;
-
   private class Result {
     final DexInspector inspector;
-    final Set<String> classesAfterProguard;
+    final DexInspector proguardedInspector;
 
-    Result(DexInspector inspector, Set<String> classesAfterProguard) {
+    Result(DexInspector inspector, DexInspector proguardedInspector) {
       this.inspector = inspector;
-      this.classesAfterProguard = classesAfterProguard;
+      this.proguardedInspector = proguardedInspector;
     }
 
     void assertKept(Class clazz) {
       assertTrue(inspector.clazz(clazz.getCanonicalName()).isPresent());
       assertFalse(inspector.clazz(clazz.getCanonicalName()).isRenamed());
-      if (classesAfterProguard != null) {
-        assertTrue(classesAfterProguard.contains(clazz.getCanonicalName()));
+      if (proguardedInspector != null) {
+        assertTrue(proguardedInspector.clazz(clazz).isPresent());
       }
     }
 
     // NOTE: 'synchronized' is supposed to disable inlining of this method.
     synchronized void assertRemoved(Class clazz) {
       assertFalse(inspector.clazz(clazz.getCanonicalName()).isPresent());
-      // TODO(sgjesse): Also check that it was not just renamed...
-      if (classesAfterProguard != null) {
-        assertFalse(classesAfterProguard.contains(clazz.getCanonicalName()));
+      if (proguardedInspector != null) {
+        assertFalse(proguardedInspector.clazz(clazz).isPresent());
       }
     }
 
     void assertRenamed(Class clazz) {
       assertTrue(inspector.clazz(clazz.getCanonicalName()).isPresent());
       assertTrue(inspector.clazz(clazz.getCanonicalName()).isRenamed());
-      // TODO(sgjesse): Also check that it was actually renamed...
-      if (classesAfterProguard != null) {
-        assertFalse(classesAfterProguard.contains(clazz.getCanonicalName()));
+      if (proguardedInspector != null) {
+        assertTrue(proguardedInspector.clazz(clazz).isPresent());
+        assertTrue(proguardedInspector.clazz(clazz).isRenamed());
       }
     }
-
   }
 
   private List<Class> applicationClasses = ImmutableList.of(
@@ -70,15 +64,16 @@
 
     DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
 
-    Set<String> classesAfterProguard = null;
+    DexInspector proguardedInspector = null;
     // Actually running Proguard should only be during development.
-    if (RUN_PROGUARD) {
+    if (isRunProguard()) {
       Path proguardedJar = temp.newFolder().toPath().resolve("proguarded.jar");
-      ToolHelper.runProguard(jarTestClasses(classes), proguardedJar, proguardConfig);
-      classesAfterProguard = readClassesInJar(proguardedJar);
+      Path proguardedMap = temp.newFolder().toPath().resolve("proguarded.map");
+      ToolHelper.runProguard(jarTestClasses(classes), proguardedJar, proguardConfig, proguardedMap);
+      proguardedInspector = new DexInspector(readJar(proguardedJar), proguardedMap);
     }
 
-    return new Result(inspector, classesAfterProguard);
+    return new Result(inspector, proguardedInspector);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/utils/DexInspector.java b/src/test/java/com/android/tools/r8/utils/DexInspector.java
index 95ecd4f..8eae341 100644
--- a/src/test/java/com/android/tools/r8/utils/DexInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/DexInspector.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.StringResource;
 import com.android.tools.r8.code.Const4;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.Goto;
@@ -135,6 +136,12 @@
             .read(app.getProguardMapOutputData()));
   }
 
+  public DexInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
+    this(
+        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+            .read(StringResource.fromFile(proguardMap)));
+  }
+
   public DexInspector(DexApplication application) {
     dexItemFactory = application.dexItemFactory;
     this.application = application;