Migrate MinifierClassSignatureTest and use diagnostics
Bug: 167145686
Change-Id: Ibb15b4fd786791b44172601b8617c20c58e8e8c1
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index 07dad43..b2ec374 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -4,13 +4,16 @@
package com.android.tools.r8.naming;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticOrigin;
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;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
import static org.objectweb.asm.Opcodes.ACC_FINAL;
import static org.objectweb.asm.Opcodes.ACC_SUPER;
import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC;
@@ -20,15 +23,16 @@
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.ThrowingConsumer;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.util.function.Consumer;
import org.junit.Test;
@@ -64,15 +68,16 @@
String outerSignature = "<T:Ljava/lang/Object;>Ljava/lang/Object;";
String extendsInnerSignature = "LOuter<TT;>.Inner;";
String extendsInnerInnerSignature = "LOuter<TT;>.Inner.InnerInner;";
- private Backend backend;
- @Parameters(name = "Backend: {0}")
- public static Backend[] data() {
- return ToolHelper.getBackends();
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
}
- public MinifierClassSignatureTest(Backend backend) {
- this.backend = backend;
+ public MinifierClassSignatureTest(TestParameters parameters) {
+ this.parameters = parameters;
}
private byte[] dumpSimple(String classSignature) throws Exception {
@@ -298,34 +303,32 @@
public void runTest(
ImmutableMap<String, String> signatures,
- Consumer<DiagnosticsChecker> diagnostics,
- Consumer<CodeInspector> inspect)
+ Consumer<TestDiagnosticMessages> diagnostics,
+ ThrowingConsumer<CodeInspector, Exception> inspect)
throws Exception {
- DiagnosticsChecker checker = new DiagnosticsChecker();
- CodeInspector inspector =
- new CodeInspector(
- ToolHelper.runR8(
- R8Command.builder(checker)
- .addClassProgramData(dumpSimple(signatures.get("Simple")), Origin.unknown())
- .addClassProgramData(dumpBase(signatures.get("Base")), Origin.unknown())
- .addClassProgramData(dumpOuter(signatures.get("Outer")), Origin.unknown())
- .addClassProgramData(dumpInner(signatures.get("Outer$Inner")), Origin.unknown())
- .addClassProgramData(
- dumpExtendsInner(signatures.get("Outer$ExtendsInner")), Origin.unknown())
- .addClassProgramData(
- dumpInnerInner(signatures.get("Outer$Inner$InnerInner")), Origin.unknown())
- .addClassProgramData(
- dumpExtendsInnerInner(signatures.get("Outer$Inner$ExtendsInnerInner")),
- Origin.unknown())
- .addProguardConfiguration(
- ImmutableList.of(
- "-keepattributes InnerClasses,EnclosingMethod,Signature",
- "-keep,allowobfuscation class **"),
- Origin.unknown())
- .setProgramConsumer(emptyConsumer(backend))
- .addLibraryFiles(runtimeJar(backend))
- .setProguardMapConsumer(StringConsumer.emptyConsumer())
- .build()));
+ R8TestCompileResult compileResult =
+ testForR8(parameters.getBackend())
+ .addProgramClassFileData(dumpSimple(signatures.get("Simple")))
+ .addProgramClassFileData(dumpBase(signatures.get("Base")))
+ .addProgramClassFileData(dumpOuter(signatures.get("Outer")))
+ .addProgramClassFileData(dumpInner(signatures.get("Outer$Inner")))
+ .addProgramClassFileData(dumpExtendsInner(signatures.get("Outer$ExtendsInner")))
+ .addProgramClassFileData(dumpInnerInner(signatures.get("Outer$Inner$InnerInner")))
+ .addProgramClassFileData(
+ dumpExtendsInnerInner(signatures.get("Outer$Inner$ExtendsInnerInner")))
+ .addKeepAttributes(
+ ProguardKeepAttributes.INNER_CLASSES,
+ ProguardKeepAttributes.ENCLOSING_METHOD,
+ ProguardKeepAttributes.SIGNATURE)
+ .addKeepAllClassesRuleWithAllowObfuscation()
+ .allowDiagnosticMessages()
+ .compile();
+
+ compileResult.assertNoInfoMessages();
+ compileResult.assertNoErrorMessages();
+
+ CodeInspector inspector = compileResult.inspector();
+
// All classes are kept, and renamed.
assertThat(inspector.clazz("Simple"), isPresentAndRenamed());
assertThat(inspector.clazz("Base"), isPresentAndRenamed());
@@ -360,26 +363,20 @@
inspector.clazz("Outer$Inner$ExtendsInnerInner").getOriginalSignatureAttribute());
}
- diagnostics.accept(checker);
- inspect.accept(inspector);
+ diagnostics.accept(compileResult.getDiagnosticMessages());
+ compileResult.inspect(inspect);
}
- private void testSingleClass(String name, String signature,
- Consumer<DiagnosticsChecker> diagnostics,
- Consumer<CodeInspector> inspector)
+ private void testSingleClass(
+ String name,
+ String signature,
+ Consumer<TestDiagnosticMessages> diagnostics,
+ ThrowingConsumer<CodeInspector, Exception> 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) {
}
@@ -391,165 +388,237 @@
@Test
public void originalJavacSignatures() throws Exception {
// Test using the signatures generated by javac.
- runTest(ImmutableMap.of(), this::noWarnings, this::noInspection);
+ runTest(ImmutableMap.of(), TestDiagnosticMessages::assertNoWarnings, this::noInspection);
}
@Test
public void classSignature_empty() throws Exception {
- testSingleClass("Outer", "", this::noWarnings, inspector -> {
- ClassSubject outer = inspector.clazz("Outer");
- assertNull(outer.getFinalSignatureAttribute());
- assertNull(outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer",
+ "",
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ ClassSubject outer = inspector.clazz("Outer");
+ assertNull(outer.getFinalSignatureAttribute());
+ assertNull(outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureOuter_valid() throws Exception {
// class Outer<T extends Simple> extends Base<T>
String signature = "<T:LSimple;>LBase<TT;>;";
- testSingleClass("Outer", signature, this::noWarnings, inspector -> {
- ClassSubject outer = inspector.clazz("Outer");
- ClassSubject simple = inspector.clazz("Simple");
- ClassSubject base = inspector.clazz("Base");
- String baseDescriptorWithoutSemicolon =
- base.getFinalDescriptor().substring(0, base.getFinalDescriptor().length() - 1);
- String minifiedSignature =
- "<T:" + simple.getFinalDescriptor() + ">" + baseDescriptorWithoutSemicolon + "<TT;>;";
- assertEquals(minifiedSignature, outer.getFinalSignatureAttribute());
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ ClassSubject outer = inspector.clazz("Outer");
+ ClassSubject simple = inspector.clazz("Simple");
+ ClassSubject base = inspector.clazz("Base");
+ String baseDescriptorWithoutSemicolon =
+ base.getFinalDescriptor().substring(0, base.getFinalDescriptor().length() - 1);
+ String minifiedSignature =
+ "<T:" + simple.getFinalDescriptor() + ">" + baseDescriptorWithoutSemicolon + "<TT;>;";
+ assertEquals(minifiedSignature, outer.getFinalSignatureAttribute());
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureExtendsInner_valid() throws Exception {
String signature = "LOuter<TT;>.Inner;";
- testSingleClass("Outer$ExtendsInner", signature, this::noWarnings, inspector -> {
- ClassSubject extendsInner = inspector.clazz("Outer$ExtendsInner");
- ClassSubject outer = inspector.clazz("Outer");
- ClassSubject inner = inspector.clazz("Outer$Inner");
- String outerDescriptorWithoutSemicolon =
- outer.getFinalDescriptor().substring(0, outer.getFinalDescriptor().length() - 1);
- String innerFinalDescriptor = inner.getFinalDescriptor();
- String innerLastPart =
- innerFinalDescriptor.substring(innerFinalDescriptor.indexOf("$") + 1);
- String minifiedSignature = outerDescriptorWithoutSemicolon + "<TT;>." + innerLastPart;
- assertEquals(minifiedSignature, extendsInner.getFinalSignatureAttribute());
- assertEquals(signature, extendsInner.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ ClassSubject extendsInner = inspector.clazz("Outer$ExtendsInner");
+ ClassSubject outer = inspector.clazz("Outer");
+ ClassSubject inner = inspector.clazz("Outer$Inner");
+ String outerDescriptorWithoutSemicolon =
+ outer.getFinalDescriptor().substring(0, outer.getFinalDescriptor().length() - 1);
+ String innerFinalDescriptor = inner.getFinalDescriptor();
+ String innerLastPart =
+ innerFinalDescriptor.substring(innerFinalDescriptor.indexOf("$") + 1);
+ String minifiedSignature = outerDescriptorWithoutSemicolon + "<TT;>." + innerLastPart;
+ assertEquals(minifiedSignature, extendsInner.getFinalSignatureAttribute());
+ assertEquals(signature, extendsInner.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureOuter_classNotFound() throws Exception {
String signature = "<T:LNotFound;>LAlsoNotFound;";
- testSingleClass("Outer", signature, this::noWarnings, inspector -> {
- assertThat(inspector.clazz("NotFound"), not(isPresent()));
- ClassSubject outer = inspector.clazz("Outer");
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ assertThat(inspector.clazz("NotFound"), not(isPresent()));
+ ClassSubject outer = inspector.clazz("Outer");
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureExtendsInner_innerClassNotFound() throws Exception {
String signature = "LOuter<TT;>.NotFound;";
- testSingleClass("Outer$ExtendsInner", signature, this::noWarnings, inspector -> {
- assertThat(inspector.clazz("NotFound"), not(isPresent()));
- ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ assertThat(inspector.clazz("NotFound"), not(isPresent()));
+ ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureExtendsInner_outerAndInnerClassNotFound() throws Exception {
String signature = "LNotFound<TT;>.AlsoNotFound;";
- testSingleClass("Outer$ExtendsInner", signature, this::noWarnings, inspector -> {
- assertThat(inspector.clazz("NotFound"), not(isPresent()));
- ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ assertThat(inspector.clazz("NotFound"), not(isPresent()));
+ ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureExtendsInner_nestedInnerClassNotFound() throws Exception {
String signature = "LOuter<TT;>.Inner.NotFound;";
- testSingleClass("Outer$ExtendsInner", signature, this::noWarnings, inspector -> {
- assertThat(inspector.clazz("NotFound"), not(isPresent()));
- ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ assertThat(inspector.clazz("NotFound"), not(isPresent()));
+ ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureExtendsInner_multipleMestedInnerClassesNotFound() throws Exception {
String signature = "LOuter<TT;>.NotFound.AlsoNotFound;";
- testSingleClass("Outer$ExtendsInner", signature, this::noWarnings, inspector -> {
- assertThat(inspector.clazz("NotFound"), not(isPresent()));
- ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
- assertEquals(signature, outer.getOriginalSignatureAttribute());
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ TestDiagnosticMessages::assertNoWarnings,
+ inspector -> {
+ assertThat(inspector.clazz("NotFound"), not(isPresent()));
+ ClassSubject outer = inspector.clazz("Outer$ExtendsInner");
+ assertEquals(signature, outer.getOriginalSignatureAttribute());
+ });
}
@Test
public void classSignatureOuter_invalid() throws Exception {
- testSingleClass("Outer", "X", diagnostics -> {
- assertEquals(1, diagnostics.warnings.size());
- DiagnosticsChecker.checkDiagnostic(diagnostics.warnings.get(0), this::isOriginUnknown,
- "Invalid signature 'X' for class Outer", "Expected L at position 1");
- }, inspector -> noSignatureAttribute(inspector.clazz("Outer")));
+ testSingleClass(
+ "Outer",
+ "X",
+ diagnostics -> {
+ diagnostics.assertWarningsCount(1);
+ diagnostics.assertAllWarningsMatch(
+ allOf(
+ diagnosticMessage(containsString("Invalid signature 'X' for class Outer")),
+ diagnosticMessage(containsString("Expected L at position 1")),
+ diagnosticOrigin(Origin.unknown())));
+ },
+ inspector -> noSignatureAttribute(inspector.clazz("Outer")));
}
@Test
public void classSignatureOuter_invalidEnd() throws Exception {
- testSingleClass("Outer", "<L", diagnostics -> {
- assertEquals(1, diagnostics.warnings.size());
- DiagnosticsChecker.checkDiagnostic(diagnostics.warnings.get(0), this::isOriginUnknown,
- "Invalid signature '<L' for class Outer", "Unexpected end of signature at position 3");
- }, inspector -> noSignatureAttribute(inspector.clazz("Outer")));
+ testSingleClass(
+ "Outer",
+ "<L",
+ diagnostics -> {
+ diagnostics.assertWarningsCount(1);
+ diagnostics.assertAllWarningsMatch(
+ allOf(
+ diagnosticMessage(containsString("Invalid signature '<L' for class Outer")),
+ diagnosticMessage(containsString("Unexpected end of signature at position 3")),
+ diagnosticOrigin(Origin.unknown())));
+ },
+ inspector -> noSignatureAttribute(inspector.clazz("Outer")));
}
@Test
public void classSignatureExtendsInner_invalid() throws Exception {
- testSingleClass("Outer$ExtendsInner", "X", diagnostics -> {
- assertEquals(1, diagnostics.warnings.size());
- DiagnosticsChecker.checkDiagnostic(diagnostics.warnings.get(0), this::isOriginUnknown,
- "Invalid signature 'X' for class Outer$ExtendsInner", "Expected L at position 1");
- }, inspector -> noSignatureAttribute(inspector.clazz("Outer$ExtendsInner")));
+ testSingleClass(
+ "Outer$ExtendsInner",
+ "X",
+ diagnostics -> {
+ diagnostics.assertWarningsCount(1);
+ diagnostics.assertAllWarningsMatch(
+ allOf(
+ diagnosticMessage(
+ containsString("Invalid signature 'X' for class Outer$ExtendsInner")),
+ diagnosticMessage(containsString("Expected L at position 1")),
+ diagnosticOrigin(Origin.unknown())));
+ },
+ inspector -> noSignatureAttribute(inspector.clazz("Outer$ExtendsInner")));
}
@Test
public void classSignatureExtendsInnerInner_invalid() throws Exception {
- testSingleClass("Outer$Inner$ExtendsInnerInner", "X", diagnostics -> {
- assertEquals(1, diagnostics.warnings.size());
- DiagnosticsChecker.checkDiagnostic(diagnostics.warnings.get(0), this::isOriginUnknown,
- "Invalid signature 'X' for class Outer$Inner$ExtendsInnerInner",
- "Expected L at position 1");
- }, inspector -> noSignatureAttribute(inspector.clazz("Outer$Inner$ExtendsInnerInner")));
+ testSingleClass(
+ "Outer$Inner$ExtendsInnerInner",
+ "X",
+ diagnostics -> {
+ diagnostics.assertWarningsCount(1);
+ diagnostics.assertAllWarningsMatch(
+ allOf(
+ diagnosticMessage(
+ containsString(
+ "Invalid signature 'X' for class Outer$Inner$ExtendsInnerInner")),
+ diagnosticMessage(containsString("Expected L at position 1")),
+ diagnosticOrigin(Origin.unknown())));
+ },
+ inspector -> noSignatureAttribute(inspector.clazz("Outer$Inner$ExtendsInnerInner")));
}
@Test
public void multipleWarnings() throws Exception {
- runTest(ImmutableMap.of(
- "Outer", "X",
- "Outer$ExtendsInner", "X",
- "Outer$Inner$ExtendsInnerInner", "X"), diagnostics -> {
- assertEquals(3, diagnostics.warnings.size());
- }, inspector -> {
- noSignatureAttribute(inspector.clazz("Outer"));
- noSignatureAttribute(inspector.clazz("Outer$ExtendsInner"));
- noSignatureAttribute(inspector.clazz("Outer$Inner$ExtendsInnerInner"));
- });
+ runTest(
+ ImmutableMap.of(
+ "Outer", "X",
+ "Outer$ExtendsInner", "X",
+ "Outer$Inner$ExtendsInnerInner", "X"),
+ diagnostics -> {
+ diagnostics.assertWarningsCount(3);
+ },
+ inspector -> {
+ noSignatureAttribute(inspector.clazz("Outer"));
+ noSignatureAttribute(inspector.clazz("Outer$ExtendsInner"));
+ noSignatureAttribute(inspector.clazz("Outer$Inner$ExtendsInnerInner"));
+ });
}
+
@Test
public void regress80029761() throws Exception {
String signature = "LOuter<TT;>.com/example/Inner;";
- testSingleClass("Outer$ExtendsInner", signature, diagnostics -> {
- assertEquals(1, diagnostics.warnings.size());
- DiagnosticsChecker.checkDiagnostic(
- diagnostics.warnings.get(0),
- this::isOriginUnknown,
- "Invalid signature '" + signature + "' for class Outer$ExtendsInner",
- "Expected ; at position 16");
- }, inspector -> {
- noSignatureAttribute(inspector.clazz("Outer$ExtendsInner"));
- });
+ testSingleClass(
+ "Outer$ExtendsInner",
+ signature,
+ diagnostics -> {
+ diagnostics.assertWarningsCount(1);
+ diagnostics.assertAllWarningsMatch(
+ allOf(
+ diagnosticMessage(
+ containsString(
+ "Invalid signature '" + signature + "' for class Outer$ExtendsInner")),
+ diagnosticMessage(containsString("Expected ; at position 16")),
+ diagnosticOrigin(Origin.unknown())));
+ },
+ inspector -> {
+ noSignatureAttribute(inspector.clazz("Outer$ExtendsInner"));
+ });
}
}