[Retrace] Consider MAP_VERSION_UNKNOWN to be less than all versions

Bug: b/296030714
Change-Id: I4a20b180219b320ba78b0c9dd92467a63fd731c5
diff --git a/src/main/java/com/android/tools/r8/naming/MapVersion.java b/src/main/java/com/android/tools/r8/naming/MapVersion.java
index b17a34a..0698a2e 100644
--- a/src/main/java/com/android/tools/r8/naming/MapVersion.java
+++ b/src/main/java/com/android/tools/r8/naming/MapVersion.java
@@ -9,13 +9,13 @@
 
 @Keep
 public enum MapVersion implements Ordered<MapVersion> {
+  MAP_VERSION_UNKNOWN("unknown"),
   MAP_VERSION_NONE("none"),
   MAP_VERSION_1_0("1.0"),
   MAP_VERSION_2_0("2.0"),
   MAP_VERSION_2_1("2.1"),
   MAP_VERSION_2_2("2.2"),
-  MAP_VERSION_EXPERIMENTAL("experimental"),
-  MAP_VERSION_UNKNOWN("unknown");
+  MAP_VERSION_EXPERIMENTAL("experimental");
 
   public static final MapVersion STABLE = MAP_VERSION_2_2;
 
diff --git a/src/test/java/com/android/tools/r8/retrace/partition/RetracePartitionNoMapVersionTest.java b/src/test/java/com/android/tools/r8/retrace/partition/RetracePartitionNoMapVersionTest.java
index 8996ae5..412c7c8 100644
--- a/src/test/java/com/android/tools/r8/retrace/partition/RetracePartitionNoMapVersionTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/partition/RetracePartitionNoMapVersionTest.java
@@ -4,17 +4,32 @@
 
 package com.android.tools.r8.retrace.partition;
 
-import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.naming.MapVersion;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.MappingPartitionFromKeySupplier;
+import com.android.tools.r8.retrace.MappingPartitionMetadata;
+import com.android.tools.r8.retrace.PartitionMappingSupplier;
 import com.android.tools.r8.retrace.ProguardMapPartitioner;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceStackTraceContext;
+import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedSingleFrame;
+import com.android.tools.r8.retrace.Retracer;
+import com.android.tools.r8.retrace.internal.MappingPartitionMetadataInternal;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.OptionalInt;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -44,14 +59,53 @@
 
   @Test
   public void test() throws IOException {
-    // TODO(b/296030714): Should be fixed if moving UNKNOWN below a known version in the lattice.
-    assertThrows(
-        CompilationError.class,
-        () ->
-            ProguardMapPartitioner.builder(new DiagnosticsHandler() {})
-                .setProguardMapProducer(ProguardMapProducer.fromString(MAPPING))
-                .setPartitionConsumer(partition -> {})
-                .build()
-                .run());
+    Map<String, byte[]> partitions = new HashMap<>();
+    DiagnosticsHandler diagnosticsHandler = new DiagnosticsHandler() {};
+    MappingPartitionMetadata metadata =
+        ProguardMapPartitioner.builder(diagnosticsHandler)
+            .setProguardMapProducer(ProguardMapProducer.fromString(MAPPING))
+            .setPartitionConsumer(
+                partition -> partitions.put(partition.getKey(), partition.getPayload()))
+            .build()
+            .run();
+    // Retracing with the original metadata not having a version will not make us read additional
+    // mapping information.
+    retraceWithMetadata(metadata.getBytes(), partitions::get, false);
+    // Retracing with metadata setting a version will let us read the metadata. This shows that we
+    // keep the additional information when partitioning.
+    retraceWithMetadata(
+        MappingPartitionMetadataInternal.ObfuscatedTypeNameAsKeyMetadata.create(
+                MapVersion.MAP_VERSION_2_0)
+            .getBytes(),
+        partitions::get,
+        true);
+  }
+
+  private void retraceWithMetadata(
+      byte[] metadata, MappingPartitionFromKeySupplier supplier, boolean expectSynthetic) {
+    DiagnosticsHandler diagnosticsHandler = new DiagnosticsHandler() {};
+    ClassReference k3Class = Reference.classFromTypeName("K3");
+    Retracer retracer =
+        PartitionMappingSupplier.builder()
+            .setMetadata(metadata)
+            .setMappingPartitionFromKeySupplier(supplier)
+            .build()
+            .registerClassUse(diagnosticsHandler, k3Class)
+            .createRetracer(diagnosticsHandler);
+    List<RetracedMethodReference> allRetracedFrames =
+        retracer
+            .retraceFrame(
+                RetraceStackTraceContext.empty(),
+                OptionalInt.of(1),
+                Reference.methodFromDescriptor(k3Class, "a", "()V"))
+            .stream()
+            .flatMap(
+                frameElement -> {
+                  assertEquals(expectSynthetic, frameElement.isCompilerSynthesized());
+                  return frameElement.stream().map(RetracedSingleFrame::getMethodReference);
+                })
+            .collect(Collectors.toList());
+    assertEquals(1, allRetracedFrames.size());
+    assertEquals("build", allRetracedFrames.get(0).getMethodName());
   }
 }