[Retrace] Add api tests for synthesized

Bug: 172014416
Change-Id: I7aff4b397ebfc4aa5568f751db4a4683c03f9888
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedClassTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedClassTest.java
new file mode 100644
index 0000000..6b6e3fd
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedClassTest.java
@@ -0,0 +1,55 @@
+// Copyright (c) 2021, 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceClassElement;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSynthesizedClassTest extends RetraceApiTestBase {
+
+  public RetraceApiSynthesizedClassTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+            + "some.Class -> a:\n"
+            + "# { id: 'com.android.tools.r8.synthesized' }\n"
+            + "  1:3:int strawberry(int):99:101 -> s\n"
+            + "  4:5:int mango(float):121:122 -> s";
+
+    @Test
+    public void testSyntheticClass() {
+      List<RetraceClassElement> classResults =
+          Retracer.createDefault(
+                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+              .retraceClass(Reference.classFromTypeName("a"))
+              .stream()
+              .collect(Collectors.toList());
+      assertEquals(1, classResults.size());
+      assertTrue(classResults.get(0).isCompilerSynthesized());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java
new file mode 100644
index 0000000..d934a5f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java
@@ -0,0 +1,56 @@
+// Copyright (c) 2021, 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceFieldElement;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSynthesizedFieldTest extends RetraceApiTestBase {
+
+  public RetraceApiSynthesizedFieldTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+            + "some.Class -> a:\n"
+            + "  int foo -> a\n"
+            + "  # { id: 'com.android.tools.r8.synthesized' }";
+
+    @Test
+    public void testSyntheticClass() {
+      List<RetraceFieldElement> fieldResults =
+          Retracer.createDefault(
+                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+              .retraceClass(Reference.classFromTypeName("a"))
+              .stream()
+              .flatMap(element -> element.lookupField("a").stream())
+              .collect(Collectors.toList());
+      assertEquals(1, fieldResults.size());
+      // TODO(b/172014416): Should report if synthesized.
+      assertThrows(RuntimeException.class, () -> fieldResults.get(0).isCompilerSynthesized());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java
new file mode 100644
index 0000000..e7da9a7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java
@@ -0,0 +1,66 @@
+// Copyright (c) 2021, 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 org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceFrameElement;
+import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSynthesizedFrameTest extends RetraceApiTestBase {
+
+  public RetraceApiSynthesizedFrameTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+            + "some.Class -> a:\n"
+            + "  3:3:int other.strawberry(int):101:101 -> a\n"
+            + "  3:3:int mango(float):28 -> a\n"
+            + "  # { id: 'com.android.tools.r8.synthesized' }";
+
+    @Test
+    public void testSyntheticClass() {
+      List<RetraceFrameElement> frameResults =
+          Retracer.createDefault(
+                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+              .retraceClass(Reference.classFromTypeName("a"))
+              .stream()
+              .flatMap(element -> element.lookupFrame("a", 3).stream())
+              .collect(Collectors.toList());
+      assertEquals(1, frameResults.size());
+      RetraceFrameElement retraceFrameElement = frameResults.get(0);
+      List<RetracedMethodReference> allFrames = new ArrayList<>();
+      retraceFrameElement.visitAllFrames((method, ignored) -> allFrames.add(method));
+      assertEquals(2, allFrames.size());
+      List<RetracedMethodReference> nonSyntheticFrames = new ArrayList<>();
+      retraceFrameElement.visitNonCompilerSynthesizedFrames(
+          (method, ignored) -> nonSyntheticFrames.add(method));
+      assertEquals(1, nonSyntheticFrames.size());
+      assertEquals(nonSyntheticFrames.get(0), allFrames.get(0));
+      assertEquals("mango", allFrames.get(1).getMethodName());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
new file mode 100644
index 0000000..96aa22d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
@@ -0,0 +1,64 @@
+// Copyright (c) 2021, 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 org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceFrameElement;
+import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSynthesizedInnerFrameTest extends RetraceApiTestBase {
+
+  public RetraceApiSynthesizedInnerFrameTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+            + "some.Class -> a:\n"
+            + "  3:3:int other.strawberry(int):101:101 -> a\n"
+            + "  # { id: 'com.android.tools.r8.synthesized' }\n"
+            + "  3:3:int mango(float):28 -> a";
+
+    @Test
+    public void testSyntheticClass() {
+      List<RetraceFrameElement> frameResults =
+          Retracer.createDefault(
+                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+              .retraceClass(Reference.classFromTypeName("a"))
+              .stream()
+              .flatMap(element -> element.lookupFrame("a", 3).stream())
+              .collect(Collectors.toList());
+      assertEquals(1, frameResults.size());
+      RetraceFrameElement retraceFrameElement = frameResults.get(0);
+      List<RetracedMethodReference> allFrames = new ArrayList<>();
+      retraceFrameElement.visitAllFrames((method, ignored) -> allFrames.add(method));
+      assertEquals(2, allFrames.size());
+      List<RetracedMethodReference> nonSyntheticFrames = new ArrayList<>();
+      retraceFrameElement.visitNonCompilerSynthesizedFrames(
+          (method, ignored) -> nonSyntheticFrames.add(method));
+      assertEquals(allFrames, nonSyntheticFrames);
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java
new file mode 100644
index 0000000..39228e2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java
@@ -0,0 +1,59 @@
+// Copyright (c) 2021, 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 org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceMethodElement;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSynthesizedMethodTest extends RetraceApiTestBase {
+
+  public RetraceApiSynthesizedMethodTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "# { id: 'com.android.tools.r8.mapping', version: '1.0' }\n"
+            + "some.Class -> a:\n"
+            + "  void foo() -> a\n"
+            + "  # { id: 'com.android.tools.r8.synthesized' }";
+
+    @Test
+    public void testSyntheticClass() {
+      List<RetraceMethodElement> methodResults =
+          Retracer.createDefault(
+                  ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+              .retraceClass(Reference.classFromTypeName("a"))
+              .stream()
+              .flatMap(element -> element.lookupMethod("a").stream())
+              .collect(Collectors.toList());
+      assertEquals(1, methodResults.size());
+      RetraceMethodElement retraceMethodElement = methodResults.get(0);
+      assertFalse(retraceMethodElement.isUnknown());
+      // TODO(b/172014416): Should report if synthesized.
+      assertThrows(RuntimeException.class, () -> methodResults.get(0).isCompilerSynthesized());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
index 6c8b2ba..7fad751 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.retrace.api.RetraceApiInferSourceFileTest.ApiTest;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.transformers.ClassFileTransformer.InnerClassPredicate;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -38,7 +37,12 @@
       ImmutableList.of(
           RetraceApiEmptyTest.RetraceTest.class,
           RetraceApiSourceFileTest.ApiTest.class,
-          ApiTest.class);
+          RetraceApiInferSourceFileTest.ApiTest.class,
+          RetraceApiSynthesizedClassTest.ApiTest.class,
+          RetraceApiSynthesizedFieldTest.ApiTest.class,
+          RetraceApiSynthesizedMethodTest.ApiTest.class,
+          RetraceApiSynthesizedFrameTest.ApiTest.class,
+          RetraceApiSynthesizedInnerFrameTest.ApiTest.class);
   public static List<Class<? extends RetraceApiBinaryTest>> CLASSES_PENDING_BINARY_COMPATIBILITY =
       ImmutableList.of();
 
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 260d17b..826dbae 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-a353c2ec25bcf9b5f98aa5c9a15758139e676a38
\ No newline at end of file
+bd5d0c9d87504c31d996be84ba3379838027acf6
\ No newline at end of file