aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/ijar/test
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-04-11 22:59:37 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-04-12 13:59:01 +0000
commit31c8878fa3ed34356d90642c19e46e4a06d84f4a (patch)
tree88e0f4476d6f0f8d6c74f3876a8202e02c513df8 /third_party/ijar/test
parent5901f8e69748cc533fc8d7e644bcef43ba56b756 (diff)
Prune anonymous classes in ijar
-- MOS_MIGRATED_REVID=119581073
Diffstat (limited to 'third_party/ijar/test')
-rw-r--r--third_party/ijar/test/BUILD17
-rw-r--r--third_party/ijar/test/IjarTests.java81
-rw-r--r--third_party/ijar/test/LocalAndAnonymous.java37
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() {}
+ }
+}