1/* 2 * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @bug 6729471 27 * @summary javap does not output inner interfaces of an interface 28 * @library /tools/lib 29 * @modules jdk.compiler/com.sun.tools.javac.api 30 * jdk.compiler/com.sun.tools.javac.main 31 * jdk.jdeps/com.sun.tools.javap 32 * @build toolbox.ToolBox toolbox.JarTask 33 * @run main T6729471 34 */ 35 36import java.io.*; 37import java.net.*; 38import java.util.*; 39import javax.tools.*; 40 41import toolbox.JarTask; 42import toolbox.ToolBox; 43 44public class T6729471 45{ 46 public static void main(String... args) throws IOException { 47 new T6729471().run(); 48 } 49 50 void run() throws IOException { 51 File testClasses = new File(System.getProperty("test.classes")); 52 53 // simple class 54 verify("java.util.Map", 55 "public abstract boolean containsKey(java.lang.Object)"); 56 57 // inner class 58 verify("java.util.Map.Entry", 59 "public abstract K getKey()"); 60 61 // file name 62 verify(new File(testClasses, "T6729471.class").getPath(), 63 "public static void main(java.lang.String...)"); 64 65 // file url 66 verify(new File(testClasses, "T6729471.class").toURI().toString(), 67 "public static void main(java.lang.String...)"); 68 69 // jar url 70 File testJar = createJar("test.jar", "java.util.*"); 71 try { 72 verify("jar:" + testJar.toURL() + "!/java/util/Map.class", 73 "public abstract boolean containsKey(java.lang.Object)"); 74 } catch (MalformedURLException e) { 75 error(e.toString()); 76 } 77 78 if (errors > 0) 79 throw new Error(errors + " found."); 80 } 81 82 File createJar(String name, String... paths) throws IOException { 83 JavaCompiler comp = ToolProvider.getSystemJavaCompiler(); 84 try (JavaFileManager fm = comp.getStandardFileManager(null, null, null)) { 85 File f = new File(name); 86 ToolBox tb = new ToolBox(); 87 new JarTask(tb, f.getPath()) 88 .files(fm, StandardLocation.PLATFORM_CLASS_PATH, paths) 89 .run(); 90 return f; 91 } 92 } 93 94 void verify(String className, String... expects) { 95 String output = javap(className); 96 for (String expect: expects) { 97 if (output.indexOf(expect)< 0) 98 error(expect + " not found"); 99 } 100 } 101 102 void error(String msg) { 103 System.err.println(msg); 104 errors++; 105 } 106 107 int errors; 108 109 String javap(String className) { 110 String testClasses = System.getProperty("test.classes", "."); 111 StringWriter sw = new StringWriter(); 112 PrintWriter out = new PrintWriter(sw); 113 String[] args = { "-classpath", testClasses, className }; 114 int rc = com.sun.tools.javap.Main.run(args, out); 115 out.close(); 116 String output = sw.toString(); 117 System.out.println("class " + className); 118 System.out.println(output); 119 if (rc != 0) 120 throw new Error("javap failed. rc=" + rc); 121 if (output.indexOf("Error:") != -1) 122 throw new Error("javap reported error."); 123 return output; 124 } 125} 126 127