diff options
author | 2016-04-11 22:59:37 +0000 | |
---|---|---|
committer | 2016-04-12 13:59:01 +0000 | |
commit | 31c8878fa3ed34356d90642c19e46e4a06d84f4a (patch) | |
tree | 88e0f4476d6f0f8d6c74f3876a8202e02c513df8 /third_party/ijar/test | |
parent | 5901f8e69748cc533fc8d7e644bcef43ba56b756 (diff) |
Prune anonymous classes in ijar
--
MOS_MIGRATED_REVID=119581073
Diffstat (limited to 'third_party/ijar/test')
-rw-r--r-- | third_party/ijar/test/BUILD | 17 | ||||
-rw-r--r-- | third_party/ijar/test/IjarTests.java | 81 | ||||
-rw-r--r-- | third_party/ijar/test/LocalAndAnonymous.java | 37 |
3 files changed, 132 insertions, 3 deletions
diff --git a/third_party/ijar/test/BUILD b/third_party/ijar/test/BUILD index 7dbfb600d1..f8ebb2a612 100644 --- a/third_party/ijar/test/BUILD +++ b/third_party/ijar/test/BUILD @@ -128,6 +128,19 @@ genrule( tools = ["gen_source_debug_extension"], ) +java_library( + name = "local_and_anonymous_lib", + srcs = ["LocalAndAnonymous.java"], +) + +genrule( + name = "local_and_anonymous_interface", + srcs = [":liblocal_and_anonymous_lib.jar"], + outs = ["local_and_anonymous-interface.jar"], + cmd = "$(location //third_party/ijar) $< $@", + tools = ["//third_party/ijar"], +) + java_test( name = "IjarTests", size = "small", @@ -141,13 +154,17 @@ java_test( "UseRestrictedAnnotation.java", "package-info.java", ":interface_ijar_testlib", + ":liblocal_and_anonymous_lib.jar", + ":local_and_anonymous-interface.jar", ], tags = ["zip"], test_class = "IjarTests", deps = [ "//src/java_tools/buildjar:BazelJavaCompiler", "//third_party:asm", + "//third_party:guava", "//third_party:junit4", + "//third_party:truth", ], ) diff --git a/third_party/ijar/test/IjarTests.java b/third_party/ijar/test/IjarTests.java index 18e94f2145..7abdbb7868 100644 --- a/third_party/ijar/test/IjarTests.java +++ b/third_party/ijar/test/IjarTests.java @@ -12,25 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; +import com.google.common.collect.ImmutableMap; +import com.google.common.io.ByteStreams; import com.google.devtools.build.java.bazel.BazelJavaCompiler; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; - import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Opcodes; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -43,7 +51,6 @@ import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.StandardLocation; -import javax.tools.ToolProvider; /** * JUnit tests for ijar tool. @@ -52,7 +59,7 @@ import javax.tools.ToolProvider; public class IjarTests { private static File getTmpDir() { - String tmpdir = System.getenv("TEST_TMPDIR"); + String tmpdir = System.getenv("TEST_TMPDIR"); if (tmpdir == null) { // Fall back on the system temporary directory tmpdir = System.getProperty("java.io.tmpdir"); @@ -191,4 +198,72 @@ public class IjarTests { } return builder.toString(); } + + @Test + public void localAndAnonymous() throws Exception { + Map<String, byte[]> lib = readJar("third_party/ijar/test/liblocal_and_anonymous_lib.jar"); + Map<String, byte[]> ijar = readJar("third_party/ijar/test/local_and_anonymous-interface.jar"); + + assertThat(lib.keySet()) + .containsExactly( + "LocalAndAnonymous$1.class", + "LocalAndAnonymous$2.class", + "LocalAndAnonymous$1LocalClass.class", + "LocalAndAnonymous.class", + "LocalAndAnonymous$NestedClass.class", + "LocalAndAnonymous$InnerClass.class", + "LocalAndAnonymous$PrivateInnerClass.class"); + assertThat(ijar.keySet()) + .containsExactly( + "LocalAndAnonymous.class", + "LocalAndAnonymous$NestedClass.class", + "LocalAndAnonymous$InnerClass.class", + "LocalAndAnonymous$PrivateInnerClass.class"); + + assertThat(innerClasses(lib.get("LocalAndAnonymous.class"))) + .isEqualTo( + ImmutableMap.<String, String>builder() + .put("LocalAndAnonymous$1", "null") + .put("LocalAndAnonymous$2", "null") + .put("LocalAndAnonymous$1LocalClass", "null") + .put("LocalAndAnonymous$InnerClass", "LocalAndAnonymous") + .put("LocalAndAnonymous$NestedClass", "LocalAndAnonymous") + .put("LocalAndAnonymous$PrivateInnerClass", "LocalAndAnonymous") + .build()); + assertThat(innerClasses(ijar.get("LocalAndAnonymous.class"))) + .containsExactly( + "LocalAndAnonymous$InnerClass", "LocalAndAnonymous", + "LocalAndAnonymous$NestedClass", "LocalAndAnonymous", + "LocalAndAnonymous$PrivateInnerClass", "LocalAndAnonymous"); + } + + static Map<String, byte[]> readJar(String path) throws IOException { + Map<String, byte[]> classes = new HashMap<>(); + try (JarFile jf = new JarFile(path)) { + Enumeration<JarEntry> entries = jf.entries(); + while (entries.hasMoreElements()) { + JarEntry je = entries.nextElement(); + if (!je.getName().endsWith(".class")) { + continue; + } + classes.put(je.getName(), ByteStreams.toByteArray(jf.getInputStream(je))); + } + } + return classes; + } + + static Map<String, String> innerClasses(byte[] bytes) { + final Map<String, String> innerClasses = new HashMap<>(); + new ClassReader(bytes) + .accept( + new ClassVisitor(Opcodes.ASM5) { + @Override + public void visitInnerClass( + String name, String outerName, String innerName, int access) { + innerClasses.put(name, String.valueOf(outerName)); + } + }, + /*flags=*/ 0); + return innerClasses; + } } diff --git a/third_party/ijar/test/LocalAndAnonymous.java b/third_party/ijar/test/LocalAndAnonymous.java new file mode 100644 index 0000000000..00c16d863f --- /dev/null +++ b/third_party/ijar/test/LocalAndAnonymous.java @@ -0,0 +1,37 @@ +// Copyright 2016 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * A class containing anonymous and local declarations. + */ +public class LocalAndAnonymous { + + public static void main(String[] args) { + new LocalAndAnonymous() {}; // anonymous + class LocalClass extends LocalAndAnonymous {} // local + new LocalClass() {}; // yes + } + + void f() { + new PrivateInnerClass(); + } + + static class NestedClass {} + + class InnerClass {} + + private class PrivateInnerClass { + private PrivateInnerClass() {} + } +} |