1 /*
   2  * Copyright (c) 2016, 2018, Red Hat, Inc. All rights reserved.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.
   7  *
   8  * This code is distributed in the hope that it will be useful, but WITHOUT
   9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11  * version 2 for more details (a copy is included in the LICENSE file that
  12  * accompanied this code).
  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  23 
  24 /*
  25  * @test TestRegionSizeArgs
  26  * @summary Test that Shenandoah region size args are checked
  27  * @key gc
  28  * @library /test/lib
  29  * @modules java.base/jdk.internal.misc
  30  *          java.management
  31  * @run driver TestRegionSizeArgs
  32  */
  33 
  34 import jdk.test.lib.process.ProcessTools;
  35 import jdk.test.lib.process.OutputAnalyzer;
  36 
  37 public class TestRegionSizeArgs {
  38     public static void main(String[] args) throws Exception {
  39         testInvalidRegionSizes();
  40         testMinRegionSize();
  41         testMaxRegionSize();
  42     }
  43 
  44     private static void testInvalidRegionSizes() throws Exception {
  45 
  46         {
  47             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
  48                                                                       "-XX:+UseShenandoahGC",
  49                                                                       "-Xms2m",
  50                                                                       "-Xmx1g",
  51                                                                       "-version");
  52             OutputAnalyzer output = new OutputAnalyzer(pb.start());
  53             output.shouldMatch("Initial heap size");
  54             output.shouldHaveExitValue(1);
  55         }
  56 
  57         {
  58             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
  59                                                                       "-XX:+UseShenandoahGC",
  60                                                                       "-Xms4m",
  61                                                                       "-Xmx1g",
  62                                                                       "-version");
  63             OutputAnalyzer output = new OutputAnalyzer(pb.start());
  64             output.shouldHaveExitValue(0);
  65         }
  66 
  67         {
  68             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
  69                                                                       "-XX:+UseShenandoahGC",
  70                                                                       "-Xms8m",
  71                                                                       "-Xmx1g",
  72                                                                       "-version");
  73             OutputAnalyzer output = new OutputAnalyzer(pb.start());
  74             output.shouldHaveExitValue(0);
  75         }
  76 
  77         {
  78             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
  79                                                                       "-XX:+UseShenandoahGC",
  80                                                                       "-Xms100m",
  81                                                                       "-Xmx1g",
  82                                                                       "-XX:ShenandoahHeapRegionSize=200m",
  83                                                                       "-version");
  84             OutputAnalyzer output = new OutputAnalyzer(pb.start());
  85             output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option");
  86             output.shouldHaveExitValue(1);
  87         }
  88 
  89         {
  90             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
  91                                                                       "-XX:+UseShenandoahGC",
  92                                                                       "-Xms100m",
  93                                                                       "-Xmx1g",
  94                                                                       "-XX:ShenandoahHeapRegionSize=11m",
  95                                                                       "-version");
  96             OutputAnalyzer output = new OutputAnalyzer(pb.start());
  97             output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option");
  98             output.shouldHaveExitValue(1);
  99         }
 100 
 101         {
 102             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 103                                                                       "-XX:+UseShenandoahGC",
 104                                                                       "-Xms100m",
 105                                                                       "-Xmx1g",
 106                                                                       "-XX:ShenandoahHeapRegionSize=9m",
 107                                                                       "-version");
 108             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 109             output.shouldHaveExitValue(0);
 110         }
 111 
 112         {
 113             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 114                                                                       "-XX:+UseShenandoahGC",
 115                                                                       "-Xms100m",
 116                                                                       "-Xmx1g",
 117                                                                       "-XX:ShenandoahHeapRegionSize=255K",
 118                                                                       "-version");
 119             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 120             output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option");
 121             output.shouldHaveExitValue(1);
 122         }
 123 
 124         {
 125             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 126                                                                       "-XX:+UseShenandoahGC",
 127                                                                       "-Xms100m",
 128                                                                       "-Xmx1g",
 129                                                                       "-XX:ShenandoahHeapRegionSize=260K",
 130                                                                       "-version");
 131             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 132             output.shouldHaveExitValue(0);
 133         }
 134 
 135         {
 136             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 137                                                                       "-XX:+UseShenandoahGC",
 138                                                                       "-Xms1g",
 139                                                                       "-Xmx1g",
 140                                                                       "-XX:ShenandoahHeapRegionSize=32M",
 141                                                                       "-version");
 142             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 143             output.shouldHaveExitValue(0);
 144         }
 145 
 146         {
 147             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 148                                                                       "-XX:+UseShenandoahGC",
 149                                                                       "-Xms1g",
 150                                                                       "-Xmx1g",
 151                                                                       "-XX:ShenandoahHeapRegionSize=64M",
 152                                                                       "-version");
 153             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 154             output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option");
 155             output.shouldHaveExitValue(1);
 156         }
 157 
 158         {
 159             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 160                                                                       "-XX:+UseShenandoahGC",
 161                                                                       "-Xms1g",
 162                                                                       "-Xmx1g",
 163                                                                       "-XX:ShenandoahHeapRegionSize=256K",
 164                                                                       "-version");
 165             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 166             output.shouldHaveExitValue(0);
 167         }
 168 
 169         {
 170             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 171                                                                       "-XX:+UseShenandoahGC",
 172                                                                       "-Xms1g",
 173                                                                       "-Xmx1g",
 174                                                                       "-XX:ShenandoahHeapRegionSize=128K",
 175                                                                       "-version");
 176             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 177             output.shouldMatch("Invalid -XX:ShenandoahHeapRegionSize option");
 178             output.shouldHaveExitValue(1);
 179         }
 180     }
 181 
 182     private static void testMinRegionSize() throws Exception {
 183 
 184         {
 185             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 186                                                                       "-XX:+UseShenandoahGC",
 187                                                                       "-Xms100m",
 188                                                                       "-Xmx1g",
 189                                                                       "-XX:ShenandoahMinRegionSize=255K",
 190                                                                       "-version");
 191             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 192             output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option");
 193             output.shouldHaveExitValue(1);
 194         }
 195 
 196         {
 197             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 198                                                                       "-XX:+UseShenandoahGC",
 199                                                                       "-Xms100m",
 200                                                                       "-Xmx1g",
 201                                                                       "-XX:ShenandoahMinRegionSize=1M",
 202                                                                       "-XX:ShenandoahMaxRegionSize=260K",
 203                                                                       "-version");
 204             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 205             output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize");
 206             output.shouldHaveExitValue(1);
 207         }
 208         {
 209             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 210                                                                       "-XX:+UseShenandoahGC",
 211                                                                       "-Xms100m",
 212                                                                       "-Xmx1g",
 213                                                                       "-XX:ShenandoahMinRegionSize=200m",
 214                                                                       "-version");
 215             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 216             output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option");
 217             output.shouldHaveExitValue(1);
 218         }
 219 
 220         {
 221             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 222                                                                       "-XX:+UseShenandoahGC",
 223                                                                       "-Xms100m",
 224                                                                       "-Xmx1g",
 225                                                                       "-XX:ShenandoahMinRegionSize=11m",
 226                                                                       "-version");
 227             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 228             output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize option");
 229             output.shouldHaveExitValue(1);
 230         }
 231 
 232         {
 233             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 234                                                                       "-XX:+UseShenandoahGC",
 235                                                                       "-Xms100m",
 236                                                                       "-Xmx1g",
 237                                                                       "-XX:ShenandoahMinRegionSize=9m",
 238                                                                       "-version");
 239             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 240             output.shouldHaveExitValue(0);
 241         }
 242 
 243     }
 244 
 245     private static void testMaxRegionSize() throws Exception {
 246 
 247         {
 248             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 249                                                                       "-XX:+UseShenandoahGC",
 250                                                                       "-Xms100m",
 251                                                                       "-Xmx1g",
 252                                                                       "-XX:ShenandoahMaxRegionSize=255K",
 253                                                                       "-version");
 254             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 255             output.shouldMatch("Invalid -XX:ShenandoahMaxRegionSize option");
 256             output.shouldHaveExitValue(1);
 257         }
 258 
 259         {
 260             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UnlockExperimentalVMOptions",
 261                                                                       "-XX:+UseShenandoahGC",
 262                                                                       "-Xms100m",
 263                                                                       "-Xmx1g",
 264                                                                       "-XX:ShenandoahMinRegionSize=1M",
 265                                                                       "-XX:ShenandoahMaxRegionSize=260K",
 266                                                                       "-version");
 267             OutputAnalyzer output = new OutputAnalyzer(pb.start());
 268             output.shouldMatch("Invalid -XX:ShenandoahMinRegionSize or -XX:ShenandoahMaxRegionSize");
 269             output.shouldHaveExitValue(1);
 270         }
 271     }
 272 }