blob: b94f484ce30c9edfa61bc5b66e889fef6cddb524 [file] [log] [blame]
// 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.graph;
import static org.junit.Assert.assertEquals;
import static org.objectweb.asm.Opcodes.ASM7;
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.ToolHelper;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.Reporter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
@RunWith(Parameterized.class)
public class GenericSignatureIdentityTest extends TestBase {
private final TestParameters parameters;
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withNoneRuntime().build();
}
public GenericSignatureIdentityTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void testAllClassSignature() throws Exception {
testParseSignaturesInJar(ToolHelper.R8_WITH_DEPS_JAR);
}
public static void testParseSignaturesInJar(Path jar) throws Exception {
GenericSignatureReader genericSignatureReader = new GenericSignatureReader();
ZipInputStream inputStream = new ZipInputStream(Files.newInputStream(jar));
ZipEntry next = inputStream.getNextEntry();
while (next != null) {
if (next.getName().endsWith(".class")) {
ClassReader classReader = new ClassReader(inputStream);
classReader.accept(genericSignatureReader, 0);
}
next = inputStream.getNextEntry();
}
}
private static class GenericSignatureReader extends ClassVisitor {
public final Set<String> signatures = new HashSet<>();
private final DexItemFactory factory = new DexItemFactory();
private GenericSignatureReader() {
super(ASM7);
}
@Override
public void visit(
int version,
int access,
String name,
String signature,
String superName,
String[] interfaces) {
if (signature == null) {
return;
}
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
ClassSignature classSignature =
GenericSignature.parseClassSignature(
name, signature, Origin.unknown(), factory, new Reporter(testDiagnosticMessages));
assertEquals(signature, classSignature.toString());
testDiagnosticMessages.assertNoMessages();
}
}
}