Factor out running relocator into utils
Change-Id: I34cb6c9d811a22fa126574790acb1e56fdf07828
diff --git a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
index 7afb7e3..5dd7c9d 100644
--- a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
@@ -33,7 +33,6 @@
public NamingLens compute(Map<PackageReference, PackageReference> mapping) {
// Prefetch all code objects to ensure we have seen all types.
- // TODO(b/129925954): When updated, there is no need for this prefetch.
for (DexProgramClass clazz : appView.appInfo().classes()) {
for (DexEncodedMethod method : clazz.methods()) {
if (method.getCode() != null) {
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
index e6a2f1d..237d3cb 100644
--- a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
@@ -4,10 +4,12 @@
package com.android.tools.r8.relocator;
+import static com.android.tools.r8.relocator.RelocatorUtils.inspectAllClassesRelocated;
+import static com.android.tools.r8.relocator.RelocatorUtils.inspectAllSignaturesNotContainingString;
+import static com.android.tools.r8.relocator.RelocatorUtils.runRelocator;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static junit.framework.TestCase.assertFalse;
import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
@@ -19,14 +21,11 @@
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.Pair;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
-import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
import com.android.tools.r8.utils.codeinspector.LocalVariableTable;
import com.android.tools.r8.utils.codeinspector.LocalVariableTable.LocalVariableTableEntry;
@@ -63,7 +62,7 @@
@Test
public void testRelocatorIdentity() throws Exception {
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, new HashMap<>(), output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, new HashMap<>(), output, external);
inspectAllClassesRelocated(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, output, "", "");
}
@@ -74,7 +73,7 @@
Path output = temp.newFile("output.jar").toPath();
Map<String, String> mapping = new HashMap<>();
mapping.put(originalPrefix, newPrefix);
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
// TODO(b/155618698): Extend relocator with a richer language such that java.lang.Object is not
// relocated.
RuntimeException compilationError =
@@ -97,12 +96,9 @@
Map<String, String> mapping = new HashMap<>();
mapping.put(originalPrefix, newPrefix);
// TODO(b/155047618): Fixup the type after rewriting.
- CompilationFailedException compilationFailedException =
- assertThrows(
- CompilationFailedException.class,
- () -> {
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
- });
+ assertThrows(
+ CompilationFailedException.class,
+ () -> runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external));
}
@Test
@@ -112,7 +108,7 @@
Path output = temp.newFile("output.jar").toPath();
Map<String, String> mapping = new HashMap<>();
mapping.put(originalPrefix, newPrefix);
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
// Assert that all classes are the same, have the same methods and debug info:
CodeInspector originalInspector = new CodeInspector(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS);
CodeInspector relocatedInspector = new CodeInspector(output);
@@ -157,7 +153,7 @@
mapping.put("some.package.that.does.not.exist", "foo");
mapping.put(originalPrefix, newPrefix);
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
inspectAllClassesRelocated(
ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, output, originalPrefix, newPrefix);
}
@@ -173,7 +169,7 @@
CompilationFailedException exception =
assertThrows(
CompilationFailedException.class,
- () -> runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output));
+ () -> runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external));
assertThat(
exception.getCause().getMessage(),
containsString("can be relocated by multiple mappings."));
@@ -188,7 +184,7 @@
mapping.put(originalPrefix, newPrefix);
mapping.put(newPrefix, "qux");
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
inspectAllClassesRelocated(
ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, output, originalPrefix, newPrefix);
// Assert that no mappings of com.android.tools.r8 -> qux exists.
@@ -223,7 +219,7 @@
}
}
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
for (Pair<String, String> packageMapping : packageMappings) {
inspectAllClassesRelocated(
ToolHelper.CHECKED_IN_R8_17_WITH_DEPS,
@@ -240,7 +236,7 @@
Map<String, String> mapping = new LinkedHashMap<>();
mapping.put(originalPrefix, newPrefix);
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
inspectAllClassesRelocated(
ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, output, originalPrefix, originalPrefix);
}
@@ -252,7 +248,7 @@
Map<String, String> mapping = new LinkedHashMap<>();
mapping.put(originalPrefix, newPrefix);
Path output = temp.newFile("output.jar").toPath();
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
// Check that all classes has been remapped.
inspectAllClassesRelocated(
ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, output, originalPrefix, newPrefix);
@@ -288,7 +284,7 @@
Path output = temp.newFile("output.jar").toPath();
Map<String, String> mapping = new HashMap<>();
mapping.put(originalPrefix, newPrefix);
- runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output);
+ runRelocator(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS, mapping, output, external);
// Assert that all classes are the same, have the same methods and nest info.
CodeInspector originalInspector = new CodeInspector(ToolHelper.CHECKED_IN_R8_17_WITH_DEPS);
CodeInspector relocatedInspector = new CodeInspector(output);
@@ -306,58 +302,4 @@
}
}
- private void runRelocator(Path input, Map<String, String> mapping, Path output)
- throws CompilationFailedException {
- if (external) {
- List<String> args = new ArrayList<>();
- args.add("--input");
- args.add(input.toString());
- args.add("--output");
- args.add(output.toString());
- mapping.forEach(
- (key, value) -> {
- args.add("--map");
- args.add(key + "->" + value);
- });
- RelocatorCommandLine.run(args.toArray(new String[0]));
- } else {
- RelocatorCommand.Builder builder =
- RelocatorCommand.builder().addProgramFiles(input).setOutputPath(output);
- mapping.forEach(
- (key, value) ->
- builder.addPackageMapping(
- Reference.packageFromString(key), Reference.packageFromString(value)));
- Relocator.run(builder.build());
- }
- }
-
- private void inspectAllClassesRelocated(
- Path original, Path relocated, String originalPrefix, String newPrefix) throws IOException {
- CodeInspector originalInspector = new CodeInspector(original);
- CodeInspector relocatedInspector = new CodeInspector(relocated);
- for (FoundClassSubject clazz : originalInspector.allClasses()) {
- if (originalPrefix.isEmpty()
- || clazz
- .getFinalName()
- .startsWith(originalPrefix + DescriptorUtils.JAVA_PACKAGE_SEPARATOR)) {
- String relocatedName = newPrefix + clazz.getFinalName().substring(originalPrefix.length());
- ClassSubject relocatedClass = relocatedInspector.clazz(relocatedName);
- assertThat(relocatedClass, isPresent());
- }
- }
- }
-
- private void inspectAllSignaturesNotContainingString(Path relocated, String originalPrefix)
- throws IOException {
- CodeInspector relocatedInspector = new CodeInspector(relocated);
- for (FoundClassSubject clazz : relocatedInspector.allClasses()) {
- assertThat(clazz.getFinalSignatureAttribute(), not(containsString(originalPrefix)));
- for (FoundMethodSubject method : clazz.allMethods()) {
- assertThat(method.getJvmMethodSignatureAsString(), not(containsString(originalPrefix)));
- }
- for (FoundFieldSubject field : clazz.allFields()) {
- assertThat(field.getJvmFieldSignatureAsString(), not(containsString(originalPrefix)));
- }
- }
- }
}
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorUtils.java b/src/test/java/com/android/tools/r8/relocator/RelocatorUtils.java
new file mode 100644
index 0000000..de65492
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorUtils.java
@@ -0,0 +1,83 @@
+// Copyright (c) 2023, 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.relocator;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class RelocatorUtils {
+
+ public static void runRelocator(
+ Path input, Map<String, String> mapping, Path output, boolean external)
+ throws CompilationFailedException {
+ if (external) {
+ List<String> args = new ArrayList<>();
+ args.add("--input");
+ args.add(input.toString());
+ args.add("--output");
+ args.add(output.toString());
+ mapping.forEach(
+ (key, value) -> {
+ args.add("--map");
+ args.add(key + "->" + value);
+ });
+ RelocatorCommandLine.run(args.toArray(new String[0]));
+ } else {
+ RelocatorCommand.Builder builder =
+ RelocatorCommand.builder().addProgramFiles(input).setOutputPath(output);
+ mapping.forEach(
+ (key, value) ->
+ builder.addPackageMapping(
+ Reference.packageFromString(key), Reference.packageFromString(value)));
+ Relocator.run(builder.build());
+ }
+ }
+
+ public static void inspectAllClassesRelocated(
+ Path original, Path relocated, String originalPrefix, String newPrefix) throws IOException {
+ CodeInspector originalInspector = new CodeInspector(original);
+ CodeInspector relocatedInspector = new CodeInspector(relocated);
+ for (FoundClassSubject clazz : originalInspector.allClasses()) {
+ if (originalPrefix.isEmpty()
+ || clazz
+ .getFinalName()
+ .startsWith(originalPrefix + DescriptorUtils.JAVA_PACKAGE_SEPARATOR)) {
+ String relocatedName = newPrefix + clazz.getFinalName().substring(originalPrefix.length());
+ ClassSubject relocatedClass = relocatedInspector.clazz(relocatedName);
+ assertThat(relocatedClass, isPresent());
+ }
+ }
+ }
+
+ public static void inspectAllSignaturesNotContainingString(Path relocated, String originalPrefix)
+ throws IOException {
+ CodeInspector relocatedInspector = new CodeInspector(relocated);
+ for (FoundClassSubject clazz : relocatedInspector.allClasses()) {
+ assertThat(clazz.getFinalSignatureAttribute(), not(containsString(originalPrefix)));
+ for (FoundMethodSubject method : clazz.allMethods()) {
+ assertThat(method.getJvmMethodSignatureAsString(), not(containsString(originalPrefix)));
+ }
+ for (FoundFieldSubject field : clazz.allFields()) {
+ assertThat(field.getJvmFieldSignatureAsString(), not(containsString(originalPrefix)));
+ }
+ }
+ }
+}