Revert changes to retrace tests
This reverts the changes to the retrace tests done in https://r8.googlesource.com/r8/+/379981992d91ccba4c802979b221225105a3f2ce
Change-Id: I978c98e935080896592ed0f6e03c64b0e4bff43b
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTraceTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTraceTest.java
index 671d075..8cd6b11 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTraceTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTraceTest.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.retrace.Retrace;
import com.android.tools.r8.retrace.RetraceStackTraceContext;
import com.android.tools.r8.retrace.RetraceStackTraceElementProxy;
+import com.android.tools.r8.retrace.RetracedMethodReference;
import com.android.tools.r8.retrace.RetracedMethodReference.KnownRetracedMethodReference;
import com.android.tools.r8.retrace.StackTraceElementProxy;
import com.android.tools.r8.retrace.StackTraceLineParser;
@@ -221,14 +222,23 @@
public StackTraceLine toRetracedItem(
RetraceStackTraceElementProxy<StackTraceLine, StackTraceLineProxy> retracedProxy,
boolean verbose) {
- KnownRetracedMethodReference knownRetracedMethodReference =
- retracedProxy.getRetracedMethod().asKnown();
- return new StackTraceLine(
- stackTraceLine.toString(),
- knownRetracedMethodReference.getMethodReference().getHolderClass().getTypeName(),
- knownRetracedMethodReference.getMethodName(),
- retracedProxy.getSourceFile(),
- knownRetracedMethodReference.getOriginalPositionOrDefault(0));
+ RetracedMethodReference retracedMethod = retracedProxy.getRetracedMethod();
+ if (retracedMethod == null) {
+ return new StackTraceLine(
+ stackTraceLine.toString(),
+ stackTraceLine.className,
+ stackTraceLine.methodName,
+ stackTraceLine.fileName,
+ stackTraceLine.lineNumber);
+ } else {
+ KnownRetracedMethodReference knownRetracedMethodReference = retracedMethod.asKnown();
+ return new StackTraceLine(
+ stackTraceLine.toString(),
+ knownRetracedMethodReference.getMethodReference().getHolderClass().getTypeName(),
+ knownRetracedMethodReference.getMethodName(),
+ retracedProxy.getSourceFile(),
+ knownRetracedMethodReference.getOriginalPositionOrDefault(0));
+ }
}
}
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceStackTracePromiseTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceStackTracePromiseTest.java
new file mode 100644
index 0000000..fb5dbad
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceStackTracePromiseTest.java
@@ -0,0 +1,222 @@
+// 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.retrace.api;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ThrowingFunction;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+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.Retrace;
+import com.android.tools.r8.retrace.RetraceStackTraceContext;
+import com.android.tools.r8.retrace.api.RetracePartitionStackTraceTest.IdentityStackTraceLineParser;
+import com.android.tools.r8.retrace.api.RetracePartitionStackTraceTest.StackTraceLineProxy;
+import com.android.tools.r8.utils.Box;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RetraceStackTracePromiseTest extends TestBase {
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ public RetraceStackTracePromiseTest(TestParameters parameters) {
+ parameters.assertNoneRuntime();
+ }
+
+ private final String MAPPING =
+ StringUtils.unixLines(
+ "com.Foo -> a:",
+ " 1:1:void m1():42:42 -> a",
+ "com.Bar -> b:",
+ " 2:2:void m2():43:43 -> b",
+ "com.Baz -> c:",
+ " 3:3:void m3():44:44 -> c");
+
+ public static class Promise<T> {
+
+ private final T value;
+
+ private Promise(T value) {
+ this.value = value;
+ }
+
+ public <R> Promise<R> then(ThrowingFunction<T, R, InterruptedException> f)
+ throws InterruptedException {
+ return new Promise<>(f.apply(value));
+ }
+
+ public <R> Promise<R> thenApply(ThrowingFunction<T, Promise<R>, InterruptedException> f)
+ throws InterruptedException {
+ return f.apply(value);
+ }
+ }
+
+ public static class PromiseRunner<T> {
+
+ public T run(Promise<T> promise) {
+ // Here we are cheating since we know the value is always available.
+ return promise.value;
+ }
+ }
+
+ public static class Storage {
+
+ private final byte[] metadata;
+ private final Map<String, byte[]> partitions;
+
+ public Storage(byte[] metadata, Map<String, byte[]> partitions) {
+ this.metadata = metadata;
+ this.partitions = partitions;
+ }
+
+ public Promise<byte[]> getMetadata() {
+ return new Promise<>(metadata);
+ }
+
+ public Promise<byte[]> getPartition(String key) {
+ return new Promise<>(partitions.getOrDefault(key, new byte[0]));
+ }
+ }
+
+ private Storage buildStorage(TestDiagnosticMessagesImpl diagnosticMessages) throws Exception {
+ Map<String, byte[]> partitions = new HashMap<>();
+ MappingPartitionMetadata metadataPromise =
+ ProguardMapPartitioner.builder(diagnosticMessages)
+ .setProguardMapProducer(ProguardMapProducer.fromString(MAPPING))
+ .setPartitionConsumer(
+ partition -> partitions.put(partition.getKey(), partition.getPayload()))
+ .build()
+ .run();
+ return new Storage(metadataPromise.getBytes(), partitions);
+ }
+
+ @SuppressWarnings("BusyWait")
+ private static <T, R> Promise<Map<T, R>> transpose(Map<T, Promise<R>> promiseMap)
+ throws InterruptedException {
+ Map<T, R> resolvedMap = new HashMap<>();
+ Box<InterruptedException> interruptedException = new Box<>();
+ promiseMap.forEach(
+ (key, promise) -> {
+ try {
+ promise.then(resolvedValue -> resolvedMap.put(key, resolvedValue));
+ } catch (InterruptedException e) {
+ interruptedException.set(e);
+ }
+ });
+ if (interruptedException.isSet()) {
+ throw interruptedException.get();
+ }
+ return new Promise<>(resolvedMap);
+ }
+
+ @Test
+ public void testRetrace() throws Exception {
+ TestDiagnosticMessagesImpl diagnosticMessages = new TestDiagnosticMessagesImpl();
+ Storage storage = buildStorage(diagnosticMessages);
+
+ List<StackTraceLine> minifiedStackTrace = new ArrayList<>();
+ minifiedStackTrace.add(StackTraceLine.parse("at a.a(SourceFile:1)"));
+ minifiedStackTrace.add(StackTraceLine.parse("at b.b(SourceFile:2)"));
+ minifiedStackTrace.add(StackTraceLine.parse("at c.c(SourceFile:3)"));
+
+ StackTrace retracedStacktrace =
+ new PromiseRunner<StackTrace>()
+ .run(
+ storage
+ .getMetadata()
+ .thenApply(
+ metadata -> {
+ Map<String, Promise<byte[]>> partitionRequests = new HashMap<>();
+ // TODO(b/278453715): Using the mapping supplier with promises require to
+ // iterate over the keys twice.
+ Retrace.<StackTraceLine, StackTraceLineProxy>builder()
+ .setStackTraceLineParser(new IdentityStackTraceLineParser())
+ .setDiagnosticsHandler(diagnosticMessages)
+ .setMappingSupplier(
+ PartitionMappingSupplier.builder()
+ .setRegisterMappingPartitionCallback(
+ key ->
+ partitionRequests.put(key, storage.getPartition(key)))
+ .setMappingPartitionFromKeySupplier(key -> new byte[0])
+ .build())
+ .build()
+ .retraceStackTrace(
+ minifiedStackTrace, RetraceStackTraceContext.empty());
+ return transpose(partitionRequests)
+ .then(
+ resolvedPartitions -> {
+ StackTrace.Builder retraceStackTraceBuilder =
+ StackTrace.builder();
+ Retrace.<StackTraceLine, StackTraceLineProxy>builder()
+ .setStackTraceLineParser(new IdentityStackTraceLineParser())
+ .setDiagnosticsHandler(diagnosticMessages)
+ .setMappingSupplier(
+ PartitionMappingSupplier.builder()
+ .setMappingPartitionFromKeySupplier(
+ key ->
+ resolvedPartitions.getOrDefault(
+ key, new byte[0]))
+ .build())
+ .build()
+ .retraceStackTrace(
+ minifiedStackTrace, RetraceStackTraceContext.empty())
+ .forEach(
+ retraced -> {
+ assertEquals(1, retraced.size());
+ retraced
+ .get(0)
+ .forEach(retraceStackTraceBuilder::add);
+ });
+ return retraceStackTraceBuilder.build();
+ });
+ }));
+ StackTrace expectedStackTrace =
+ StackTrace.builder()
+ .add(
+ StackTraceLine.builder()
+ .setClassName("com.Foo")
+ .setMethodName("m1")
+ .setFileName("Foo.java")
+ .setLineNumber(42)
+ .build())
+ .add(
+ StackTraceLine.builder()
+ .setClassName("com.Bar")
+ .setMethodName("m2")
+ .setFileName("Bar.java")
+ .setLineNumber(43)
+ .build())
+ .add(
+ StackTraceLine.builder()
+ .setClassName("com.Baz")
+ .setMethodName("m3")
+ .setFileName("Baz.java")
+ .setLineNumber(44)
+ .build())
+ .build();
+ assertThat(expectedStackTrace, isSame(retracedStacktrace));
+ }
+}