--- /dev/null 2012-10-30 13:53:25.609028996 -0400 +++ new/test/tools/launcher/profiles/VersionCheck.java 2013-01-18 01:41:04.736747701 -0500 @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8003256 + * @compile -XDignore.symbol.file VersionCheck.java + * @run main VersionCheck + * @summary Tests that "java -version" includes the name of the profile and that + * it matches the name in the release file + */ + +import java.nio.file.*; +import java.io.*; +import java.util.Properties; + +public class VersionCheck { + + static final String JAVA_HOME = System.getProperty("java.home"); + static final String OS_NAME = System.getProperty("os.name"); + static final String OS_ARCH = System.getProperty("os.arch"); + + static final String JAVA_CMD = + OS_NAME.startsWith("Windows") ? "java.exe" : "java"; + + static final boolean NEED_D64 = + OS_NAME.equals("SunOS") && + (OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64")); + + /** + * Returns {@code true} if the given class is present. + */ + static boolean isPresent(String cn) { + try { + Class.forName(cn); + return true; + } catch (ClassNotFoundException ignore) { + return false; + } + } + + /** + * Determines the profile by checking whether specific classes are present. + * Returns the empty string if this runtime does not appear to be a profile + * of Java SE. + */ + static String probeProfile() { + if (isPresent("java.awt.Window")) + return ""; + if (isPresent("java.lang.management.ManagementFactory")) + return "compact3"; + if (isPresent("java.sql.DriverManager")) + return "compact2"; + return "compact1"; + } + + /** + * Execs java with the given parameters. The method blocks until the + * process terminates. Returns a {@code ByteArrayOutputStream} with any + * stdout or stderr from the process. + */ + static ByteArrayOutputStream execJava(String... args) + throws IOException + { + StringBuilder sb = new StringBuilder(); + sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString()); + if (NEED_D64) + sb.append(" -d64"); + for (String arg: args) { + sb.append(' '); + sb.append(arg); + } + String[] cmd = sb.toString().split(" "); + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.redirectErrorStream(true); + Process p = pb.start(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int n; + do { + n = p.getInputStream().read(buf); + if (n > 0) + baos.write(buf, 0, n); + } while (n > 0); + try { + int exitCode = p.waitFor(); + if (exitCode != 0) + throw new RuntimeException("Exit code: " + exitCode); + } catch (InterruptedException e) { + throw new RuntimeException("Should not happen"); + } + return baos; + } + + public static void main(String[] args) throws IOException { + String reported = sun.misc.Version.profileName(); + String probed = probeProfile(); + if (!reported.equals(probed)) { + throw new RuntimeException("sun.misc.Version reports: " + reported + + ", but probing reports: " + probed); + } + + String profile = probed; + boolean isFullJre = (profile.length() == 0); + + // check that java -version includes "profile compactN" + String expected = "profile " + profile; + System.out.println("Checking java -version ..."); + ByteArrayOutputStream baos = execJava("-version"); + ByteArrayInputStream bain = new ByteArrayInputStream(baos.toByteArray()); + BufferedReader reader = new BufferedReader(new InputStreamReader(bain)); + boolean found = false; + String line; + while ((line = reader.readLine()) != null) { + if (line.contains(expected)) { + found = true; + break; + } + } + if (found && isFullJre) + throw new RuntimeException(expected + " found in java -version output"); + if (!found && !isFullJre) + throw new RuntimeException("java -version did not include " + expected); + + // check that the profile name matches the release file + System.out.println("Checking release file ..."); + Properties props = new Properties(); + + Path home = Paths.get(JAVA_HOME); + if (home.getFileName().toString().equals("jre")) + home = home.getParent(); + Path release = home.resolve("release"); + try (InputStream in = Files.newInputStream(release)) { + props.load(in); + } + String value = props.getProperty("JAVA_PROFILE"); + if (isFullJre) { + if (value != null) + throw new RuntimeException("JAVA_PROFILE should not be present"); + } else { + if (value == null) + throw new RuntimeException("JAVA_PROFILE not present in release file"); + if (!value.equals("\"" + profile + "\"")) + throw new RuntimeException("Unexpected value of JAVA_PROFILE: " + value); + } + + System.out.println("Test passed."); + } +}