1 /*
2 * Copyright (c) 2007, 2024, 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 6545058 6611182 8016209 8139986 8162746 8278967
27 * @summary validate and test -version, -fullversion, and internal, as well as
28 * sanity checks if a tool can be launched.
29 * @modules jdk.compiler
30 * jdk.zipfs
31 * @compile VersionCheck.java
32 * @run main VersionCheck
33 */
34
35 import java.io.File;
36 import java.util.ArrayList;
37 import java.util.HashMap;
38 import java.util.HashSet;
39 import java.util.List;
40 import java.util.Map;
41 import java.util.Set;
42
43 public class VersionCheck extends TestHelper {
44
45 // tools that do not accept -J-option
46 static final String[] BLACKLIST_JOPTION = {
47 "asprof",
48 "controlpanel",
49 "jabswitch",
50 "java-rmi",
51 "java-rmi.cgi",
52 "java",
53 "javacpl",
54 "jaccessinspector",
55 "jaccessinspector-32",
56 "jaccesswalker",
57 "jaccesswalker-32",
58 "javaw",
59 "javaws",
60 "jcontrol",
61 "jfrconv",
62 "jmc",
63 "jmc.ini",
64 "jweblauncher",
65 "jpackage",
66 "ssvagent",
67 "jwebserver"
68 };
69
70 // tools that do not accept -version
71 static final String[] BLACKLIST_VERSION = {
72 "asprof",
73 "controlpanel",
74 "jaccessinspector",
75 "jaccessinspector-32",
76 "jaccesswalker",
77 "jaccesswalker-32",
78 "jar",
79 "jarsigner",
80 "java-rmi",
81 "java-rmi.cgi",
82 "javadoc",
83 "javacpl",
84 "javaws",
85 "jcmd",
86 "jconsole",
87 "jcontrol",
88 "jdeprscan",
89 "jdeps",
90 "jfr",
91 "jfrconv",
92 "jimage",
93 "jinfo",
94 "jlink",
95 "jmap",
96 "jmod",
97 "jmc",
98 "jmc.ini",
99 "jps",
100 "jrunscript",
101 "jjs",
102 "jstack",
103 "jstat",
104 "jstatd",
105 "jweblauncher",
106 "keytool",
107 "kinit",
108 "klist",
109 "ktab",
110 "jpackage",
111 "rmiregistry",
112 "serialver",
113 "servertool",
114 "ssvagent"
115 };
116
117 // expected reference strings
118 static String refVersion;
119 static String refFullVersion;
120
121 static String getAllVersionLines(String... argv) {
122 return getVersion0(true, argv);
123 }
124
125 static String getVersion(String... argv) {
126 return getVersion0(false, argv);
127 }
128
129 static String getVersion0(boolean allLines, String... argv) {
130 TestHelper.TestResult tr = doExec(argv);
131 StringBuilder out = new StringBuilder();
132 // remove the HotSpot line and security manager deprecation warnings
133 for (String x : tr.testOutput) {
134 if (allLines || !x.matches(".*Client.*VM.*|" +
135 ".*Server.*VM.*|" +
136 "WARNING:.*terminally.*deprecated.*|" +
137 "WARNING:.*System::setSecurityManager.*")) {
138 out = out.append(x + "\n");
139 }
140 }
141 return out.toString();
142 }
143
144 /*
145 * Checks if the tools accept "-version" option (exit code is zero).
146 * The output of the tools run with "-version" is not verified.
147 */
148 static String testToolVersion() {
149 System.out.println("=== testToolVersion === ");
150 Set<String> failed = new HashSet<>();
151 for (File f : new File(JAVA_BIN).listFiles(new ToolFilter(BLACKLIST_VERSION))) {
152 String x = f.getAbsolutePath();
153 TestResult tr = doExec(x, "-version");
154 System.out.println("Testing " + f.getName());
155 System.out.println("#> " + x + " -version");
156 tr.testOutput.forEach(System.out::println);
157 System.out.println("#> echo $?");
158 System.out.println(tr.exitValue);
159 if (!tr.isOK()) {
160 System.out.println("failed");
161 failed.add(f.getName());
162 }
163 }
164 if (failed.isEmpty()) {
165 System.out.println("testToolVersion passed");
166 return "";
167 } else {
168 System.out.println("testToolVersion failed");
169 return "testToolVersion: " + failed + "; ";
170 }
171
172 }
173
174 static String testJVersionStrings() {
175 System.out.println("=== testJVersionStrings === ");
176 Set<String> failed = new HashSet<>();
177 for (File f : new File(JAVA_BIN).listFiles(new ToolFilter(BLACKLIST_JOPTION))) {
178 System.out.println("Testing " + f.getName());
179 String x = f.getAbsolutePath();
180 String testStr = getVersion(x, "-J-version");
181 if (refVersion.compareTo(testStr) != 0) {
182 failed.add(f.getName());
183 System.out.println("Error: " + x +
184 " fails -J-version comparison");
185 System.out.println("Expected:");
186 System.out.print(refVersion);
187 System.out.println("Actual:");
188 System.out.print(testStr);
189 }
190
191 testStr = getVersion(x, "-J-fullversion");
192 if (refFullVersion.compareTo(testStr) != 0) {
193 failed.add(f.getName());
194 System.out.println("Error: " + x +
195 " fails -J-fullversion comparison");
196 System.out.println("Expected:");
197 System.out.print(refFullVersion);
198 System.out.println("Actual:");
199 System.out.print(testStr);
200 }
201 }
202 if (failed.isEmpty()) {
203 System.out.println("testJVersionStrings passed");
204 return "";
205 } else {
206 System.out.println("testJVersionStrings failed");
207 return "testJVersionStrings: " + failed + "; ";
208 }
209 }
210
211 static String testInternalStrings() {
212 System.out.println("=== testInternalStrings === ");
213 String bStr = refVersion.substring(refVersion.indexOf("build") +
214 "build".length() + 1,
215 refVersion.lastIndexOf(")"));
216
217 String expectedFullVersion = "fullversion:" + bStr;
218
219 Map<String, String> envMap = new HashMap<>();
220 envMap.put(TestHelper.JLDEBUG_KEY, "true");
221 TestHelper.TestResult tr = doExec(envMap, javaCmd, "-version");
222 List<String> alist = new ArrayList<>();
223 tr.testOutput.stream().map(String::trim).forEach(alist::add);
224
225 if (alist.contains(expectedFullVersion)) {
226 System.out.println("testInternalStrings passed");
227 return "";
228 } else {
229 System.out.println("Error: could not find " + expectedFullVersion);
230 tr.testOutput.forEach(System.out::println);
231 System.out.println("testInternalStrings failed");
232 return "testInternalStrings; ";
233 }
234 }
235
236 static String testDebugVersion() {
237 System.out.println("=== testInternalStrings === ");
238 String jdkType = System.getProperty("jdk.debug", "release");
239 String versionLines = getAllVersionLines(javaCmd, "-version");
240 if ("release".equals(jdkType)) {
241 jdkType = "";
242 } else {
243 jdkType = jdkType + " ";
244 }
245
246 String tofind = "(" + jdkType + "build";
247
248 int idx = versionLines.indexOf(tofind);
249 if (idx < 0) {
250 System.out.println("versionLines " + versionLines);
251 System.out.println("Did not find first instance of " + tofind);
252 return "testDebugVersion; ";
253 }
254 idx = versionLines.indexOf(tofind, idx + 1);
255 if (idx < 0) {
256 System.out.println("versionLines " + versionLines);
257 System.out.println("Did not find second instance of " + tofind);
258 return "testDebugVersion; ";
259 }
260 System.out.println("testDebugVersion passed");
261 return "";
262 }
263
264 // Initialize
265 static void init() {
266 refVersion = getVersion(javaCmd, "-version");
267 refFullVersion = getVersion(javaCmd, "-fullversion");
268 }
269
270 public static void main(String[] args) {
271 init();
272 String errorMessage = "";
273 errorMessage += testJVersionStrings();
274 errorMessage += testInternalStrings();
275 errorMessage += testToolVersion();
276 errorMessage += testDebugVersion();
277 if (errorMessage.isEmpty()) {
278 System.out.println("All Version string comparisons: PASS");
279 } else {
280 throw new AssertionError("VersionCheck failed: " + errorMessage);
281 }
282 }
283 }