Produce mapping files for identity mappings.
Fixes: 202076520
Change-Id: I289b5c69ab0896b670107b669d72af49e5d8f569
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
index 7e7cff8..85e7b1a 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
@@ -59,7 +59,6 @@
private ProguardMapSupplier(ClassNameMapper classNameMapper, InternalOptions options) {
assert classNameMapper != null;
- assert !classNameMapper.isEmpty();
this.classNameMapper = classNameMapper.sorted();
this.consumer =
InternalOptions.assertionsEnabled()
@@ -71,7 +70,7 @@
public static ProguardMapSupplier create(
ClassNameMapper classNameMapper, InternalOptions options) {
- return classNameMapper.isEmpty() ? null : new ProguardMapSupplier(classNameMapper, options);
+ return new ProguardMapSupplier(classNameMapper, options);
}
public ProguardMapId writeProguardMap() {
diff --git a/src/test/java/com/android/tools/r8/naming/IdentityMappingFileTest.java b/src/test/java/com/android/tools/r8/naming/IdentityMappingFileTest.java
index d788387..21ece10 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentityMappingFileTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentityMappingFileTest.java
@@ -3,14 +3,16 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.startsWith;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.R8;
import com.android.tools.r8.R8Command;
-import com.android.tools.r8.StringConsumer.ForwardingConsumer;
+import com.android.tools.r8.StringConsumer;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -18,7 +20,10 @@
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanBox;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Test;
@@ -37,6 +42,23 @@
parameters.assertNoneRuntime();
}
+ private void checkIdentityMappingContent(String mapping) {
+ assertThat(mapping, containsString("# compiler: R8"));
+ assertThat(mapping, containsString("# compiler_version: "));
+ assertThat(mapping, containsString("# min_api: 1"));
+ assertThat(mapping, containsString("# compiler_hash: "));
+ assertThat(mapping, containsString("# common_typos_disable"));
+ assertThat(mapping, containsString("# {\"id\":\"com.android.tools.r8.mapping\",\"version\":"));
+ assertThat(mapping, containsString("# pg_map_id: "));
+ assertThat(mapping, containsString("# pg_map_hash: SHA-256 "));
+ // Check the mapping is the identity, e.g., only comments are defined.
+ // Note, this could change if the mapping is ever changed to be complete, in which case the
+ // mapping will have actual identity mappings.
+ for (String line : StringUtils.splitLines(mapping)) {
+ assertThat(line, startsWith("#"));
+ }
+ }
+
@Test
public void testTheTestBuilder() throws Exception {
String mapping =
@@ -46,8 +68,7 @@
.addKeepMainRule(Main.class)
.compile()
.getProguardMap();
- // TODO(b/202076520): The identity mapping content should at minimum include the header info.
- assertEquals("", mapping);
+ checkIdentityMappingContent(mapping);
}
@Test
@@ -62,13 +83,14 @@
.setProguardMapOutputPath(mappingPath)
.setProgramConsumer(DexIndexedConsumer.emptyConsumer())
.build());
- // TODO(b/202076520): The identity mapping should we written to the file.
- assertFalse(Files.exists(mappingPath));
+ assertTrue(Files.exists(mappingPath));
+ checkIdentityMappingContent(FileUtils.readTextFile(mappingPath, StandardCharsets.UTF_8));
}
@Test
public void testStringConsumer() throws Exception {
BooleanBox consumerWasCalled = new BooleanBox(false);
+ StringBuilder mappingContent = new StringBuilder();
R8.run(
R8Command.builder()
.addProgramFiles(ToolHelper.getClassFileForTestClass(Main.class))
@@ -76,7 +98,12 @@
ImmutableList.of(keepMainProguardConfiguration(Main.class)), Origin.unknown())
.addLibraryFiles(ToolHelper.getJava8RuntimeJar())
.setProguardMapConsumer(
- new ForwardingConsumer(null) {
+ new StringConsumer() {
+ @Override
+ public void accept(String string, DiagnosticsHandler handler) {
+ mappingContent.append(string);
+ }
+
@Override
public void finished(DiagnosticsHandler handler) {
consumerWasCalled.set(true);
@@ -84,8 +111,8 @@
})
.setProgramConsumer(DexIndexedConsumer.emptyConsumer())
.build());
- // TODO(b/202076520): The identity mapping should at least still signal finish to the consumer.
- assertFalse(consumerWasCalled.get());
+ assertTrue(consumerWasCalled.get());
+ checkIdentityMappingContent(mappingContent.toString());
}
// Compiling this program with a keep main will result in an identity mapping for the residual
diff --git a/src/test/java/com/android/tools/r8/resource/KeepDirectoriesTest.java b/src/test/java/com/android/tools/r8/resource/KeepDirectoriesTest.java
index 4cbaf6c..416835f 100644
--- a/src/test/java/com/android/tools/r8/resource/KeepDirectoriesTest.java
+++ b/src/test/java/com/android/tools/r8/resource/KeepDirectoriesTest.java
@@ -15,7 +15,8 @@
import com.android.tools.r8.DataResourceConsumer;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.R8Command;
-import com.android.tools.r8.StringResource;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.naming.ClassNameMapper;
@@ -51,12 +52,16 @@
@Parameterized.Parameters(name = "Backend: {0}, Minify: {1}")
public static Collection<Object[]> data() {
- return buildParameters(ToolHelper.getBackends(), BooleanUtils.values());
+ return buildParameters(
+ ToolHelper.getBackends(),
+ BooleanUtils.values(),
+ TestParametersBuilder.builder().withNoneRuntime().build());
}
- public KeepDirectoriesTest(Backend backend, boolean minify) {
+ public KeepDirectoriesTest(Backend backend, boolean minify, TestParameters parameters) {
this.backend = backend;
this.minify = minify;
+ parameters.assertNoneRuntime();
}
// Return the original package name for this package.
@@ -66,14 +71,11 @@
// Return the package name in the app for this package.
private String pathForThisPackage(AndroidApp app) throws Exception {
- String name;
- if (app.getProguardMapOutputData() != null) {
- ClassNameMapper mapper =
- ClassNameMapper.mapperFromString(app.getProguardMapOutputData().getString());
- name = mapper.getObfuscatedToOriginalMapping().inverse.get(Main.class.getCanonicalName());
- } else {
- name = Main.class.getTypeName();
- }
+ ClassNameMapper mapper =
+ ClassNameMapper.mapperFromString(app.getProguardMapOutputData().getString());
+ String originalName = Main.class.getTypeName();
+ String name =
+ mapper.getObfuscatedToOriginalMapping().inverse.getOrDefault(originalName, originalName);
return name.substring(0, name.lastIndexOf('.')).replace('.', '/');
}