1 /*
  2  * Copyright (c) 2018, Red Hat, Inc. 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 
 25 /* @test
 26  * @summary Test that disabling wrong barriers fails early
 27  * @requires vm.gc.Shenandoah
 28  * @library /test/lib
 29  * @run driver TestWrongBarrierDisable
 30  */
 31 
 32 import java.util.*;
 33 
 34 import jdk.test.lib.process.ProcessTools;
 35 import jdk.test.lib.process.OutputAnalyzer;
 36 
 37 public class TestWrongBarrierDisable {
 38 
 39     public static void main(String[] args) throws Exception {
 40         String[] concurrent = {
 41                 "ShenandoahLoadRefBarrier",
 42                 "ShenandoahSATBBarrier",
 43                 "ShenandoahCASBarrier",
 44                 "ShenandoahCloneBarrier",
 45                 "ShenandoahStackWatermarkBarrier",
 46         };
 47         String[] iu = {
 48                 "ShenandoahLoadRefBarrier",
 49                 "ShenandoahIUBarrier",
 50                 "ShenandoahCASBarrier",
 51                 "ShenandoahCloneBarrier",
 52                 "ShenandoahStackWatermarkBarrier",
 53         };
 54 
 55         String[] generational = {
 56                 "ShenandoahCardBarrier"
 57         };
 58 
 59         shouldFailAll("-XX:ShenandoahGCHeuristics=adaptive",   concurrent);
 60         shouldFailAll("-XX:ShenandoahGCHeuristics=static",     concurrent);
 61         shouldFailAll("-XX:ShenandoahGCHeuristics=compact",    concurrent);
 62         shouldFailAll("-XX:ShenandoahGCHeuristics=aggressive", concurrent);
 63         shouldFailAll("-XX:ShenandoahGCMode=iu",               iu);
 64         shouldPassAll("-XX:ShenandoahGCMode=passive",          concurrent);
 65         shouldPassAll("-XX:ShenandoahGCMode=passive",          iu);
 66         shouldPassAll("-XX:ShenandoahGCMode=passive",          generational);
 67         shouldPassAll("-XX:ShenandoahGCMode=satb",             generational);
 68         shouldFailAll("-XX:ShenandoahGCMode=generational",     generational);
 69     }
 70 
 71     private static void shouldFailAll(String h, String[] barriers) throws Exception {
 72         for (String b : barriers) {
 73             OutputAnalyzer output = ProcessTools.executeLimitedTestJava(
 74                     "-Xmx128m",
 75                     "-XX:+UnlockDiagnosticVMOptions",
 76                     "-XX:+UnlockExperimentalVMOptions",
 77                     "-XX:+UseShenandoahGC",
 78                     h,
 79                     "-XX:-" + b,
 80                     "-version"
 81             );
 82             output.shouldNotHaveExitValue(0);
 83             output.shouldContain("GC mode needs ");
 84             output.shouldContain("to work correctly");
 85         }
 86     }
 87 
 88     private static void shouldPassAll(String h, String[] barriers) throws Exception {
 89         for (String b : barriers) {
 90             OutputAnalyzer output = ProcessTools.executeLimitedTestJava(
 91                     "-Xmx128m",
 92                     "-XX:+UnlockDiagnosticVMOptions",
 93                     "-XX:+UnlockExperimentalVMOptions",
 94                     "-XX:+UseShenandoahGC",
 95                     h,
 96                     "-XX:-" + b,
 97                     "-version"
 98             );
 99             output.shouldHaveExitValue(0);
100         }
101     }
102 
103 }