1 /*
   2  * Copyright (c) 2015, 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 import jdk.test.lib.*;
  25 
  26 /*
  27  * @test
  28  * @bug 8129855
  29  * @summary -XX:+IgnoreUnrecognizedVMOptions should work according to the spec from JDK-8129855
  30  *
  31  * @library /testlibrary
  32  * @modules java.base/jdk.internal.misc
  33  *          java.management
  34  * @run main IgnoreUnrecognizedVMOptions
  35  */
  36 public class IgnoreUnrecognizedVMOptions {
  37 
  38   private static void runJavaAndCheckExitValue(boolean shouldSucceed, String... args) throws Exception {
  39     ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args);
  40     OutputAnalyzer output = new OutputAnalyzer(pb.start());
  41     if (shouldSucceed) {
  42       output.shouldHaveExitValue(0);
  43     } else {
  44       output.shouldHaveExitValue(1);
  45     }
  46   }
  47 
  48   public static void main(String[] args) throws Exception {
  49     boolean product = !Platform.isDebugBuild();
  50 
  51     /*
  52       #1.1 wrong value and non-existing flag:
  53                                     exists, invalid value           does not exist
  54                                     -XX:MinHeapFreeRatio=notnum     -XX:THIS_FLAG_DOESNT_EXIST
  55       -IgnoreUnrecognizedVMOptions               ERR                           ERR
  56       +IgnoreUnrecognizedVMOptions               ERR                           OK
  57     */
  58     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:MinHeapFreeRatio=notnum", "-version");
  59     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:THIS_FLAG_DOESNT_EXIST", "-version");
  60     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:MinHeapFreeRatio=notnum", "-version");
  61     runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:THIS_FLAG_DOESNT_EXIST", "-version");
  62 
  63     /*
  64       #1.2 normal flag with ranges:
  65                                       exists, in range                exists, out of range
  66                                       -XX:StackRedPages=1             -XX:StackRedPages=0
  67       -IgnoreUnrecognizedVMOptions               OK                            ERR
  68       +IgnoreUnrecognizedVMOptions               OK                            ERR
  69     */
  70     runJavaAndCheckExitValue(true, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:StackRedPages=1", "-version");
  71     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:StackRedPages=0", "-version");
  72     runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:StackRedPages=1", "-version");
  73     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:StackRedPages=0", "-version");
  74 
  75     /*
  76       #1.3 develop & notproduct flag on debug VM:
  77                                       develop & !product_build        notproduct & !product_build
  78                                       -XX:+DeoptimizeALot             -XX:+VerifyCodeCache
  79       -IgnoreUnrecognizedVMOptions               OK                            OK
  80       +IgnoreUnrecognizedVMOptions               OK                            OK
  81     */
  82     if (!product) {
  83       runJavaAndCheckExitValue(true, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+DeoptimizeALot", "-version");
  84       runJavaAndCheckExitValue(true, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+VerifyCodeCache", "-version");
  85       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+DeoptimizeALot", "-version");
  86       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+VerifyCodeCache", "-version");
  87     }
  88 
  89     /*
  90       #1.4 develop & notproduct flag on product VM:
  91                                     develop & !product_build           notproduct & product_build
  92                                     -XX:+DeoptimizeALot                -XX:+VerifyCodeCache
  93       -IgnoreUnrecognizedVMOptions               ERR                           ERR
  94       +IgnoreUnrecognizedVMOptions               OK                            OK
  95     */
  96     if (product) {
  97       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+DeoptimizeALot", "-version");
  98       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+VerifyCodeCache", "-version");
  99       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+DeoptimizeALot", "-version");
 100       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+VerifyCodeCache", "-version");
 101     }
 102 
 103 
 104     /*
 105       #1.5 malformed develop & notproduct flag on debug VM:
 106                                   develop & !product_build             notproduct & !product_build
 107                                   -XX:DeoptimizeALot                   -XX:VerifyCodeCache
 108       -IgnoreUnrecognizedVMOptions               ERR                           ERR
 109       +IgnoreUnrecognizedVMOptions               ERR                           ERR
 110     */
 111     if (!product) {
 112       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:DeoptimizeALot", "-version");
 113       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:VerifyCodeCache", "-version");
 114       runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:DeoptimizeALot", "-version");
 115       runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:VerifyCodeCache", "-version");
 116     }
 117 
 118     /*
 119       #1.6 malformed develop & notproduct flag on product VM:
 120                                     develop & !product_build           notproduct & product_build
 121                                     -XX:DeoptimizeALot                 -XX:VerifyCodeCache
 122       -IgnoreUnrecognizedVMOptions               ERR                           ERR
 123       +IgnoreUnrecognizedVMOptions               OK                            OK
 124     */
 125     if (product) {
 126       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:DeoptimizeALot", "-version");
 127       runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:VerifyCodeCache", "-version");
 128       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:DeoptimizeALot", "-version");
 129       runJavaAndCheckExitValue(true, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:VerifyCodeCache", "-version");
 130     }
 131 
 132     /*
 133       #1.7 locked flag:
 134                                       diagnostic & locked             experimental & locked
 135                                       -XX:-UnlockDiagnosticVMOptions  -XX:-UnlockExperimentalVMOptions
 136                                       -XX:+PrintInlining              -XX:+AlwaysSafeConstructors
 137       -IgnoreUnrecognizedVMOptions               ERR                           ERR
 138       +IgnoreUnrecognizedVMOptions               ERR                           ERR
 139     */
 140     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:-UnlockDiagnosticVMOptions", "-XX:+PrintInlining", "-version");
 141     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:-UnlockExperimentalVMOptions", "-XX:+AlwaysSafeConstructors", "-version");
 142     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-UnlockDiagnosticVMOptions", "-XX:+PrintInlining", "-version");
 143     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-UnlockExperimentalVMOptions", "-XX:+AlwaysSafeConstructors", "-version");
 144 
 145     /*
 146       #1.8 malformed locked flag:
 147                                     diagnostic & locked             experimental & locked
 148                                     -XX:-UnlockDiagnosticVMOptions  -XX:-UnlockExperimentalVMOptions
 149                                     -XX:PrintInlining               -XX:AlwaysSafeConstructors
 150       -IgnoreUnrecognizedVMOptions               ERR                           ERR
 151       +IgnoreUnrecognizedVMOptions               ERR                           ERR
 152     */
 153     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:-UnlockDiagnosticVMOptions", "-XX:PrintInlining", "-version");
 154     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:-UnlockExperimentalVMOptions", "-XX:AlwaysSafeConstructors", "-version");
 155     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-UnlockDiagnosticVMOptions", "-XX:PrintInlining", "-version");
 156     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-UnlockExperimentalVMOptions", "-XX:AlwaysSafeConstructors", "-version");
 157 
 158     /*
 159       #1.9 malformed unlocked flag:
 160                                     diagnostic & locked             experimental & locked
 161                                     -XX:+UnlockDiagnosticVMOptions  -XX:+UnlockExperimentalVMOptions
 162                                     -XX:PrintInlining               -XX:AlwaysSafeConstructors
 163       -IgnoreUnrecognizedVMOptions               ERR                           ERR
 164       +IgnoreUnrecognizedVMOptions               ERR                           ERR
 165     */
 166     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+UnlockDiagnosticVMOptions", "-XX:PrintInlining", "-version");
 167     runJavaAndCheckExitValue(false, "-XX:-IgnoreUnrecognizedVMOptions", "-XX:+UnlockExperimentalVMOptions", "-XX:AlwaysSafeConstructors", "-version");
 168     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+UnlockDiagnosticVMOptions", "-XX:PrintInlining", "-version");
 169     runJavaAndCheckExitValue(false, "-XX:+IgnoreUnrecognizedVMOptions", "-XX:+UnlockExperimentalVMOptions", "-XX:AlwaysSafeConstructors", "-version");
 170   }
 171 }