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;