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


  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     static JavaCompiler javacompiler = ToolProvider.getSystemJavaCompiler();
  49     static int failedCases = 0;
  50 
  51     public static void main(String... args) throws IOException {

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

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

















 195 
 196         if (failedCases > 0) {
 197             System.err.println("failedCases = " + String.valueOf(failedCases));
 198             throw new Error("Test failed");
 199         }
 200 
 201     }
 202 
 203     static void printargs(String fname,String... args) {
 204         System.out.printf("test: %s", fname);
 205         for (String onearg : args) {
 206             System.out.printf(" %s", onearg);
 207         }
 208         System.out.printf("\n", fname);
 209     }
 210 
 211     static void check_source_target(boolean dotOne, String... args) {
 212         printargs("check_source_target", args);
 213         check_target(dotOne, args[0], args[1], args[2]);
 214         if (dotOne) {
 215             check_target(dotOne, args[0], "1." + args[1], args[2]);
 216         }
 217     }
 218 
 219     static void check_target(boolean dotOne, String... args) {
 220         check(args[0], "-source " + args[1], "-target " + args[2]);
 221         if (dotOne) {
 222             check(args[0], "-source " + args[1], "-target 1." + args[2]);
 223         }
 224     }
 225 
 226     static void check(String major, String... args) {
 227         printargs("check", args);
 228         List<String> jcargs = new ArrayList<>();
 229         jcargs.add("-Xlint:-options");
 230 
 231         // add in args conforming to List requrements of JavaCompiler
 232         for (String onearg : args) {
 233             String[] fields = onearg.split(" ");
 234             for (String onefield : fields) {
 235                 jcargs.add(onefield);
 236             }
 237         }
 238 
 239         boolean creturn = compile("Base.java", jcargs);
 240         if (!creturn) {
 241             // compilation errors note and return.. assume no class file
 242             System.err.println("check: Compilation Failed");
 243             System.err.println("\t classVersion:\t" + major);
 244             System.err.println("\t arguments:\t" + jcargs);
 245             failedCases++;
 246 
 247         } else if (!checkClassFileVersion("Base.class", major)) {
 248             failedCases++;
 249         }
 250     }
 251 
 252     static void checksrc16(String... args) {
 253         printargs("checksrc16", args);
 254         int asize = args.length;
 255         String[] newargs = new String[asize + 1];
 256         System.arraycopy(args, 0, newargs, 0, asize);
 257         newargs[asize] = "Base.java";
 258         pass(newargs);
 259         newargs[asize] = "New17.java";
 260         fail(newargs);
 261     }
 262 
 263     static void checksrc17(String... args) {
 264         printargs("checksrc17", args);
 265         int asize = args.length;
 266         String[] newargs = new String[asize+1];
 267         System.arraycopy(args, 0, newargs,0 , asize);
 268         newargs[asize] = "New17.java";
 269         pass(newargs);
 270         newargs[asize] = "New18.java";
 271         fail(newargs);
 272     }
 273 
 274     static void checksrc18(String... args) {
 275         printargs("checksrc18", args);
 276         int asize = args.length;
 277         String[] newargs = new String[asize+1];
 278         System.arraycopy(args, 0, newargs,0 , asize);
 279         newargs[asize] = "New17.java";
 280         pass(newargs);
 281         newargs[asize] = "New18.java";
 282         pass(newargs);
 283         newargs[asize] = "New110.java";
 284         fail(newargs);
 285     }
 286 
 287     static void checksrc19(String... args) {
 288         printargs("checksrc19", args);
 289         checksrc18(args);
 290     }
 291 
 292     static void checksrc110(String... args) {
 293         printargs("checksrc110", args);
 294         int asize = args.length;
 295         String[] newargs = new String[asize+1];
 296         System.arraycopy(args, 0, newargs,0 , asize);
 297         newargs[asize] = "New17.java";
 298         pass(newargs);
 299         newargs[asize] = "New18.java";
 300         pass(newargs);
 301         newargs[asize] = "New110.java";
 302         pass(newargs);
 303     }
 304 
 305     static void checksrc111(String... args) {
 306         printargs("checksrc111", args);
 307         checksrc110(args);
 308     }
 309 
 310     static void checksrc112(String... args) {
 311         printargs("checksrc112", args);
 312         checksrc111(args);
 313     }
 314 
 315     static void pass(String... args) {
 316         printargs("pass", args);
 317 
 318         List<String> jcargs = new ArrayList<String>();
 319         jcargs.add("-Xlint:-options");
 320 
 321         // add in args conforming to List requrements of JavaCompiler
 322         for (String onearg : args) {
 323             String[] fields = onearg.split(" ");
 324             for (String onefield : fields) {
 325                 jcargs.add(onefield);
 326             }
 327         }
 328 
 329         // empty list is error
 330         if (jcargs.isEmpty()) {
 331             System.err.println("error: test error in pass() - No arguments");
 332             System.err.println("\t arguments:\t" + jcargs);
 333             failedCases++;
 334             return;
 335         }
 336 
 337         // the last argument is the filename *.java
 338         String filename = jcargs.get(jcargs.size() - 1);
 339         jcargs.remove(jcargs.size() - 1);
 340 
 341         boolean creturn = compile(filename, jcargs);
 342         // expect a compilation failure, failure if otherwise
 343         if (!creturn) {
 344             System.err.println("pass: Compilation erroneously failed");
 345             System.err.println("\t arguments:\t" + jcargs);
 346             System.err.println("\t file     :\t" + filename);
 347             failedCases++;
 348 
 349         }
 350 
 351     }
 352 
 353   static void fail(String... args) {
 354         printargs("fail", args);
 355 
 356         List<String> jcargs = new ArrayList<String>();
 357         jcargs.add("-Xlint:-options");
 358 
 359         // add in args conforming to List requrements of JavaCompiler
 360         for (String onearg : args) {
 361             String[] fields = onearg.split(" ");
 362             for (String onefield : fields) {
 363                 jcargs.add(onefield);
 364             }
 365         }
 366 
 367         // empty list is error
 368         if (jcargs.isEmpty()) {
 369             System.err.println("error: test error in fail()- No arguments");
 370             System.err.println("\t arguments:\t" + jcargs);
 371             failedCases++;
 372             return;
 373         }
 374 
 375         // the last argument is the filename *.java
 376         String filename = jcargs.get(jcargs.size() - 1);
 377         jcargs.remove(jcargs.size() - 1);
 378 
 379         boolean creturn = compile(filename, jcargs);
 380         // expect a compilation failure, failure if otherwise
 381         if (creturn) {
 382             System.err.println("fail: Compilation erroneously succeeded");
 383             System.err.println("\t arguments:\t" + jcargs);
 384             System.err.println("\t file     :\t" + filename);
 385             failedCases++;
 386         }
 387     }
 388 
 389     static boolean compile(String sourceFile, List<String>options) {
 390         JavaCompiler.CompilationTask jctask;
 391         try (StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null)) {
 392             Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(sourceFile);
 393 
 394             jctask = javacompiler.getTask(
 395                 null,    // Writer
 396                 fm,      // JavaFileManager
 397                 null,    // DiagnosticListener
 398                 options, // Iterable<String>
 399                 null,    // Iterable<String> classes
 400                 files);  // Iterable<? extends JavaFileObject>
 401 
 402             try {
 403                 return jctask.call();
 404             } catch (IllegalStateException e) {
 405                 System.err.println(e);
 406                 return false;
 407             }
 408         } catch (IOException e) {
 409             throw new Error(e);
 410         }
 411     }
 412 
 413     static void writeSourceFile(String fileName, String body) throws IOException{
 414         try (Writer fw = new FileWriter(fileName)) {
 415             fw.write(body);
 416         }
 417     }
 418 
 419     static void genSourceFiles() throws IOException{
 420         /* Create a file that executes with all supported versions. */
 421         writeSourceFile("Base.java","public class Base { }\n");
 422 
 423         /*
 424          * Create a file with a new feature in 1.7, not in 1.6 : "<>"
 425          */
 426         writeSourceFile("New17.java",
 427             "import java.util.List;\n" +
 428             "import java.util.ArrayList;\n" +
 429             "class New17 { List<String> s = new ArrayList<>(); }\n"
 430         );
 431 
 432         /*
 433          * Create a file with a new feature in 1.8, not in 1.7 : lambda
 434          */
 435         writeSourceFile("New18.java",
 436             "public class New18 { \n" +
 437             "    void m() { \n" +
 438             "    new Thread(() -> { }); \n" +
 439             "    } \n" +
 440             "} \n"
 441         );
 442 
 443         /*
 444          * Create a file with a new feature in 1.10, not in 1.9 : var
 445          */
 446         writeSourceFile("New110.java",
 447             "public class New110 { \n" +
 448             "    void m() { \n" +
 449             "    var tmp = new Thread(() -> { }); \n" +
 450             "    } \n" +
 451             "} \n"
 452         );
 453 
 454     }
 455 
 456     static boolean checkClassFileVersion
 457         (String filename,String classVersionNumber) {
 458         ByteBuffer bb = ByteBuffer.allocate(1024);
 459         try (FileChannel fc = new FileInputStream(filename).getChannel()) {
 460             bb.clear();
 461             if (fc.read(bb) < 0)
 462                 throw new IOException("Could not read from file : " + filename);
 463             bb.flip();
 464             int minor = bb.getShort(4);
 465             int major = bb.getShort(6);
 466             String fileVersion = major + "." + minor;
 467             if (fileVersion.equals(classVersionNumber)) {
 468                 return true;
 469             } else {
 470                 System.err.println("checkClassFileVersion : Failed");
 471                 System.err.println("\tclassfile version mismatch");
 472                 System.err.println("\texpected : " + classVersionNumber);
 473                 System.err.println("\tfound    : " + fileVersion);
 474                 return false;
 475             }
 476         }
< prev index next >