[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());
}
}