test/jdk/java/lang/Runtime/Version/Basic.java
changeset 47216 71c04702a3d5
parent 44785 62a18e20f5c1
child 48327 d2a837cf9ff1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/lang/Runtime/Version/Basic.java	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 2015, 2017, 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
+ * @summary Unit test for java.lang.Runtime.Version
+ * @bug 8072379 8144062 8161236 8160956
+ */
+
+import java.lang.Runtime.Version;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static java.lang.System.out;
+
+public class Basic {
+    private static final Class<? extends Throwable> IAE
+        = IllegalArgumentException.class;
+    private static final Class<? extends Throwable> NPE
+        = NullPointerException.class;
+    private static final Class<? extends Throwable> NFE
+        = NumberFormatException.class;
+
+    private static final BigInteger TOO_BIG
+        = (BigInteger.valueOf(Integer.MAX_VALUE)).add(BigInteger.ONE);
+    private static final String TOO_BIG_STR = TOO_BIG.toString();
+
+    public static void main(String ... args) {
+
+        //// Tests for parse(), major(), minor(), security(), pre(),
+        //// build(), optional(), version(), toString()
+        //   v                          M     m sec pre bld opt
+
+        // $VNUM
+        test("9",                       9,    0, 0, "", 0, "");
+        test("9.1",                     9,    1, 0, "", 0, "");
+        test("9.0.1",                   9,    0, 1, "", 0, "");
+        test("404.1.2",                 404,  1, 2, "", 0, "");
+        test("9.1.2.3",                 9,    1, 2, "", 0, "");
+        test("1000.0.0.0.0.0.99999999", 1000, 0, 0, "", 0, "");
+
+        tryCatch(null,    NPE);
+        tryCatch("",      IAE);
+        tryCatch("foo",   IAE);
+        tryCatch("7a",    IAE);
+        tryCatch("0",     IAE);
+        tryCatch("09",    IAE);
+        tryCatch("9.0",   IAE);
+        tryCatch("9.0.",  IAE);
+        tryCatch("1.9,1", IAE);
+        tryCatch(TOO_BIG_STR, NFE);
+
+        // $PRE
+        test("9-ea",       9, 0, 0, "ea",       0, "");
+        test("9-internal", 9, 0, 0, "internal", 0, "");
+        test("9-0",        9, 0, 0, "0",        0, "");
+        test("9.2.7-8",    9, 2, 7, "8",        0, "");
+        test("1-ALL",      1, 0, 0, "ALL",      0, "");
+        test("2.3.4.5-1a", 2, 3, 4, "1a",       0, "");
+        test("1-" + TOO_BIG_STR, 1, 0, 0, TOO_BIG_STR, 0, "");
+
+        tryCatch("9:-ea",     IAE);
+        tryCatch("3.14159-",  IAE);
+        tryCatch("3.14159-%", IAE);
+
+        // $BUILD
+        test("9+0",            9, 0,  0,  "",      0,       "");
+        test("3.14+9999900",   3, 14, 0,  "",      9999900, "");
+        test("9-pre+105",      9, 0,  0,  "pre",   105,     "");
+        test("6.0.42-8beta+4", 6, 0,  42, "8beta", 4,       "");
+
+        tryCatch("9+",     IAE);
+        tryCatch("7+a",    IAE);
+        tryCatch("9+00",   IAE);
+        tryCatch("4.2+01", IAE);
+        tryCatch("4.2+1a", IAE);
+        tryCatch("1+" + TOO_BIG_STR, NFE);
+
+        // $OPT
+        test("9+-foo",          9,   0, 0, "",       0,  "foo");
+        test("9-pre-opt",       9,   0, 0, "pre",    0,  "opt");
+        test("42+---bar",       42,  0, 0, "",       0,  "--bar");
+        test("2.91+-8061493-",  2,  91, 0, "",       0,  "8061493-");
+        test("24+-foo.bar",     24,  0, 0, "",       0,  "foo.bar");
+        test("9-ribbit+17-...", 9,   0, 0, "ribbit", 17, "...");
+        test("7+1-" + TOO_BIG_STR, 7,0, 0, "",       1,  TOO_BIG_STR);
+
+        tryCatch("9-pre+-opt", IAE);
+        tryCatch("1.4142+-",   IAE);
+        tryCatch("2.9979+-%",  IAE);
+
+        //// Test for Runtime.version()
+        testVersion();
+
+        //// Test for equals{IgnoreOptional}?(), hashCode(),
+        //// compareTo{IgnoreOptional}?()
+        // compare: after "<" == -1, equal == 0, before ">" == 1
+        //      v0            v1                  eq     eqNO  cmp  cmpNO
+        testEHC("9",          "9",                true,  true,   0,    0);
+
+        testEHC("8",          "9",                false, false, -1,   -1);
+        testEHC("9",          "10",               false, false, -1,   -1);
+        testEHC("9",          "8",                false, false,  1,    1);
+
+        testEHC("10.512.1",   "10.512.2",         false, false, -1,   -1);
+        testEHC("512.10.1",   "512.11.1",         false, false, -1,   -1);
+
+        // $OPT comparison
+        testEHC("9",          "9+-oink",          false, true,  -1,    0);
+        testEHC("9+-ribbit",  "9+-moo",           false, true,   1,    0);
+        testEHC("9-quack+3-ribbit",
+                              "9-quack+3-moo",    false, true,   1,    0);
+        testEHC("9.1+7",      "9.1+7-moo-baa-la", false, true,  -1,    0);
+
+        // numeric vs. non-numeric $PRE
+        testEHC("9.1.1.2-2a", "9.1.1.2-12",       false, false,  1,    1);
+        testEHC("9.1.1.2-12", "9.1.1.2-4",        false, false,  1,    1);
+
+        testEHC("27.16",      "27.16+120",        false, false, -1,   -1);
+        testEHC("10",         "10-ea",            false, false,  1,    1);
+        testEHC("10.1+1",     "10.1-ea+1",        false, false,  1,    1);
+        testEHC("10.0.1+22",  "10.0.1+21",        false, false,  1,    1);
+
+        // numeric vs. non-numeric $PRE
+        testEHC("9.1.1.2-12", "9.1.1.2-a2",       false, false, -1,   -1);
+        testEHC("9.1.1.2-1",  "9.1.1.2-4",        false, false, -1,   -1);
+
+        testEHC("9-internal", "9",                false, false, -1,   -1);
+        testEHC("9-ea+120",   "9+120",            false, false, -1,   -1);
+        testEHC("9-ea+120",   "9+120",            false, false, -1,   -1);
+        testEHC("9+101",      "9",                false, false,  1,    1);
+        testEHC("9+101",      "9+102",            false, false, -1,   -1);
+        testEHC("1.9-ea",     "9-ea",             false, false, -1,   -1);
+
+        if (fail != 0)
+            throw new RuntimeException((fail + pass) + " tests: "
+                                       + fail + " failure(s), first", first);
+        else
+            out.println("all " + (fail + pass) + " tests passed");
+
+    }
+
+    private static void test(String s, Integer major, Integer minor,
+                             Integer sec, String pre, Integer build,
+                             String opt)
+    {
+        Version v = testParse(s);
+
+        testStr(v.toString(), s);
+
+        testInt(v.major(), major);
+        testInt(v.minor(), minor);
+        testInt(v.security(), sec);
+        testStr((v.pre().isPresent() ? v.pre().get() : ""), pre);
+        testInt((v.build().isPresent() ? v.build().get() : 0), build);
+        testStr((v.optional().isPresent() ? v.optional().get() : ""), opt);
+
+        testVersion(v.version(), s);
+    }
+
+    private static Version testParse(String s) {
+        Version v = Version.parse(s);
+        pass();
+        return v;
+    }
+
+    private static void testInt(int got, int exp) {
+        if (got != exp) {
+            fail("testInt()", Integer.toString(exp), Integer.toString(got));
+        } else {
+            pass();
+        }
+     }
+
+    private static void testStr(String got, String exp) {
+        if (!got.equals(exp)) {
+            fail("testStr()", exp, got);
+        } else {
+            pass();
+        }
+    }
+
+    private static void tryCatch(String s, Class<? extends Throwable> ex) {
+        Throwable t = null;
+        try {
+            Version.parse(s);
+        } catch (Throwable x) {
+            if (ex.isAssignableFrom(x.getClass())) {
+                t = x;
+            } else
+                x.printStackTrace();
+        }
+        if ((t == null) && (ex != null))
+            fail(s, ex);
+        else
+            pass();
+    }
+
+    private static void testVersion() {
+        Version current = Runtime.version();
+        String javaVer = System.getProperty("java.runtime.version");
+
+        // java.runtime.version == $VNUM(\-$PRE)?(\+$BUILD)?(-$OPT)?
+        String [] jv  = javaVer.split("\\+");
+        String [] ver = jv[0].split("-");
+        List<Integer> javaVerVNum
+            = Arrays.stream(ver[0].split("\\."))
+            .map(Integer::parseInt)
+            .collect(Collectors.toList());
+        if (!javaVerVNum.equals(current.version())) {
+            fail("Runtime.version()", javaVerVNum.toString(),
+                 current.version().toString());
+        } else {
+            pass();
+        }
+
+        Optional<String> javaVerPre
+            = (ver.length == 2)
+            ? Optional.ofNullable(ver[1])
+            : Optional.empty();
+        if (!javaVerPre.equals(current.pre())) {
+            fail("testCurrent() pre()", javaVerPre.toString(),
+                 current.pre().toString());
+        } else {
+            pass();
+        }
+
+        testEHC(current.toString(), javaVer, true, true, 0, 0);
+    }
+
+    private static void testVersion(List<Integer> vnum, String s) {
+        List<Integer> svnum = new ArrayList<>();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < s.length(); i++) {
+            Character c = s.charAt(i);
+            if (Character.isDigit(c)) {
+                sb.append(c);
+            } else {
+                svnum.add(Integer.parseInt(sb.toString()));
+                sb = new StringBuilder();
+                if (c == '+' || c == '-') {
+                    break;
+                }
+            }
+        }
+        if (sb.length() > 0) {
+            svnum.add(Integer.parseInt(sb.toString()));
+        }
+
+        if (!svnum.equals(vnum)) {
+            fail("testVersion() equals()", svnum.toString(), vnum.toString());
+        } else {
+            pass();
+        }
+    }
+
+    private static void testEHC(String s0, String s1, boolean eq, boolean eqNO,
+                                int cmp, int cmpNO)
+    {
+        Version v0 = Version.parse(s0);
+        Version v1 = Version.parse(s1);
+
+        testEquals(v0, v1, eq);
+        testEqualsNO(v0, v1, eqNO);
+
+        testHashCode(v0, v1, eq);
+
+        testCompare(v0, v1, cmp);
+        testCompareNO(v0, v1, cmpNO);
+    }
+
+    private static void testEqualsNO(Version v0, Version v1, boolean eq) {
+        if (eq == v0.equalsIgnoreOptional(v1)) {
+            pass();
+        } else {
+            fail("equalsIgnoreOptional() " + Boolean.toString(eq),
+                 v0.toString(), v1.toString());
+        }
+    }
+
+    private static void testEquals(Version v0, Version v1, boolean eq) {
+        if (eq == v0.equals(v1)) {
+            pass();
+        } else {
+            fail("equals() " + Boolean.toString(eq),
+                 v0.toString(), v1.toString());
+        }
+    }
+
+    private static void testHashCode(Version v0, Version v1, boolean eq) {
+        int h0 = v0.hashCode();
+        int h1 = v1.hashCode();
+        if (eq) {
+            testInt(h0, h1);
+        } else if (h0 == h1) {
+            fail(String.format("hashCode() %s", h0),
+                 Integer.toString(h0),
+                 Integer.toString(h1));
+        } else { // !eq && (h0 != h1)
+            pass();
+        }
+    }
+
+    private static void testCompareNO(Version v0, Version v1, int compare) {
+        int cmp = v0.compareToIgnoreOptional(v1);
+        checkCompare(v0, v1, compare, cmp);
+    }
+
+    private static void testCompare(Version v0, Version v1, int compare) {
+        int cmp = v0.compareTo(v1);
+        checkCompare(v0, v1, compare, cmp);
+    }
+
+    private static void checkCompare(Version v0, Version v1,
+                                     int expected, int actual)
+    {
+        if (Integer.signum(expected) == Integer.signum(actual)) {
+            pass();
+        } else {
+            fail(String.format("compare() (actual = %s) (expected = %s)",
+                               actual, expected),
+                 v0.toString(), v1.toString());
+        }
+    }
+
+    private static int fail = 0;
+    private static int pass = 0;
+
+    private static Throwable first;
+
+    static void pass() {
+        pass++;
+    }
+
+    static void fail(String fs, Class ex) {
+        String s = "'" + fs + "'";
+        if (ex != null)
+            s += ": " + ex.getName() + " not thrown";
+        if (first == null)
+            setFirst(s);
+        System.err.println("FAILED: " + s);
+        fail++;
+    }
+
+    static void fail(String t, String exp, String got) {
+        String s = t + ": Expected '" + exp + "', got '" + got + "'";
+        if (first == null)
+            setFirst(s);
+        System.err.println("FAILED: " + s);
+        fail++;
+     }
+
+    private static void setFirst(String s) {
+        try {
+            throw new RuntimeException(s);
+        } catch (RuntimeException x) {
+            first = x;
+        }
+    }
+}