[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