Migrate legacy test MiniferMethodSignatureTest

Bug: 167145686
Change-Id: Ia7f967200476c12ba927e6d10e1105fc410b499f
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index a275bdb..88d208d 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -4,8 +4,11 @@
 
 package com.android.tools.r8.naming;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -24,12 +27,13 @@
 import static org.objectweb.asm.Opcodes.RETURN;
 import static org.objectweb.asm.Opcodes.V1_8;
 
-import com.android.tools.r8.DiagnosticsChecker;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.TestDiagnosticMessages;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.shaking.ProguardKeepAttributes;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
@@ -47,6 +51,180 @@
 
 @RunWith(Parameterized.class)
 public class MinifierMethodSignatureTest extends TestBase {
+
+  private final String genericSignature = "<T:Ljava/lang/Throwable;>(TT;LMethods<TT;>.Inner;)TT;";
+  private final String parameterizedReturnSignature = "()LMethods<TX;>.Inner;";
+  private final String parameterizedArgumentsSignature = "(TX;LMethods<TX;>.Inner;)V";
+  private final String parametrizedThrowsSignature = "()V^TX;";
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  public MinifierMethodSignatureTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void originalJavacSignatures() throws Exception {
+    // Test using the signatures generated by javac.
+    runTest(ImmutableMap.of(), this::noWarnings, this::noInspection);
+  }
+
+  @Test
+  public void signatureEmpty() throws Exception {
+    testSingleMethod(
+        "generic",
+        "",
+        this::noWarnings,
+        inspector -> {
+          noSignatureAttribute(lookupGeneric(inspector));
+        });
+  }
+
+  @Test
+  public void signatureInvalid() throws Exception {
+    testSingleMethod(
+        "generic",
+        "X",
+        diagnostics -> {
+          diagnostics.assertWarningsCount(1);
+          diagnostics.assertWarningsMatch(
+              diagnosticMessage(
+                  allOf(
+                      containsString("Invalid signature 'X' for method"),
+                      containsString(
+                          "java.lang.Throwable Methods.generic(java.lang.Throwable,"
+                              + " Methods$Inner)"),
+                      containsString("Expected ( at position 1"))));
+        },
+        inspector -> noSignatureAttribute(lookupGeneric(inspector)));
+  }
+
+  @Test
+  public void classNotFound() throws Exception {
+    String signature = "<T:LNotFound;>(TT;LAlsoNotFound<TT;>.InnerNotFound.InnerAlsoNotFound;)TT;";
+    testSingleMethod(
+        "generic",
+        signature,
+        this::noWarnings,
+        inspector -> {
+          ClassSubject methods = inspector.clazz("Methods");
+          MethodSubject method =
+              methods.method(
+                  "java.lang.Throwable",
+                  "generic",
+                  ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
+          assertThat(inspector.clazz("NotFound"), not(isPresent()));
+          assertEquals(signature, method.getOriginalSignatureAttribute());
+        });
+  }
+
+  @Test
+  public void multipleWarnings() throws Exception {
+    runTest(
+        ImmutableMap.of(
+            "generic", "X",
+            "parameterizedReturn", "X",
+            "parameterizedArguments", "X"),
+        diagnostics -> {
+          diagnostics.assertWarningsCount(3);
+        },
+        inspector -> {
+          noSignatureAttribute(lookupGeneric(inspector));
+          noSignatureAttribute(lookupParameterizedReturn(inspector));
+          noSignatureAttribute(lookupParameterizedArguments(inspector));
+        });
+  }
+
+  private void testSingleMethod(
+      String name,
+      String signature,
+      Consumer<TestDiagnosticMessages> diagnostics,
+      Consumer<CodeInspector> inspector)
+      throws Exception {
+    ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
+    runTest(signatures, diagnostics, inspector);
+  }
+
+  private void isOriginUnknown(Origin origin) {
+    assertSame(Origin.unknown(), origin);
+  }
+
+  private void noWarnings(TestDiagnosticMessages messages) {
+    messages.assertNoWarnings();
+  }
+
+  private void noInspection(CodeInspector inspector) {}
+
+  private void noSignatureAttribute(MethodSubject method) {
+    assertThat(method, isPresent());
+    assertNull(method.getFinalSignatureAttribute());
+    assertNull(method.getOriginalSignatureAttribute());
+  }
+
+  public void runTest(
+      ImmutableMap<String, String> signatures,
+      Consumer<TestDiagnosticMessages> diagnostics,
+      Consumer<CodeInspector> inspect)
+      throws Exception {
+
+    R8TestCompileResult compileResult =
+        testForR8(parameters.getBackend())
+            .addProgramClassFileData(dumpMethods(signatures), dumpInner())
+            .addKeepAttributes(
+                ProguardKeepAttributes.INNER_CLASSES,
+                ProguardKeepAttributes.ENCLOSING_METHOD,
+                ProguardKeepAttributes.SIGNATURE)
+            .addKeepAllClassesRuleWithAllowObfuscation()
+            .setMinApi(parameters.getApiLevel())
+            .allowDiagnosticMessages()
+            .compile();
+
+    CodeInspector inspector = compileResult.inspector();
+
+    // All classes are kept, and renamed.
+    ClassSubject clazz = inspector.clazz("Methods");
+    assertThat(clazz, isPresentAndRenamed());
+    assertThat(inspector.clazz("Methods$Inner"), isPresentAndRenamed());
+
+    MethodSubject generic = lookupGeneric(inspector);
+    MethodSubject parameterizedReturn = lookupParameterizedReturn(inspector);
+    MethodSubject parameterizedArguments = lookupParameterizedArguments(inspector);
+    MethodSubject parametrizedThrows =
+        clazz.method("void", "parametrizedThrows", ImmutableList.of());
+
+    // Check that all methods have been renamed
+    assertThat(generic, isPresentAndRenamed());
+    assertThat(parameterizedReturn, isPresentAndRenamed());
+    assertThat(parameterizedArguments, isPresentAndRenamed());
+    assertThat(parametrizedThrows, isPresentAndRenamed());
+
+    // Test that methods have their original signature if the default was provided.
+    if (!signatures.containsKey("generic")) {
+      assertEquals(genericSignature, generic.getOriginalSignatureAttribute());
+    }
+    if (!signatures.containsKey("parameterizedReturn")) {
+      assertEquals(
+          parameterizedReturnSignature, parameterizedReturn.getOriginalSignatureAttribute());
+    }
+    if (!signatures.containsKey("parameterizedArguments")) {
+      assertEquals(
+          parameterizedArgumentsSignature, parameterizedArguments.getOriginalSignatureAttribute());
+    }
+    if (!signatures.containsKey("parametrizedThrows")) {
+      assertEquals(parametrizedThrowsSignature, parametrizedThrows.getOriginalSignatureAttribute());
+    }
+
+    inspect.accept(inspector);
+    compileResult.getDiagnosticMessages().assertNoErrors();
+    compileResult.getDiagnosticMessages().assertNoInfos();
+    diagnostics.accept(compileResult.getDiagnosticMessages());
+  }
+
   /*
 
   class Methods<X extends Throwable> {
@@ -59,23 +237,7 @@
   }
 
   */
-
-  private String genericSignature = "<T:Ljava/lang/Throwable;>(TT;LMethods<TT;>.Inner;)TT;";
-  private String parameterizedReturnSignature = "()LMethods<TX;>.Inner;";
-  private String parameterizedArgumentsSignature = "(TX;LMethods<TX;>.Inner;)V";
-  private String parametrizedThrowsSignature = "()V^TX;";
-  private Backend backend;
-
-  @Parameters(name = "Backend: {0}")
-  public static Backend[] data() {
-    return ToolHelper.getBackends();
-  }
-
-  public MinifierMethodSignatureTest(Backend backend) {
-    this.backend = backend;
-  }
-
-  private byte[] dumpMethods(Map<String, String> signatures) throws Exception {
+  private byte[] dumpMethods(Map<String, String> signatures) {
 
     ClassWriter cw = new ClassWriter(0);
     MethodVisitor mv;
@@ -192,140 +354,4 @@
         "void", "parameterizedArguments", ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
   }
 
-  public void runTest(
-      ImmutableMap<String, String> signatures,
-      Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<CodeInspector> inspect)
-      throws Exception {
-    DiagnosticsChecker checker = new DiagnosticsChecker();
-    CodeInspector inspector =
-        new CodeInspector(
-            ToolHelper.runR8(
-                R8Command.builder(checker)
-                    .addClassProgramData(dumpMethods(signatures), Origin.unknown())
-                    .addClassProgramData(dumpInner(), Origin.unknown())
-                    .addProguardConfiguration(
-                        ImmutableList.of(
-                            "-keepattributes InnerClasses,EnclosingMethod,Signature",
-                            "-keep,allowobfuscation class ** { *; }"),
-                        Origin.unknown())
-                    .setProgramConsumer(emptyConsumer(backend))
-                    .addLibraryFiles(runtimeJar(backend))
-                    .setProguardMapConsumer(StringConsumer.emptyConsumer())
-                    .build()));
-    // All classes are kept, and renamed.
-    ClassSubject clazz = inspector.clazz("Methods");
-    assertThat(clazz, isPresentAndRenamed());
-    assertThat(inspector.clazz("Methods$Inner"), isPresentAndRenamed());
-
-    MethodSubject generic = lookupGeneric(inspector);
-    MethodSubject parameterizedReturn = lookupParameterizedReturn(inspector);
-    MethodSubject parameterizedArguments = lookupParameterizedArguments(inspector);
-    MethodSubject parametrizedThrows =
-        clazz.method("void", "parametrizedThrows", ImmutableList.of());
-
-    // Check that all methods have been renamed
-    assertThat(generic, isPresentAndRenamed());
-    assertThat(parameterizedReturn, isPresentAndRenamed());
-    assertThat(parameterizedArguments, isPresentAndRenamed());
-    assertThat(parametrizedThrows, isPresentAndRenamed());
-
-    // Test that methods have their original signature if the default was provided.
-    if (!signatures.containsKey("generic")) {
-      assertEquals(genericSignature, generic.getOriginalSignatureAttribute());
-    }
-    if (!signatures.containsKey("parameterizedReturn")) {
-      assertEquals(
-          parameterizedReturnSignature, parameterizedReturn.getOriginalSignatureAttribute());
-    }
-    if (!signatures.containsKey("parameterizedArguments")) {
-      assertEquals(
-          parameterizedArgumentsSignature, parameterizedArguments.getOriginalSignatureAttribute());
-    }
-    if (!signatures.containsKey("parametrizedThrows")) {
-      assertEquals(
-          parametrizedThrowsSignature, parametrizedThrows.getOriginalSignatureAttribute());
-    }
-
-    diagnostics.accept(checker);
-    inspect.accept(inspector);
-  }
-
-  private void testSingleMethod(String name, String signature,
-      Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<CodeInspector> inspector)
-      throws Exception {
-    ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
-    runTest(signatures, diagnostics, inspector);
-  }
-
-  private void isOriginUnknown(Origin origin) {
-    assertSame(Origin.unknown(), origin);
-  }
-
-  private void noWarnings(DiagnosticsChecker checker) {
-    assertEquals(0, checker.warnings.size());
-  }
-
-  private void noInspection(CodeInspector inspector) {
-  }
-
-  private void noSignatureAttribute(MethodSubject method) {
-    assertThat(method, isPresent());
-    assertNull(method.getFinalSignatureAttribute());
-    assertNull(method.getOriginalSignatureAttribute());
-  }
-
-  @Test
-  public void originalJavacSignatures() throws Exception {
-    // Test using the signatures generated by javac.
-    runTest(ImmutableMap.of(), this::noWarnings, this::noInspection);
-  }
-
-  @Test
-  public void signatureEmpty() throws Exception {
-    testSingleMethod("generic", "", this::noWarnings, inspector -> {
-      noSignatureAttribute(lookupGeneric(inspector));
-    });
-  }
-
-  @Test
-  public void signatureInvalid() throws Exception {
-    testSingleMethod("generic", "X", diagnostics -> {
-      assertEquals(1, diagnostics.warnings.size());
-      DiagnosticsChecker.checkDiagnostic(diagnostics.warnings.get(0), this::isOriginUnknown,
-          "Invalid signature 'X' for method",
-          "java.lang.Throwable Methods.generic(java.lang.Throwable, Methods$Inner)",
-          "Expected ( at position 1");
-    }, inspector -> noSignatureAttribute(lookupGeneric(inspector)));
-  }
-
-  @Test
-  public void classNotFound() throws Exception {
-    String signature = "<T:LNotFound;>(TT;LAlsoNotFound<TT;>.InnerNotFound.InnerAlsoNotFound;)TT;";
-    testSingleMethod("generic", signature, this::noWarnings,
-        inspector -> {
-          ClassSubject methods = inspector.clazz("Methods");
-          MethodSubject method =
-              methods.method("java.lang.Throwable", "generic",
-                  ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
-          assertThat(inspector.clazz("NotFound"), not(isPresent()));
-          assertEquals(signature, method.getOriginalSignatureAttribute());
-        });
-  }
-
-  @Test
-  public void multipleWarnings() throws Exception {
-    runTest(ImmutableMap.of(
-        "generic", "X",
-        "parameterizedReturn", "X",
-        "parameterizedArguments", "X"
-    ), diagnostics -> {
-      assertEquals(3, diagnostics.warnings.size());
-    }, inspector -> {
-      noSignatureAttribute(lookupGeneric(inspector));
-      noSignatureAttribute(lookupParameterizedReturn(inspector));
-      noSignatureAttribute(lookupParameterizedArguments(inspector));
-    });
-  }
 }