[Retrace] Add retrace api test for source file

Change-Id: Ib4f245033689a81b96da8773f247ba6bdf299c5c
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
index 076d4da..1e04b54 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
@@ -10,7 +10,7 @@
 @Keep
 public interface RetraceSourceFileResult {
 
-  boolean isSynthesized();
+  boolean isInferred();
 
   String getFilename();
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
index b84b1a6..7595d69 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
@@ -17,7 +17,7 @@
   }
 
   @Override
-  public boolean isSynthesized() {
+  public boolean isInferred() {
     return synthesized;
   }
 
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
index 6d9c328..4b8f03f 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
@@ -7,6 +7,7 @@
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestBase;
@@ -15,6 +16,7 @@
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.ZipUtils;
+import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -79,15 +81,31 @@
   public void runCheckedInBinaryJar() throws Exception {
     // The retrace jar is only built when building r8lib.
     Path jar = ToolHelper.isTestingR8Lib() ? ToolHelper.R8_RETRACE_JAR : ToolHelper.R8_JAR;
-    for (CfRuntime cfRuntime : CfRuntime.getCheckedInCfRuntimes()) {
-      RetraceApiTestHelper.runJunitOnTests(
-          cfRuntime,
-          jar,
-          BINARY_COMPATIBILITY_JAR,
-          RetraceApiTestHelper.getBinaryCompatibilityTests());
-    }
+    RetraceApiTestHelper.runJunitOnTests(
+        CfRuntime.getSystemRuntime(),
+        jar,
+        BINARY_COMPATIBILITY_JAR,
+        RetraceApiTestHelper.getBinaryCompatibilityTests());
   }
 
+  @Test
+  public void runCheckedInWithNonExistingTest() {
+    Path jar = ToolHelper.isTestingR8Lib() ? ToolHelper.R8_RETRACE_JAR : ToolHelper.R8_JAR;
+    assertThrows(
+        AssertionError.class,
+        () -> {
+          RetraceApiTestHelper.runJunitOnTests(
+              CfRuntime.getSystemRuntime(),
+              jar,
+              BINARY_COMPATIBILITY_JAR,
+              ImmutableList.of(new RetraceApiBinaryTest() {}.getClass()));
+        });
+  }
+
+  /**
+   * To produce a new tests.jar run the code below. This will generate a new jar overwriting the
+   * existing one. Remember to upload to cloud storage afterwards.
+   */
   public static void main(String[] args) throws Exception {
     TemporaryFolder temp = new TemporaryFolder();
     temp.create();
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java
new file mode 100644
index 0000000..e35be6f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java
@@ -0,0 +1,52 @@
+// 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.RetraceSourceFileResult;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiInferSourceFileTest extends RetraceApiTestBase {
+
+  public RetraceApiInferSourceFileTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "some.Class -> a:\n"
+            + "  1:3:int strawberry(int):99:101 -> s\n"
+            + "  4:5:int mango(float):121:122 -> s";
+
+    @Test
+    public void testRetracingSourceFile() {
+      List<RetraceSourceFileResult> sourceFileResults = new ArrayList<>();
+      Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+          .retraceClass(Reference.classFromTypeName("a"))
+          .forEach(clazz -> sourceFileResults.add(clazz.retraceSourceFile("")));
+      assertEquals(1, sourceFileResults.size());
+      assertTrue(sourceFileResults.get(0).isInferred());
+      assertEquals("Class.java", sourceFileResults.get(0).getFilename());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java
new file mode 100644
index 0000000..f75ea42
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java
@@ -0,0 +1,53 @@
+// 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 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.RetraceSourceFileResult;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSourceFileTest extends RetraceApiTestBase {
+
+  public RetraceApiSourceFileTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  public static class ApiTest implements RetraceApiBinaryTest {
+
+    private final String mapping =
+        "some.Class -> a:\n"
+            + " # {'id':'sourceFile','fileName':'SomeFileName.kt'}\n"
+            + "  1:3:int strawberry(int):99:101 -> s\n"
+            + "  4:5:int mango(float):121:122 -> s\n";
+
+    @Test
+    public void testRetracingSourceFile() {
+      List<RetraceSourceFileResult> sourceFileResults = new ArrayList<>();
+      Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+          .retraceClass(Reference.classFromTypeName("a"))
+          .forEach(clazz -> sourceFileResults.add(clazz.retraceSourceFile("")));
+      assertEquals(1, sourceFileResults.size());
+      assertFalse(sourceFileResults.get(0).isInferred());
+      assertEquals("SomeFileName.kt", sourceFileResults.get(0).getFilename());
+    }
+  }
+}
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 7f9834b..6c8b2ba 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,16 +13,17 @@
 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;
-import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.ZipUtils;
 import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -34,7 +35,10 @@
   private static final String HAMCREST = "hamcrest-core-1.3.jar";
 
   public static List<Class<? extends RetraceApiBinaryTest>> CLASSES_FOR_BINARY_COMPATIBILITY =
-      ImmutableList.of(RetraceApiEmptyTest.RetraceTest.class);
+      ImmutableList.of(
+          RetraceApiEmptyTest.RetraceTest.class,
+          RetraceApiSourceFileTest.ApiTest.class,
+          ApiTest.class);
   public static List<Class<? extends RetraceApiBinaryTest>> CLASSES_PENDING_BINARY_COMPATIBILITY =
       ImmutableList.of();
 
@@ -57,12 +61,11 @@
       Collection<Class<? extends RetraceApiBinaryTest>> tests)
       throws Exception {
     List<Path> classPaths = ImmutableList.of(getJunitDependency(), getHamcrest(), r8Jar, testJar);
+    List<String> args = new ArrayList<>();
+    args.add("org.junit.runner.JUnitCore");
+    tests.forEach(test -> args.add(test.getTypeName()));
     ProcessResult processResult =
-        ToolHelper.runJava(
-            runtime,
-            classPaths,
-            "org.junit.runner.JUnitCore",
-            StringUtils.join(" ", tests, Class::getTypeName));
+        ToolHelper.runJava(runtime, classPaths, args.toArray(new String[0]));
     assertEquals(processResult.toString(), 0, processResult.exitCode);
     assertThat(processResult.stdout, containsString("OK (" + tests.size() + " test"));
   }
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 3825d93..260d17b 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-63dd09b086d0d134219a379720c6b68a94afdf48
\ No newline at end of file
+a353c2ec25bcf9b5f98aa5c9a15758139e676a38
\ No newline at end of file