diff options
author | cnsun <cnsun@google.com> | 2018-03-19 13:20:30 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-03-19 13:21:48 -0700 |
commit | c7a25ca14a105f65dcef1fe3f9879d425f181f5f (patch) | |
tree | daa7fe90f6e725f5355edcccf140d675944f2983 /src/java_tools/import_deps_checker/javatests | |
parent | bff4ac081bd80f227cc0c3027f67e306d35699fa (diff) |
1) Fixes a bug in the checking of missing members. Before, MemberInfo contains
both the owner and the name. However, this is wrong, as the field reference or
method call may reference the same member with a different owner (e.g.,
subclass).
2) The type in ASM may refer to internal names, but also may refer to array descriptor. And arrays have methods such as clone(). Before, I just assume that a type can only be internal names.
RELNOTES: None.
PiperOrigin-RevId: 189630806
Diffstat (limited to 'src/java_tools/import_deps_checker/javatests')
5 files changed, 74 insertions, 34 deletions
diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ClassInfoTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ClassInfoTest.java index 54d53f2f22..2a09eac8eb 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ClassInfoTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ClassInfoTest.java @@ -27,8 +27,8 @@ import org.junit.runners.JUnit4; public class ClassInfoTest { public static final String JAVA_LANG_OBJECT = "java/lang/Object"; - private final MemberInfo hashCodeMethod = MemberInfo.create(JAVA_LANG_OBJECT, "hashCode", "()I"); - private final MemberInfo sizeMethod = MemberInfo.create(JAVA_LANG_OBJECT, "clear", "()V"); + private final MemberInfo hashCodeMethod = MemberInfo.create("hashCode", "()I"); + private final MemberInfo sizeMethod = MemberInfo.create("clear", "()V"); private final ClassInfo objectClass = ClassInfo.create(JAVA_LANG_OBJECT, ImmutableList.of(), ImmutableSet.of(hashCodeMethod)); @@ -39,23 +39,22 @@ public class ClassInfoTest { @Test public void testMemberInfo() { - MemberInfo memberInfo = MemberInfo.create(JAVA_LANG_OBJECT, "a", "I"); + MemberInfo memberInfo = MemberInfo.create("a", "I"); assertThat(memberInfo.memberName()).isEqualTo("a"); assertThat(memberInfo.descriptor()).isEqualTo("I"); - assertThat(memberInfo).isEqualTo(MemberInfo.create("java/lang/Object", "a", "I")); + assertThat(memberInfo).isEqualTo(MemberInfo.create("a", "I")); - assertThat(hashCodeMethod).isEqualTo(MemberInfo.create("java/lang/Object", "hashCode", "()I")); - assertThat(sizeMethod).isEqualTo(MemberInfo.create("java/lang/Object", "clear", "()V")); + assertThat(hashCodeMethod).isEqualTo(MemberInfo.create("hashCode", "()I")); + assertThat(sizeMethod).isEqualTo(MemberInfo.create("clear", "()V")); } @Test public void testClassInfoCorrectlySet() { assertThat(objectClass.internalName()).isEqualTo("java/lang/Object"); assertThat(objectClass.declaredMembers()) - .containsExactly(MemberInfo.create("java/lang/Object", "hashCode", "()I")) + .containsExactly(MemberInfo.create("hashCode", "()I")) .inOrder(); - assertThat(objectClass.containsMember(MemberInfo.create("java/lang/Object", "hashCode", "()I"))) - .isTrue(); + assertThat(objectClass.containsMember(MemberInfo.create("hashCode", "()I"))).isTrue(); assertThat(listClass.internalName()).isEqualTo("java/util/List"); assertThat(listClass.declaredMembers()).containsExactly(sizeMethod); @@ -67,16 +66,11 @@ public class ClassInfoTest { ClassInfo parent = objectClass; ClassInfo child = listClass; assertThat(child.superClasses()).contains(parent); - assertThat(parent.containsMember(MemberInfo.create("java/lang/Object", "hashCode", "()I"))) - .isTrue(); - assertThat(parent.containsMember(MemberInfo.create("java/lang/Object", "size", "()I"))) - .isFalse(); - assertThat(parent.containsMember(MemberInfo.create("java/lang/Object", "clear", "()V"))) - .isFalse(); + assertThat(parent.containsMember(MemberInfo.create("hashCode", "()I"))).isTrue(); + assertThat(parent.containsMember(MemberInfo.create("size", "()I"))).isFalse(); + assertThat(parent.containsMember(MemberInfo.create("clear", "()V"))).isFalse(); - assertThat(child.containsMember(MemberInfo.create("java/lang/Object", "hashCode", "()I"))) - .isTrue(); - assertThat(child.containsMember(MemberInfo.create("java/lang/Object", "clear", "()V"))) - .isTrue(); + assertThat(child.containsMember(MemberInfo.create("hashCode", "()I"))).isTrue(); + assertThat(child.containsMember(MemberInfo.create("clear", "()V"))).isTrue(); } } diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/DepsCheckerClassVisitorTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/DepsCheckerClassVisitorTest.java index 3d19b06638..277fd808a4 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/DepsCheckerClassVisitorTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/DepsCheckerClassVisitorTest.java @@ -16,7 +16,7 @@ package com.google.devtools.build.importdeps; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.importdeps.ClassInfo.MemberInfo; +import com.google.devtools.build.importdeps.ResultCollector.MissingMember; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; @@ -80,19 +80,19 @@ public class DepsCheckerClassVisitorTest extends AbstractClassCacheTest { assertThat(collector.getSortedMissingClassInternalNames()).isEmpty(); assertThat(collector.getSortedMissingMembers()) .containsExactly( - MemberInfo.create( + MissingMember.create( "com/google/devtools/build/importdeps/testdata/Library$Class1", "I", "Lcom/google/devtools/build/importdeps/testdata/Library$Class1;"), - MemberInfo.create( + MissingMember.create( "com/google/devtools/build/importdeps/testdata/Library$Class3", "field", "Lcom/google/devtools/build/importdeps/testdata/Library$Class4;"), - MemberInfo.create( + MissingMember.create( "com/google/devtools/build/importdeps/testdata/Library$Class4", "createClass5", "()Lcom/google/devtools/build/importdeps/testdata/Library$Class5;"), - MemberInfo.create( + MissingMember.create( "com/google/devtools/build/importdeps/testdata/Library$Class5", "create", "(Lcom/google/devtools/build/importdeps/testdata/Library$Class7;)" @@ -111,9 +111,10 @@ public class DepsCheckerClassVisitorTest extends AbstractClassCacheTest { ResultCollector resultCollector = new ResultCollector(); try (ClassCache cache = new ClassCache(ImmutableList.copyOf(classpath)); ZipFile zipFile = new ZipFile(clientJar.toFile())) { - - AbstractClassEntryState state = cache.getClassState("java/lang/invoke/LambdaMetafactory"); - System.out.println(state); + assertThat(cache.getClassState("java/lang/invoke/LambdaMetafactory").isExistingState()) + .isTrue(); + AbstractClassEntryState state = cache.getClassState("java/lang/Enum"); + assertThat(state.isExistingState()).isTrue(); for (String clientClass : clientClasses) { ZipEntry entry = zipFile.getEntry(clientClass + ".class"); try (InputStream classStream = zipFile.getInputStream(entry)) { diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/LazyClassEntryStateTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/LazyClassEntryStateTest.java index 428b88e9d5..6b0a65134f 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/LazyClassEntryStateTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/LazyClassEntryStateTest.java @@ -32,7 +32,7 @@ public class LazyClassEntryStateTest { public static final String LIST_CLASS_NAME = "java/util/List"; public static final ImmutableSet<MemberInfo> METHOD_LIST = - ImmutableSet.of(MemberInfo.create(LIST_CLASS_NAME, "hashCode", "()I")); + ImmutableSet.of(MemberInfo.create("hashCode", "()I")); public static final ClassInfo LIST_CLASS_INFO = ClassInfo.create(LIST_CLASS_NAME, ImmutableList.of(), METHOD_LIST); @@ -51,8 +51,7 @@ public class LazyClassEntryStateTest { ClassInfo classInfo = state.classInfo().get(); assertThat(classInfo.internalName()).isEqualTo("java/util/List"); assertThat(classInfo.declaredMembers()).hasSize(1); - assertThat(classInfo.declaredMembers()) - .containsExactly(MemberInfo.create("java/util/List", "hashCode", "()I")); + assertThat(classInfo.declaredMembers()).containsExactly(MemberInfo.create("hashCode", "()I")); } @Test @@ -74,8 +73,7 @@ public class LazyClassEntryStateTest { ClassInfo classInfo = state.classInfo().get(); assertThat(classInfo.internalName()).isEqualTo("java/util/List"); assertThat(classInfo.declaredMembers()).hasSize(1); - assertThat(classInfo.declaredMembers()) - .containsExactly(MemberInfo.create("java/util/List", "hashCode", "()I")); + assertThat(classInfo.declaredMembers()).containsExactly(MemberInfo.create("hashCode", "()I")); ImmutableList<String> failurePath = state.getResolutionFailurePath(); assertThat(failurePath).hasSize(1); diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ResultCollectorTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ResultCollectorTest.java index 0d78504634..3b672880e3 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ResultCollectorTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ResultCollectorTest.java @@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.importdeps.AbstractClassEntryState.IncompleteState; import com.google.devtools.build.importdeps.AbstractClassEntryState.MissingState; import com.google.devtools.build.importdeps.ClassInfo.MemberInfo; +import com.google.devtools.build.importdeps.ResultCollector.MissingMember; import java.io.IOException; import org.junit.Before; import org.junit.Test; @@ -50,9 +51,9 @@ public class ResultCollectorTest { assertThat(collector.getSortedMissingClassInternalNames()).containsExactly("java.lang.String"); assertThat(collector.getSortedMissingMembers()).isEmpty(); - collector.addMissingMember(MemberInfo.create("java/lang/Object", "field", "I")); + collector.addMissingMember("java/lang/Object", MemberInfo.create("field", "I")); assertThat(collector.getSortedMissingMembers()) - .containsExactly(MemberInfo.create("java/lang/Object", "field", "I")); + .containsExactly(MissingMember.create("java/lang/Object", "field", "I")); assertThat(collector.getSortedMissingClassInternalNames()).containsExactly("java.lang.String"); } @@ -78,4 +79,35 @@ public class ResultCollectorTest { .containsExactly("java.lang.String", "java.lang.Integer", "java.lang.Object"); assertThat(collector.getSortedMissingMembers()).isEmpty(); } + + @Test + public void testMissingMember() { + String owner = "owner"; + String name = "name"; + String desc = "desc"; + MissingMember member = MissingMember.create(owner, name, desc); + assertThat(member.owner()).isEqualTo(owner); + assertThat(member.memberName()).isEqualTo(name); + assertThat(member.descriptor()).isEqualTo(desc); + assertThat(member.member()).isEqualTo(MemberInfo.create(name, desc)); + + MissingMember member2 = MissingMember.create(owner, MemberInfo.create(name, desc)); + assertThat(member2).isEqualTo(member); + } + + @Test + public void testMemberComparison() { + MissingMember member1 = MissingMember.create("A", MemberInfo.create("B", "C")); + MissingMember member2 = MissingMember.create("A", MemberInfo.create("B", "C")); + assertThat(member1.compareTo(member2)).isEqualTo(0); + + MissingMember member3 = MissingMember.create("B", MemberInfo.create("B", "C")); + assertThat(member1.compareTo(member3)).isEqualTo(-1); + assertThat(member3.compareTo(member1)).isEqualTo(1); + + MissingMember member4 = MissingMember.create("A", MemberInfo.create("C", "C")); + assertThat(member1.compareTo(member4)).isEqualTo(-1); + + assertThat(member3.compareTo(member4)).isEqualTo(1); + } } diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata/Client.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata/Client.java index 6b833c3b61..307f2d8395 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata/Client.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata/Client.java @@ -57,6 +57,15 @@ public class Client<@TypeAnnotation T> extends Library implements LibraryInterfa Class8[][] array = new Class8[10][10]; Class9[] array2 = new Class9[10]; array2[0] = new Class10(); + Object[] copy = array.clone(); + array = (Class8[][]) copy; + System.out.println(array.clone().length); + } + + public void testEnums() { + EnumTest a = EnumTest.A; + System.out.println(a.ordinal()); + System.out.println(a.name()); } /** An inner annotation. */ @@ -64,4 +73,10 @@ public class Client<@TypeAnnotation T> extends Library implements LibraryInterfa @Target(ElementType.TYPE) @AnnotationAnnotation public @interface NestedAnnotation {} + + public enum EnumTest { + A, + B, + C + } } |