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 import java.util.function.BiConsumer;
46
47 public class Versions {
48
49 protected JavaCompiler javacompiler;
50 protected int failedCases;
51
52 public Versions() throws IOException {
53 javacompiler = ToolProvider.getSystemJavaCompiler();
54 genSourceFiles();
55 failedCases = 0;
56 }
57
58 public static void main(String... args) throws IOException {
59 Versions versions = new Versions();
60 versions.run();
61 }
62
63 public static final Set<String> RETIRED_SOURCES =
64 Set.of("1.2", "1.3", "1.4", "1.5");
65
66 public static final Set<String> VALID_SOURCES =
67 Set.of("1.6", "1.7", "1.8", "1.9", "1.10", "11", "12");
68
69 public static final String LATEST_MAJOR_VERSION = "56.0";
70
71 static enum SourceTarget {
72 // Reminder: update switch in checksrc when adding or removing values.
73 SIX(true, "50.0", "6", Versions::checksrc16),
74 SEVEN(true, "51.0", "7", Versions::checksrc17),
75 EIGHT(true, "52.0", "8", Versions::checksrc18),
76 NINE(true, "53.0", "9", Versions::checksrc19),
77 TEN(true, "54.0", "10", Versions::checksrc110),
78 ELEVEN(false, "55.0", "11", Versions::checksrc111),
79 TWELVE(false, "56.0", "12", Versions::checksrc112);
80
81 private final boolean dotOne;
82 private final String classFileVer;
83 private final String target;
84 private final BiConsumer<Versions, String[]> checker;
85
86 private SourceTarget(boolean dotOne, String classFileVer, String target,
87 BiConsumer<Versions, String[]> checker) {
88 this.dotOne = dotOne;
89 this.classFileVer = classFileVer;
90 this.target = target;
91 this.checker = checker;
92 }
93
94 public void checksrc(Versions version, String... args) {
95 checker.accept(version, args);
96 }
97
98 public boolean dotOne() {
99 return dotOne;
100 }
101
102 public String classFileVer() {
103 return classFileVer;
104 }
105
106 public String target() {
107 return target;
108 }
109 }
110
111 void run() {
112
113 String TC = "";
114 System.out.println("Version.java: Starting");
115
116 check(LATEST_MAJOR_VERSION);
117 for (String source : VALID_SOURCES) {
118 check(LATEST_MAJOR_VERSION, "-source " + source);
119 }
120
121 // Verify that a -source value less than a -target value is
122 // accepted and that the resulting class files are dependent
123 // on the target setting alone.
124 SourceTarget[] sourceTargets = SourceTarget.values();
125 for (int i = 0; i < sourceTargets.length; i++) {
126 SourceTarget st = sourceTargets[i];
127 String classFileVer = st.classFileVer();
128 String target = st.target();
129 boolean dotOne = st.dotOne();
130 check_source_target(dotOne, classFileVer, target, target);
131 for (int j = i; j > 0; j--) {
132 String source = sourceTargets[j].target();
133 check_source_target(dotOne, classFileVer, source, target);
134 }
135 }
136
137 // Verify acceptance of different combinations of -source N,
138 // -target N
139 for (int i = 0; i < sourceTargets.length; i++) {
140 SourceTarget st = sourceTargets[i];
141
142 st.checksrc(this, "-source " + st.target());
143 st.checksrc(this, "-source " + st.target(), "-target " + st.target());
144
145 if (st.dotOne()) {
146 st.checksrc(this, "-source 1." + st.target());
147 st.checksrc(this, "-source 1." + st.target(), "-target 1." + st.target());
148 }
149
150 if (i == sourceTargets.length) {
151 // Can use -target without -source setting only for
152 // most recent target
153 st.checksrc(this, "-target " + st.target());
154
155 if (!st.classFileVer().equals(LATEST_MAJOR_VERSION)) {
156 throw new RuntimeException(st +
157 "does not have class file version" +
158 LATEST_MAJOR_VERSION);
159 }
160 }
161 }
162
163 // Verify that -source N -target (N-1) is rejected
164 for (int i = 1 /* Skip zeroth value */; i < sourceTargets.length; i++) {
165 fail("-source " + sourceTargets[i].target(),
166 "-target " + sourceTargets[i-1].target(),
167 "Base.java");
168 }
169
170 // Previously supported source/target values
171 for (String source : RETIRED_SOURCES) {
172 fail("-source " + source, "-target " + source, "Base.java");
173 }
174
175 if (failedCases > 0) {
176 System.err.println("failedCases = " + String.valueOf(failedCases));
177 throw new Error("Test failed");
178 }
179
180 }
181
182 protected void printargs(String fname,String... args) {
183 System.out.printf("test: %s", fname);
184 for (String onearg : args) {
185 System.out.printf(" %s", onearg);
186 }
187 System.out.printf("\n", fname);
188 }
189
190 protected void check_source_target(boolean dotOne, String... args) {
191 printargs("check_source_target", args);
192 check_target(dotOne, args[0], args[1], args[2]);
193 if (dotOne) {
266 protected void checksrc19(String... args) {
267 printargs("checksrc19", args);
268 checksrc18(args);
269 }
270
271 protected void checksrc110(String... args) {
272 printargs("checksrc110", args);
273 int asize = args.length;
274 String[] newargs = new String[asize+1];
275 System.arraycopy(args, 0, newargs,0 , asize);
276 newargs[asize] = "New17.java";
277 pass(newargs);
278 newargs[asize] = "New18.java";
279 pass(newargs);
280 newargs[asize] = "New110.java";
281 pass(newargs);
282 }
283
284 protected void checksrc111(String... args) {
285 printargs("checksrc111", args);
286 int asize = args.length;
287 String[] newargs = new String[asize+1];
288 System.arraycopy(args, 0, newargs,0 , asize);
289 newargs[asize] = "New17.java";
290 pass(newargs);
291 newargs[asize] = "New18.java";
292 pass(newargs);
293 newargs[asize] = "New110.java";
294 pass(newargs);
295 newargs[asize] = "New111.java";
296 pass(newargs);
297 }
298
299 protected void checksrc112(String... args) {
300 printargs("checksrc112", args);
301 checksrc111(args);
302 }
303
304 protected void pass(String... args) {
305 printargs("pass", args);
306
307 List<String> jcargs = new ArrayList<String>();
308 jcargs.add("-Xlint:-options");
309
310 // add in args conforming to List requrements of JavaCompiler
311 for (String onearg : args) {
312 String[] fields = onearg.split(" ");
313 for (String onefield : fields) {
314 jcargs.add(onefield);
315 }
316 }
423 */
424 writeSourceFile("New18.java",
425 "public class New18 { \n" +
426 " void m() { \n" +
427 " new Thread(() -> { }); \n" +
428 " } \n" +
429 "} \n"
430 );
431
432 /*
433 * Create a file with a new feature in 1.10, not in 1.9 : var
434 */
435 writeSourceFile("New110.java",
436 "public class New110 { \n" +
437 " void m() { \n" +
438 " var tmp = new Thread(() -> { }); \n" +
439 " } \n" +
440 "} \n"
441 );
442
443 /*
444 * Create a file with a new feature in 11, not in 10 : var for lambda parameters
445 */
446 writeSourceFile("New111.java",
447 "public class New111 { \n" +
448 " static java.util.function.Function<String,String> f = (var x) -> x.substring(0);\n" +
449 " void m(String name) { \n" +
450 " var tmp = new Thread(() -> { }, f.apply(name)); \n" +
451 " } \n" +
452 "} \n"
453 );
454 }
455
456 protected 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);
|