[Retrace] Move promise test out

Change-Id: I5a52795f7fb4a0d607c08e3388a8cb0e5804bafa
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTypeResultTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTypeResultTest.java
index 72a17ac..e8254ff 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTypeResultTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTypeResultTest.java
@@ -13,7 +13,6 @@
 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.references.ClassReference;
@@ -21,24 +20,18 @@
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.MappingPartitionMetadata;
 import com.android.tools.r8.retrace.PartitionMappingSupplier;
-import com.android.tools.r8.retrace.PartitionMappingSupplierAsync;
 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.RetraceAsync;
-import com.android.tools.r8.retrace.RetraceAsyncResult;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetraceStackTraceElementProxy;
-import com.android.tools.r8.retrace.RetraceStackTraceResult;
 import com.android.tools.r8.retrace.RetraceTypeElement;
 import com.android.tools.r8.retrace.RetracedMethodReference;
 import com.android.tools.r8.retrace.RetracedMethodReference.KnownRetracedMethodReference;
 import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.retrace.StackTraceElementProxy;
 import com.android.tools.r8.retrace.StackTraceLineParser;
-import com.android.tools.r8.retrace.api.RetraceApiTypeResultTest.RetracePartitionStackTraceTest.IdentityStackTraceLineParser;
 import com.android.tools.r8.utils.BooleanBox;
-import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -100,190 +93,6 @@
   }
 
   @RunWith(Parameterized.class)
-  public static class RetracePartitionStackTracePromiseTest extends TestBase {
-
-    @Parameters(name = "{0}")
-    public static TestParametersCollection data() {
-      return getTestParameters().withNoneRuntime().build();
-    }
-
-    public RetracePartitionStackTracePromiseTest(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);
-    }
-
-    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<>();
-                            RetraceAsyncResult<RetraceStackTraceResult<StackTraceLine>>
-                                asyncResult =
-                                    RetraceAsync
-                                        .<StackTraceLine,
-                                            RetracePartitionStackTraceTest.StackTraceLineProxy>
-                                            builder()
-                                        .setStackTraceLineParser(new IdentityStackTraceLineParser())
-                                        .setDiagnosticsHandler(diagnosticMessages)
-                                        .setMappingSupplier(
-                                            PartitionMappingSupplierAsync.builder()
-                                                .setMetadata(metadata)
-                                                .setRegisterMappingPartitionCallback(
-                                                    key ->
-                                                        partitionRequests.put(
-                                                            key, storage.getPartition(key)))
-                                                .build())
-                                        .build()
-                                        .retraceStackTrace(
-                                            minifiedStackTrace, RetraceStackTraceContext.empty());
-                            return getThen(partitionRequests, asyncResult);
-                          }));
-      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(retracedStacktrace, isSame(expectedStackTrace));
-    }
-
-    // This method needs to be outlined due to a bug in javac 8.
-    private Promise<StackTrace> getThen(
-        Map<String, Promise<byte[]>> partitionRequests,
-        RetraceAsyncResult<RetraceStackTraceResult<StackTraceLine>> asyncResult)
-        throws InterruptedException {
-      return transpose(partitionRequests)
-          .then(
-              resolvedPartitions -> {
-                StackTrace.Builder retraceStackTraceBuilder = StackTrace.builder();
-                asyncResult
-                    .getResult(resolvedPartitions::get)
-                    .forEach(
-                        retraced -> {
-                          Assert.assertEquals(1, retraced.size());
-                          retraced.get(0).forEach(retraceStackTraceBuilder::add);
-                        });
-                return retraceStackTraceBuilder.build();
-              });
-    }
-  }
-
-  @RunWith(Parameterized.class)
   public static class RetracePartitionStackTraceTest extends TestBase {
 
     @Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTracePromiseTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTracePromiseTest.java
new file mode 100644
index 0000000..3515d32
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionStackTracePromiseTest.java
@@ -0,0 +1,220 @@
+// 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 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.PartitionMappingSupplierAsync;
+import com.android.tools.r8.retrace.ProguardMapPartitioner;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceAsync;
+import com.android.tools.r8.retrace.RetraceAsyncResult;
+import com.android.tools.r8.retrace.RetraceStackTraceContext;
+import com.android.tools.r8.retrace.RetraceStackTraceResult;
+import com.android.tools.r8.retrace.api.RetraceApiTypeResultTest.RetracePartitionStackTraceTest;
+import com.android.tools.r8.retrace.api.RetraceApiTypeResultTest.RetracePartitionStackTraceTest.IdentityStackTraceLineParser;
+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.Assert;
+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 RetracePartitionStackTracePromiseTest extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public RetracePartitionStackTracePromiseTest(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);
+  }
+
+  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<>();
+                          RetraceAsyncResult<RetraceStackTraceResult<StackTraceLine>> asyncResult =
+                              RetraceAsync
+                                  .<StackTraceLine,
+                                      RetracePartitionStackTraceTest.StackTraceLineProxy>
+                                      builder()
+                                  .setStackTraceLineParser(new IdentityStackTraceLineParser())
+                                  .setDiagnosticsHandler(diagnosticMessages)
+                                  .setMappingSupplier(
+                                      PartitionMappingSupplierAsync.builder()
+                                          .setMetadata(metadata)
+                                          .setRegisterMappingPartitionCallback(
+                                              key ->
+                                                  partitionRequests.put(
+                                                      key, storage.getPartition(key)))
+                                          .build())
+                                  .build()
+                                  .retraceStackTrace(
+                                      minifiedStackTrace, RetraceStackTraceContext.empty());
+                          return getThen(partitionRequests, asyncResult);
+                        }));
+    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(retracedStacktrace, isSame(expectedStackTrace));
+  }
+
+  // This method needs to be outlined due to a bug in javac 8.
+  private Promise<StackTrace> getThen(
+      Map<String, Promise<byte[]>> partitionRequests,
+      RetraceAsyncResult<RetraceStackTraceResult<StackTraceLine>> asyncResult)
+      throws InterruptedException {
+    return transpose(partitionRequests)
+        .then(
+            resolvedPartitions -> {
+              StackTrace.Builder retraceStackTraceBuilder = StackTrace.builder();
+              asyncResult
+                  .getResult(resolvedPartitions::get)
+                  .forEach(
+                      retraced -> {
+                        Assert.assertEquals(1, retraced.size());
+                        retraced.get(0).forEach(retraceStackTraceBuilder::add);
+                      });
+              return retraceStackTraceBuilder.build();
+            });
+  }
+}
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 4659358..c82ea4f 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-cc086e35ef1bb4754cbfa8498af00dc5b9e43002
\ No newline at end of file
+a6004e441b5237c3b5436b64011eac6552e68faa
\ No newline at end of file