< prev index next >

test/langtools/tools/javac/versions/Versions.java

Print this page




  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) {


 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         }


 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);


  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 import java.util.Set;
  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     public static final Set<String> RETIRED_SOURCES =
  63         Set.of("1.2", "1.3", "1.4", "1.5");
  64 
  65     public static final Set<String> VALID_SOURCES =
  66         Set.of("1.6", "1.7", "1.8", "1.9", "1.10", "11", "12");
  67 
  68     public static final String LATEST_MAJOR_VERSION = "56.0";
  69 
  70     static enum SourceTarget {
  71         // Reminder: update switch in checksrc when adding or removing values.
  72         SIX(true,     "50.0",  "6"),
  73         SEVEN(true,   "51.0",  "7"),
  74         EIGHT(true,   "52.0",  "8"),
  75         NINE(true,    "53.0",  "9"),
  76         TEN(true,     "54.0", "10"),
  77         ELEVEN(false, "55.0", "11"),
  78         TWELVE(false, "56.0", "12");
  79 
  80         private boolean dotOne;
  81         private String classFileVer;
  82         private String target;
  83 
  84         private SourceTarget(boolean dotOne, String classFileVer, String target) {
  85             this.dotOne = dotOne;
  86             this.classFileVer = classFileVer;
  87             this.target = target;
  88         }
  89 
  90         public static void checksrc(SourceTarget st, Versions version, String... args) {
  91             switch(st) {
  92             case SIX:
  93                 version.checksrc16(args);
  94                 break;
  95 
  96             case SEVEN:
  97                 version.checksrc17(args);
  98                 break;
  99 
 100             case EIGHT:
 101                 version.checksrc18(args);
 102                 break;
 103 
 104             case NINE:
 105                 version.checksrc19(args);
 106                 break;
 107 
 108             case TEN:
 109                 version.checksrc110(args);
 110                 break;
 111 
 112             case ELEVEN:
 113                 version.checksrc111(args);
 114                 break;
 115 
 116              case TWELVE:
 117                  version.checksrc112(args);
 118                  break;
 119 
 120             default:
 121                 throw new AssertionError();
 122             }
 123         }
 124 
 125         public boolean dotOne() {
 126             return dotOne;
 127         }
 128 
 129         public String classFileVer() {
 130             return classFileVer;
 131         }
 132 
 133         public String target() {
 134             return target;
 135         }
 136     }
 137 
 138     void run() {
 139 
 140         String TC = "";
 141         System.out.println("Version.java: Starting");
 142 

 143         check(LATEST_MAJOR_VERSION);
 144         for (String source : VALID_SOURCES) {
 145             check(LATEST_MAJOR_VERSION, "-source " + source);
 146         }
 147         
 148         // Verify that a -source value less than a -target value is
 149         // accepted and that the resulting class files are dependent
 150         // on the target setting alone.
 151         SourceTarget[] sourceTargets = SourceTarget.values();
 152         for (int i = 0; i < sourceTargets.length; i++) {
 153             SourceTarget st = sourceTargets[i];
 154             String classFileVer = st.classFileVer();
 155             String target = st.target();
 156             boolean dotOne = st.dotOne();
 157             check_source_target(dotOne, classFileVer, target, target);
 158             for (int j = i; j > 0; j--) {
 159                 String source = sourceTargets[j].target();
 160                 check_source_target(dotOne, classFileVer, source, target);
 161             }
 162         }
 163 
 164         // Verify acceptance of different combinations of -source N,
 165         // -target N
 166         for (int i = 0; i < sourceTargets.length; i++) {
 167             SourceTarget st = sourceTargets[i];
 168             
 169             SourceTarget.checksrc(st, this, "-source " + st.target());
 170             SourceTarget.checksrc(st, this, "-source " + st.target(), "-target " + st.target());
 171 
 172             if (st.dotOne()) {
 173                 SourceTarget.checksrc(st, this, "-source 1." + st.target());
 174                 SourceTarget.checksrc(st, this, "-source 1." + st.target(), "-target 1." + st.target());
 175             }
 176 
 177             if (i == sourceTargets.length) {
 178                 // Can use -target without -source setting only for
 179                 // most recent target
 180                 SourceTarget.checksrc(st, this, "-target " + st.target());
 181 
 182                 if (!st.classFileVer().equals(LATEST_MAJOR_VERSION)) {
 183                     throw new RuntimeException(st +
 184                                                "does not have class file version" +
 185                                                LATEST_MAJOR_VERSION);
 186                 }
 187             }
 188         }
 189 
 190         // Verify that -source N -target (N-1) is rejected
 191         for (int i = 1 /* Skip zeroth value */; i < sourceTargets.length; i++) {
 192             fail("-source " + sourceTargets[i].target(),
 193                  "-target " + sourceTargets[i-1].target(),
 194                  "Base.java");
 195         }
 196 
 197         // Previously supported source/target values
 198         for (String source  : RETIRED_SOURCES) {
 199             fail("-source " + source, "-target " + source, "Base.java");
 200         }

















 201 
 202         if (failedCases > 0) {
 203             System.err.println("failedCases = " + String.valueOf(failedCases));
 204             throw new Error("Test failed");
 205         }
 206 
 207     }
 208 
 209     protected void printargs(String fname,String... args) {
 210         System.out.printf("test: %s", fname);
 211         for (String onearg : args) {
 212             System.out.printf(" %s", onearg);
 213         }
 214         System.out.printf("\n", fname);
 215     }
 216 
 217     protected void check_source_target(boolean dotOne, String... args) {
 218         printargs("check_source_target", args);
 219         check_target(dotOne, args[0], args[1], args[2]);
 220         if (dotOne) {


 293     protected void checksrc19(String... args) {
 294         printargs("checksrc19", args);
 295         checksrc18(args);
 296     }
 297 
 298     protected void checksrc110(String... args) {
 299         printargs("checksrc110", args);
 300         int asize = args.length;
 301         String[] newargs = new String[asize+1];
 302         System.arraycopy(args, 0, newargs,0 , asize);
 303         newargs[asize] = "New17.java";
 304         pass(newargs);
 305         newargs[asize] = "New18.java";
 306         pass(newargs);
 307         newargs[asize] = "New110.java";
 308         pass(newargs);
 309     }
 310 
 311     protected void checksrc111(String... args) {
 312         printargs("checksrc111", args);
 313         int asize = args.length;
 314         String[] newargs = new String[asize+1];
 315         System.arraycopy(args, 0, newargs,0 , asize);
 316         newargs[asize] = "New17.java";
 317         pass(newargs);
 318         newargs[asize] = "New18.java";
 319         pass(newargs);
 320         newargs[asize] = "New110.java";
 321         pass(newargs);
 322         newargs[asize] = "New111.java";
 323         pass(newargs);
 324     }
 325 
 326     protected void checksrc112(String... args) {
 327         printargs("checksrc112", args);
 328         checksrc111(args);
 329     }
 330 
 331     protected void pass(String... args) {
 332         printargs("pass", args);
 333 
 334         List<String> jcargs = new ArrayList<String>();
 335         jcargs.add("-Xlint:-options");
 336 
 337         // add in args conforming to List requrements of JavaCompiler
 338         for (String onearg : args) {
 339             String[] fields = onearg.split(" ");
 340             for (String onefield : fields) {
 341                 jcargs.add(onefield);
 342             }
 343         }


 450          */
 451         writeSourceFile("New18.java",
 452             "public class New18 { \n" +
 453             "    void m() { \n" +
 454             "    new Thread(() -> { }); \n" +
 455             "    } \n" +
 456             "} \n"
 457         );
 458 
 459         /*
 460          * Create a file with a new feature in 1.10, not in 1.9 : var
 461          */
 462         writeSourceFile("New110.java",
 463             "public class New110 { \n" +
 464             "    void m() { \n" +
 465             "    var tmp = new Thread(() -> { }); \n" +
 466             "    } \n" +
 467             "} \n"
 468         );
 469 
 470         /*
 471          * Create a file with a new feature in 11, not in 10 : var for lambda parameters
 472          */
 473         writeSourceFile("New111.java",
 474             "public class New111 { \n" +
 475             "    static java.util.function.Function<String,String> f = (var x) -> x.substring(0);\n" +
 476             "    void m(String name) { \n" +
 477             "    var tmp = new Thread(() -> { }, f.apply(name)); \n" +
 478             "    } \n" +
 479             "} \n"
 480         );
 481     }
 482 
 483     protected boolean checkClassFileVersion
 484         (String filename,String classVersionNumber) {
 485         ByteBuffer bb = ByteBuffer.allocate(1024);
 486         try (FileChannel fc = new FileInputStream(filename).getChannel()) {
 487             bb.clear();
 488             if (fc.read(bb) < 0)
 489                 throw new IOException("Could not read from file : " + filename);
 490             bb.flip();
 491             int minor = bb.getShort(4);
 492             int major = bb.getShort(6);
 493             String fileVersion = major + "." + minor;
 494             if (fileVersion.equals(classVersionNumber)) {
 495                 return true;
 496             } else {
 497                 System.err.println("checkClassFileVersion : Failed");
 498                 System.err.println("\tclassfile version mismatch");
 499                 System.err.println("\texpected : " + classVersionNumber);
 500                 System.err.println("\tfound    : " + fileVersion);
< prev index next >