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