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('.', '/');
   }