jdk/test/java/lang/System/Versions.java
changeset 2 90ce3da70b43
child 689 10d8df51c03a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/Versions.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2004-2005 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4989690 6259855
+ * @summary Check that version-related system property invariants hold.
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.net.URLClassLoader;
+import java.net.URL;
+
+public class Versions {
+    static String getProperty(String prop) throws Exception {
+        String value = System.getProperty(prop);
+        if (value == null)
+            throw new Exception("No such system property: " + prop);
+        System.out.printf("%s=%s%n", prop, value);
+        return value;
+    }
+
+    static ClassLoader cl;
+
+    static void checkClassVersion(int major, int minor, boolean expectSupported)
+        throws Exception
+    {
+        final String className  = "ClassVersionTest";
+        final String classFile  = className + ".class";
+
+        // We create an invalid class file, (only magic and version info),
+        // but the version info must be checked before the body.
+        final DataOutputStream dos =
+            new DataOutputStream(new FileOutputStream(classFile));
+        dos.writeLong((0xCafeBabel << 32) + (minor << 16) + major);
+        dos.close();
+
+        boolean supported = true;
+        try {
+            Class.forName(className, false, cl);
+        } catch (UnsupportedClassVersionError e) {
+            supported = false;
+        } catch (Throwable t) {
+            // We expect an Exception indicating invalid class file
+        }
+        new File(classFile).delete();
+        if (supported != expectSupported)
+            throw new Exception("Forgot to update java.class.version?");
+    }
+
+    public static void main(String [] args) throws Exception {
+        String classVersion   = getProperty("java.class.version");
+        String javaVersion    = getProperty("java.version");
+        String VMVersion      = getProperty("java.vm.version");
+        String runtimeVersion = getProperty("java.runtime.version");
+        String specVersion    = getProperty("java.specification.version");
+
+        if (! (javaVersion.startsWith(specVersion) &&
+               runtimeVersion.startsWith(specVersion)))
+            throw new Exception("Invalid version-related system properties");
+
+        //----------------------------------------------------------------
+        // Check that java.class.version is correct.
+        // Injecting a larger major or minor version number into a
+        // .class file should result in UnsupportedClassVersionError.
+        //----------------------------------------------------------------
+        String[] versions = classVersion.split("\\.");
+        int majorVersion = Integer.parseInt(versions[0]);
+        int minorVersion = Integer.parseInt(versions[1]);
+        System.out.printf("majorVersion=%s%n",majorVersion);
+        System.out.printf("minorVersion=%s%n",minorVersion);
+
+        // Look in ".", and *not* in CLASSPATH
+        cl = new URLClassLoader(new URL[]{new File("./").toURL()}, null);
+
+        checkClassVersion(majorVersion    , minorVersion    , true );
+        checkClassVersion(majorVersion + 1, minorVersion    , false);
+        checkClassVersion(majorVersion    , minorVersion + 1, false);
+    }
+}