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