1 /* 2 * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 20 * CA 95054 USA or visit www.sun.com if you need additional information or 21 * have any questions. 22 */ 23 24 /** 25 * @test 26 * @compile HelloPathWorld.java 27 * @run main CompileTest 28 */ 29 30 import java.io.*; 31 import java.nio.file.*; 32 import java.util.*; 33 import java.util.jar.*; 34 import javax.tools.*; 35 36 import com.sun.tools.javac.nio.*; 37 import com.sun.tools.javac.util.Context; 38 import java.nio.file.spi.FileSystemProvider; 39 40 41 public class CompileTest { 42 public static void main(String[] args) throws Exception { 43 new CompileTest().run(); 44 } 45 46 public void run() throws Exception { 47 File rtDir = new File("rt.dir"); 48 File javaHome = new File(System.getProperty("java.home")); 49 if (javaHome.getName().equals("jre")) 50 javaHome = javaHome.getParentFile(); 51 File rtJar = new File(new File(new File(javaHome, "jre"), "lib"), "rt.jar"); 52 expand(rtJar, rtDir); 53 54 String[] rtDir_opts = { 55 "-bootclasspath", rtDir.toString(), 56 "-classpath", "", 57 "-sourcepath", "", 58 "-extdirs", "" 59 }; 60 test(rtDir_opts, "HelloPathWorld"); 61 62 if (isJarFileSystemAvailable()) { 63 String[] rtJar_opts = { 64 "-bootclasspath", rtJar.toString(), 65 "-classpath", "", 66 "-sourcepath", "", 67 "-extdirs", "" 68 }; 69 test(rtJar_opts, "HelloPathWorld"); 70 71 String[] default_opts = { }; 72 test(default_opts, "HelloPathWorld"); 73 74 // finally, a non-trivial program 75 test(default_opts, "CompileTest"); 76 } else 77 System.err.println("jar file system not available: test skipped"); 78 } 79 80 void test(String[] opts, String className) throws Exception { 81 count++; 82 System.err.println("Test " + count + " " + Arrays.asList(opts) + " " + className); 83 Path testSrcDir = Paths.get(System.getProperty("test.src")); 84 Path testClassesDir = Paths.get(System.getProperty("test.classes")); 85 Path classes = Paths.get("classes." + count); 86 classes.createDirectory(); 87 88 Context ctx = new Context(); 89 PathFileManager fm = new JavacPathFileManager(ctx, true, null); 90 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 91 List<String> options = new ArrayList<String>(); 92 options.addAll(Arrays.asList(opts)); 93 options.addAll(Arrays.asList( 94 "-verbose", "-XDverboseCompilePolicy", 95 "-d", classes.toString() 96 )); 97 Iterable<? extends JavaFileObject> compilationUnits = 98 fm.getJavaFileObjects(testSrcDir.resolve(className + ".java")); 99 StringWriter sw = new StringWriter(); 100 PrintWriter out = new PrintWriter(sw); 101 JavaCompiler.CompilationTask t = 102 compiler.getTask(out, fm, null, options, null, compilationUnits); 103 boolean ok = t.call(); 104 System.err.println(sw.toString()); 105 if (!ok) { 106 throw new Exception("compilation failed"); 107 } 108 109 File expect = new File("classes." + count + "/" + className + ".class"); 110 if (!expect.exists()) 111 throw new Exception("expected file not found: " + expect); 112 long expectedSize = new File(testClassesDir.toString(), className + ".class").length(); 113 long actualSize = expect.length(); 114 if (expectedSize != actualSize) 115 throw new Exception("wrong size found: " + actualSize + "; expected: " + expectedSize); 116 } 117 118 boolean isJarFileSystemAvailable() { 119 boolean result = false; 120 for (FileSystemProvider fsp: FileSystemProvider.installedProviders()) { 121 String scheme = fsp.getScheme(); 122 System.err.println("Provider: " + scheme + " " + fsp); 123 if (scheme.equalsIgnoreCase("jar") || scheme.equalsIgnoreCase("zip")) 124 result = true; 125 } 126 return result; 127 } 128 129 void expand(File jar, File dir) throws IOException { 130 JarFile jarFile = new JarFile(jar); 131 try { 132 Enumeration<JarEntry> entries = jarFile.entries(); 133 while (entries.hasMoreElements()) { 134 JarEntry je = entries.nextElement(); 135 if (!je.isDirectory()) { 136 copy(jarFile.getInputStream(je), new File(dir, je.getName())); 137 } 138 } 139 } finally { 140 jarFile.close(); 141 } 142 } 143 144 void copy(InputStream in, File dest) throws IOException { 145 dest.getParentFile().mkdirs(); 146 OutputStream out = new BufferedOutputStream(new FileOutputStream(dest)); 147 try { 148 byte[] data = new byte[8192]; 149 int n; 150 while ((n = in.read(data, 0, data.length)) > 0) 151 out.write(data, 0, n); 152 } finally { 153 out.close(); 154 in.close(); 155 } 156 } 157 158 void error(String message) { 159 System.err.println("Error: " + message); 160 errors++; 161 } 162 163 int errors; 164 int count; 165 }