[Retrace] Add internal tests

Bug: 159425023
Bug: 159420576
Change-Id: I344f412b9ec4817c29a967e52d035a748ff42ebf
diff --git a/.gitignore b/.gitignore
index 0629bac..e184eb8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -141,6 +141,8 @@
 third_party/remapper.tar.gz
 third_party/retrace_benchmark
 third_party/retrace_benchmark.tar.gz
+third_party/retrace_internal
+third_party/retrace_internal.tar.gz
 third_party/rhino-1.7.10
 third_party/rhino-1.7.10.tar.gz
 third_party/rhino-android-1.1.1
diff --git a/build.gradle b/build.gradle
index d4a1c75..909d605 100644
--- a/build.gradle
+++ b/build.gradle
@@ -427,6 +427,7 @@
         "proguardsettings",
         "proto",
         "protobuf-lite",
+        "retrace_internal",
         "youtube/youtube.android_12.10",
         "youtube/youtube.android_12.17",
         "youtube/youtube.android_12.22",
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
new file mode 100644
index 0000000..d1dbb1d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
@@ -0,0 +1,85 @@
+// Copyright (c) 2020, 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.internal.retrace;
+
+import static com.android.tools.r8.retrace.Retrace.DEFAULT_REGULAR_EXPRESSION;
+
+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.internal.retrace.stacktraces.CoreStackTrace;
+import com.android.tools.r8.internal.retrace.stacktraces.CronetStackTrace;
+import com.android.tools.r8.internal.retrace.stacktraces.FinskyStackTrace;
+import com.android.tools.r8.internal.retrace.stacktraces.VelvetStackTrace;
+import com.android.tools.r8.retrace.Retrace;
+import com.android.tools.r8.retrace.RetraceCommand;
+import com.android.tools.r8.retrace.stacktraces.StackTraceForTest;
+import java.util.List;
+import java.util.function.BiConsumer;
+import junit.framework.TestCase;
+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 RetraceTests extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public RetraceTests(TestParameters parameters) {}
+
+  @Test
+  public void testCronetStackTrace() {
+    runRetraceTest(new CronetStackTrace());
+  }
+
+  @Test
+  public void testFinskyStackTrace() {
+    runRetraceTest(new FinskyStackTrace(), "(?:.*Finsky\\s+:\\s+\\[\\d+\\]\\s+%c\\.%m\\(%l\\):.*)");
+  }
+
+  @Test
+  public void testVelvetStackTrace() {
+    runRetraceTest(new VelvetStackTrace());
+  }
+
+  @Test
+  public void testCoreStackTrace() {
+    // TODO(b/159420576): Figure out why we cannot retrace this.
+    runRetraceTest(new CoreStackTrace(), DEFAULT_REGULAR_EXPRESSION, Assert::assertNotEquals);
+  }
+
+  private TestDiagnosticMessagesImpl runRetraceTest(StackTraceForTest stackTraceForTest) {
+    return runRetraceTest(stackTraceForTest, DEFAULT_REGULAR_EXPRESSION);
+  }
+
+  private TestDiagnosticMessagesImpl runRetraceTest(
+      StackTraceForTest stackTraceForTest, String regularExpression) {
+    return runRetraceTest(stackTraceForTest, regularExpression, TestCase::assertEquals);
+  }
+
+  private TestDiagnosticMessagesImpl runRetraceTest(
+      StackTraceForTest stackTraceForTest,
+      String regularExpression,
+      BiConsumer<List<String>, List<String>> matcher) {
+    TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
+    RetraceCommand retraceCommand =
+        RetraceCommand.builder(diagnosticsHandler)
+            .setProguardMapProducer(stackTraceForTest::mapping)
+            .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
+            .setRegularExpression(regularExpression)
+            .setRetracedStackTraceConsumer(
+                retraced -> matcher.accept(stackTraceForTest.retracedStackTrace(), retraced))
+            .build();
+    Retrace.run(retraceCommand);
+    return diagnosticsHandler;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CoreStackTrace.java b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CoreStackTrace.java
new file mode 100644
index 0000000..480c00d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CoreStackTrace.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.internal.retrace.stacktraces;
+
+public class CoreStackTrace extends RetraceInternalStackTraceForTest {
+
+  public CoreStackTrace() {
+    super("core_obfuscated.txt", "core_deobfuscated.txt");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CronetStackTrace.java b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CronetStackTrace.java
new file mode 100644
index 0000000..aa24fbc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/CronetStackTrace.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.internal.retrace.stacktraces;
+
+public class CronetStackTrace extends RetraceInternalStackTraceForTest {
+
+  public CronetStackTrace() {
+    super("cronet_obfuscated.txt", "cronet_deobfuscated.txt");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/FinskyStackTrace.java b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/FinskyStackTrace.java
new file mode 100644
index 0000000..6fde480
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/FinskyStackTrace.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.internal.retrace.stacktraces;
+
+public class FinskyStackTrace extends RetraceInternalStackTraceForTest {
+
+  public FinskyStackTrace() {
+    super("finsky_obfuscated.txt", "finsky_deobfuscated.txt");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/RetraceInternalStackTraceForTest.java b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/RetraceInternalStackTraceForTest.java
new file mode 100644
index 0000000..e4005de
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/RetraceInternalStackTraceForTest.java
@@ -0,0 +1,63 @@
+// Copyright (c) 2020, 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.internal.retrace.stacktraces;
+
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.retrace.stacktraces.StackTraceForTest;
+import com.android.tools.r8.utils.FileUtils;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+public class RetraceInternalStackTraceForTest implements StackTraceForTest {
+
+  private static final Path retraceInternal =
+      Paths.get(ToolHelper.THIRD_PARTY_DIR).resolve("retrace_internal");
+  private final Path obfuscatedPath;
+  private final Path deobfuscatedPath;
+
+  public RetraceInternalStackTraceForTest(String obfuscatedFile, String deobfuscatedFile) {
+    this.obfuscatedPath = retraceInternal.resolve(obfuscatedFile);
+    this.deobfuscatedPath = retraceInternal.resolve(deobfuscatedFile);
+  }
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    try {
+      return FileUtils.readAllLines(obfuscatedPath);
+    } catch (IOException e) {
+      e.printStackTrace();
+      throw new RuntimeException("Could not read file " + obfuscatedPath.toString());
+    }
+  }
+
+  @Override
+  public String mapping() {
+    Path mappingPath = retraceInternal.resolve("mapping.txt");
+    try {
+      return new String(Files.readAllBytes(mappingPath));
+    } catch (IOException e) {
+      e.printStackTrace();
+      throw new RuntimeException("Could not read mapping file " + mappingPath.toString());
+    }
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    try {
+      return FileUtils.readAllLines(deobfuscatedPath);
+    } catch (IOException e) {
+      e.printStackTrace();
+      throw new RuntimeException("Could not read file " + deobfuscatedPath.toString());
+    }
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 0;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/VelvetStackTrace.java b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/VelvetStackTrace.java
new file mode 100644
index 0000000..a2f468e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/retrace/stacktraces/VelvetStackTrace.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.internal.retrace.stacktraces;
+
+public class VelvetStackTrace extends RetraceInternalStackTraceForTest {
+
+  public VelvetStackTrace() {
+    super("velvet_obfuscated.txt", "velvet_deobfuscated.txt");
+  }
+}
diff --git a/third_party/retrace_internal.tar.gz.sha1 b/third_party/retrace_internal.tar.gz.sha1
new file mode 100644
index 0000000..b840e19
--- /dev/null
+++ b/third_party/retrace_internal.tar.gz.sha1
@@ -0,0 +1 @@
+f00aa79849d9eb8a16accaca566ac275f4711d8e
\ No newline at end of file