1 /* 2 * Copyright (c) 2014, 2018, 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 4981566 5028634 5094412 6304984 7025786 7025789 8001112 8028545 8000961 8030610 8028546 8188870 8173382 8173382 8193290 8205619 27 * @summary Check interpretation of -target and -source options 28 * @modules java.compiler 29 * jdk.compiler 30 * @run main Versions 31 */ 32 33 import java.io.*; 34 import java.nio.*; 35 import java.nio.channels.*; 36 37 import javax.tools.JavaCompiler; 38 import javax.tools.ToolProvider; 39 import javax.tools.JavaFileObject; 40 import javax.tools.StandardJavaFileManager; 41 import java.util.List; 42 import java.util.ArrayList; 43 import java.util.Arrays; 44 45 46 public class Versions { 47 48 protected JavaCompiler javacompiler; 49 protected int failedCases; 50 51 public Versions() throws IOException { 52 javacompiler = ToolProvider.getSystemJavaCompiler(); 53 genSourceFiles(); 54 failedCases = 0; 55 } 56 57 public static void main(String... args) throws IOException { 58 Versions versions = new Versions(); 59 versions.run(); 60 } 61 62 void run() { 63 64 String TC = ""; 65 System.out.println("Version.java: Starting"); 66 67 String LATEST_MAJOR_VERSION = "56.0"; 68 check(LATEST_MAJOR_VERSION); 69 check(LATEST_MAJOR_VERSION, "-source 1.6"); 70 check(LATEST_MAJOR_VERSION, "-source 1.7"); 71 check(LATEST_MAJOR_VERSION, "-source 1.8"); 72 check(LATEST_MAJOR_VERSION, "-source 1.9"); 73 check(LATEST_MAJOR_VERSION, "-source 1.10"); 74 check(LATEST_MAJOR_VERSION, "-source 11"); 75 check(LATEST_MAJOR_VERSION, "-source 12"); 76 77 check_source_target(true, "50.0", "6", "6"); 78 check_source_target(true, "51.0", "6", "7"); 79 check_source_target(true, "51.0", "7", "7"); 80 check_source_target(true, "52.0", "6", "8"); 81 check_source_target(true, "52.0", "7", "8"); 82 check_source_target(true, "52.0", "8", "8"); 83 check_source_target(true, "53.0", "6", "9"); 84 check_source_target(true, "53.0", "7", "9"); 85 check_source_target(true, "53.0", "8", "9"); 86 check_source_target(true, "53.0", "9", "9"); 87 check_source_target(true, "54.0", "6", "10"); 88 check_source_target(true, "54.0", "7", "10"); 89 check_source_target(true, "54.0", "8", "10"); 90 check_source_target(true, "54.0", "9", "10"); 91 check_source_target(true, "54.0", "10", "10"); 92 check_source_target(false, "55.0", "6", "11"); 93 check_source_target(false, "55.0", "7", "11"); 94 check_source_target(false, "55.0", "8", "11"); 95 check_source_target(false, "55.0", "9", "11"); 96 check_source_target(false, "55.0", "10", "11"); 97 check_source_target(false, "55.0", "11", "11"); 98 check_source_target(false, "56.0", "12", "12"); 99 100 checksrc16("-source 1.6"); 101 checksrc16("-source 6"); 102 checksrc16("-source 1.6", "-target 1.6"); 103 checksrc16("-source 6", "-target 6"); 104 checksrc17("-source 1.7"); 105 checksrc17("-source 7"); 106 checksrc17("-source 1.7", "-target 1.7"); 107 checksrc17("-source 7", "-target 7"); 108 checksrc18("-source 1.8"); 109 checksrc18("-source 8"); 110 checksrc18("-source 1.8", "-target 1.8"); 111 checksrc18("-source 8", "-target 8"); 112 checksrc19("-source 1.9"); 113 checksrc19("-source 9"); 114 checksrc19("-source 1.9", "-target 1.9"); 115 checksrc19("-source 9", "-target 9"); 116 checksrc110(); 117 checksrc110("-source 1.10"); 118 checksrc110("-source 10"); 119 checksrc110("-source 1.10", "-target 1.10"); 120 checksrc110("-source 10", "-target 10"); 121 checksrc111("-source 11"); 122 checksrc111("-source 11", "-target 11"); 123 checksrc112("-source 12"); 124 checksrc112("-source 12", "-target 12"); 125 checksrc112("-target 12"); 126 127 fail("-source 7", "-target 1.6", "Base.java"); 128 fail("-source 8", "-target 1.6", "Base.java"); 129 fail("-source 8", "-target 1.7", "Base.java"); 130 fail("-source 9", "-target 1.7", "Base.java"); 131 fail("-source 9", "-target 1.8", "Base.java"); 132 fail("-source 10", "-target 1.7", "Base.java"); 133 fail("-source 10", "-target 1.8", "Base.java"); 134 fail("-source 11", "-target 1.9", "Base.java"); 135 fail("-source 11", "-target 1.10", "Base.java"); 136 fail("-source 12", "-target 1.10", "Base.java"); 137 fail("-source 12", "-target 11", "Base.java"); 138 139 fail("-source 1.5", "-target 1.5", "Base.java"); 140 fail("-source 1.4", "-target 1.4", "Base.java"); 141 fail("-source 1.3", "-target 1.3", "Base.java"); 142 fail("-source 1.2", "-target 1.2", "Base.java"); 143 144 if (failedCases > 0) { 145 System.err.println("failedCases = " + String.valueOf(failedCases)); 146 throw new Error("Test failed"); 147 } 148 149 } 150 151 protected void printargs(String fname,String... args) { 152 System.out.printf("test: %s", fname); 153 for (String onearg : args) { 154 System.out.printf(" %s", onearg); 155 } 156 System.out.printf("\n", fname); 157 } 158 159 protected void check_source_target(boolean dotOne, String... args) { 160 printargs("check_source_target", args); 161 check_target(dotOne, args[0], args[1], args[2]); 162 if (dotOne) { 163 check_target(dotOne, args[0], "1." + args[1], args[2]); 164 } 165 } 166 167 protected void check_target(boolean dotOne, String... args) { 168 check(args[0], "-source " + args[1], "-target " + args[2]); 169 if (dotOne) { 170 check(args[0], "-source " + args[1], "-target 1." + args[2]); 171 } 172 } 173 174 protected void check(String major, String... args) { 175 printargs("check", args); 176 List<String> jcargs = new ArrayList<>(); 177 jcargs.add("-Xlint:-options"); 178 179 // add in args conforming to List requrements of JavaCompiler 180 for (String onearg : args) { 181 String[] fields = onearg.split(" "); 182 for (String onefield : fields) { 183 jcargs.add(onefield); 184 } 185 } 186 187 boolean creturn = compile("Base.java", jcargs); 188 if (!creturn) { 189 // compilation errors note and return.. assume no class file 190 System.err.println("check: Compilation Failed"); 191 System.err.println("\t classVersion:\t" + major); 192 System.err.println("\t arguments:\t" + jcargs); 193 failedCases++; 194 195 } else if (!checkClassFileVersion("Base.class", major)) { 196 failedCases++; 197 } 198 } 199 200 protected void checksrc16(String... args) { 201 printargs("checksrc16", args); 202 int asize = args.length; 203 String[] newargs = new String[asize + 1]; 204 System.arraycopy(args, 0, newargs, 0, asize); 205 newargs[asize] = "Base.java"; 206 pass(newargs); 207 newargs[asize] = "New17.java"; 208 fail(newargs); 209 } 210 211 protected void checksrc17(String... args) { 212 printargs("checksrc17", args); 213 int asize = args.length; 214 String[] newargs = new String[asize+1]; 215 System.arraycopy(args, 0, newargs,0 , asize); 216 newargs[asize] = "New17.java"; 217 pass(newargs); 218 newargs[asize] = "New18.java"; 219 fail(newargs); 220 } 221 222 protected void checksrc18(String... args) { 223 printargs("checksrc18", args); 224 int asize = args.length; 225 String[] newargs = new String[asize+1]; 226 System.arraycopy(args, 0, newargs,0 , asize); 227 newargs[asize] = "New17.java"; 228 pass(newargs); 229 newargs[asize] = "New18.java"; 230 pass(newargs); 231 newargs[asize] = "New110.java"; 232 fail(newargs); 233 } 234 235 protected void checksrc19(String... args) { 236 printargs("checksrc19", args); 237 checksrc18(args); 238 } 239 240 protected void checksrc110(String... args) { 241 printargs("checksrc110", args); 242 int asize = args.length; 243 String[] newargs = new String[asize+1]; 244 System.arraycopy(args, 0, newargs,0 , asize); 245 newargs[asize] = "New17.java"; 246 pass(newargs); 247 newargs[asize] = "New18.java"; 248 pass(newargs); 249 newargs[asize] = "New110.java"; 250 pass(newargs); 251 } 252 253 protected void checksrc111(String... args) { 254 printargs("checksrc111", args); 255 checksrc110(args); 256 } 257 258 protected void checksrc112(String... args) { 259 printargs("checksrc112", args); 260 checksrc111(args); 261 } 262 263 protected void pass(String... args) { 264 printargs("pass", args); 265 266 List<String> jcargs = new ArrayList<String>(); 267 jcargs.add("-Xlint:-options"); 268 269 // add in args conforming to List requrements of JavaCompiler 270 for (String onearg : args) { 271 String[] fields = onearg.split(" "); 272 for (String onefield : fields) { 273 jcargs.add(onefield); 274 } 275 } 276 277 // empty list is error 278 if (jcargs.isEmpty()) { 279 System.err.println("error: test error in pass() - No arguments"); 280 System.err.println("\t arguments:\t" + jcargs); 281 failedCases++; 282 return; 283 } 284 285 // the last argument is the filename *.java 286 String filename = jcargs.get(jcargs.size() - 1); 287 jcargs.remove(jcargs.size() - 1); 288 289 boolean creturn = compile(filename, jcargs); 290 // expect a compilation failure, failure if otherwise 291 if (!creturn) { 292 System.err.println("pass: Compilation erroneously failed"); 293 System.err.println("\t arguments:\t" + jcargs); 294 System.err.println("\t file :\t" + filename); 295 failedCases++; 296 297 } 298 299 } 300 301 protected void fail(String... args) { 302 printargs("fail", args); 303 304 List<String> jcargs = new ArrayList<String>(); 305 jcargs.add("-Xlint:-options"); 306 307 // add in args conforming to List requrements of JavaCompiler 308 for (String onearg : args) { 309 String[] fields = onearg.split(" "); 310 for (String onefield : fields) { 311 jcargs.add(onefield); 312 } 313 } 314 315 // empty list is error 316 if (jcargs.isEmpty()) { 317 System.err.println("error: test error in fail()- No arguments"); 318 System.err.println("\t arguments:\t" + jcargs); 319 failedCases++; 320 return; 321 } 322 323 // the last argument is the filename *.java 324 String filename = jcargs.get(jcargs.size() - 1); 325 jcargs.remove(jcargs.size() - 1); 326 327 boolean creturn = compile(filename, jcargs); 328 // expect a compilation failure, failure if otherwise 329 if (creturn) { 330 System.err.println("fail: Compilation erroneously succeeded"); 331 System.err.println("\t arguments:\t" + jcargs); 332 System.err.println("\t file :\t" + filename); 333 failedCases++; 334 } 335 } 336 337 protected boolean compile(String sourceFile, List<String>options) { 338 JavaCompiler.CompilationTask jctask; 339 try (StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null)) { 340 Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(sourceFile); 341 342 jctask = javacompiler.getTask( 343 null, // Writer 344 fm, // JavaFileManager 345 null, // DiagnosticListener 346 options, // Iterable<String> 347 null, // Iterable<String> classes 348 files); // Iterable<? extends JavaFileObject> 349 350 try { 351 return jctask.call(); 352 } catch (IllegalStateException e) { 353 System.err.println(e); 354 return false; 355 } 356 } catch (IOException e) { 357 throw new Error(e); 358 } 359 } 360 361 protected void writeSourceFile(String fileName, String body) throws IOException{ 362 try (Writer fw = new FileWriter(fileName)) { 363 fw.write(body); 364 } 365 } 366 367 protected void genSourceFiles() throws IOException{ 368 /* Create a file that executes with all supported versions. */ 369 writeSourceFile("Base.java","public class Base { }\n"); 370 371 /* 372 * Create a file with a new feature in 1.7, not in 1.6 : "<>" 373 */ 374 writeSourceFile("New17.java", 375 "import java.util.List;\n" + 376 "import java.util.ArrayList;\n" + 377 "class New17 { List<String> s = new ArrayList<>(); }\n" 378 ); 379 380 /* 381 * Create a file with a new feature in 1.8, not in 1.7 : lambda 382 */ 383 writeSourceFile("New18.java", 384 "public class New18 { \n" + 385 " void m() { \n" + 386 " new Thread(() -> { }); \n" + 387 " } \n" + 388 "} \n" 389 ); 390 391 /* 392 * Create a file with a new feature in 1.10, not in 1.9 : var 393 */ 394 writeSourceFile("New110.java", 395 "public class New110 { \n" + 396 " void m() { \n" + 397 " var tmp = new Thread(() -> { }); \n" + 398 " } \n" + 399 "} \n" 400 ); 401 402 } 403 404 protected boolean checkClassFileVersion 405 (String filename,String classVersionNumber) { 406 ByteBuffer bb = ByteBuffer.allocate(1024); 407 try (FileChannel fc = new FileInputStream(filename).getChannel()) { 408 bb.clear(); 409 if (fc.read(bb) < 0) 410 throw new IOException("Could not read from file : " + filename); 411 bb.flip(); 412 int minor = bb.getShort(4); 413 int major = bb.getShort(6); 414 String fileVersion = major + "." + minor; 415 if (fileVersion.equals(classVersionNumber)) { 416 return true; 417 } else { 418 System.err.println("checkClassFileVersion : Failed"); 419 System.err.println("\tclassfile version mismatch"); 420 System.err.println("\texpected : " + classVersionNumber); 421 System.err.println("\tfound : " + fileVersion); 422 return false; 423 } 424 } 425 catch (IOException e) { 426 System.err.println("checkClassFileVersion : Failed"); 427 System.err.println("\terror :\t" + e.getMessage()); 428 System.err.println("\tfile:\tfilename"); 429 } 430 return false; 431 } 432 } 433