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));
- });
- }
}