diff options
author | Liam Miller-Cushon <cushon@google.com> | 2016-04-11 22:59:37 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-04-12 13:59:01 +0000 |
commit | 31c8878fa3ed34356d90642c19e46e4a06d84f4a (patch) | |
tree | 88e0f4476d6f0f8d6c74f3876a8202e02c513df8 /third_party/ijar/test/IjarTests.java | |
parent | 5901f8e69748cc533fc8d7e644bcef43ba56b756 (diff) |
Prune anonymous classes in ijar
--
MOS_MIGRATED_REVID=119581073
Diffstat (limited to 'third_party/ijar/test/IjarTests.java')
-rw-r--r-- | third_party/ijar/test/IjarTests.java | 81 |
1 files changed, 78 insertions, 3 deletions
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; + } } |