1 /*
2  * Copyright (c) 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 /* @test TestWrongBarrierDisable
25  * @summary Test that disabling wrong barriers fails early
26  * @key gc
27  * @requires vm.gc.Shenandoah & !vm.graal.enabled
28  * @library /test/lib
29  * @run main/othervm 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 
main(String[] args)39     public static void main(String[] args) throws Exception {
40         String[] concurrent = {
41                 "ShenandoahLoadRefBarrier",
42                 "ShenandoahSATBBarrier",
43                 "ShenandoahCASBarrier",
44                 "ShenandoahCloneBarrier",
45         };
46         String[] iu = {
47                 "ShenandoahLoadRefBarrier",
48                 "ShenandoahIUBarrier",
49                 "ShenandoahCASBarrier",
50                 "ShenandoahCloneBarrier",
51         };
52 
53         shouldFailAll("-XX:ShenandoahGCHeuristics=adaptive",   concurrent);
54         shouldFailAll("-XX:ShenandoahGCHeuristics=static",     concurrent);
55         shouldFailAll("-XX:ShenandoahGCHeuristics=compact",    concurrent);
56         shouldFailAll("-XX:ShenandoahGCHeuristics=aggressive", concurrent);
57         shouldFailAll("-XX:ShenandoahGCMode=iu",               iu);
58         shouldPassAll("-XX:ShenandoahGCMode=passive",          concurrent);
59         shouldPassAll("-XX:ShenandoahGCMode=passive",          iu);
60     }
61 
shouldFailAll(String h, String[] barriers)62     private static void shouldFailAll(String h, String[] barriers) throws Exception {
63         for (String b : barriers) {
64             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
65                     "-Xmx128m",
66                     "-XX:+UnlockDiagnosticVMOptions",
67                     "-XX:+UnlockExperimentalVMOptions",
68                     "-XX:+UseShenandoahGC",
69                     h,
70                     "-XX:-" + b,
71                     "-version"
72             );
73             OutputAnalyzer output = new OutputAnalyzer(pb.start());
74             output.shouldNotHaveExitValue(0);
75             output.shouldContain("GC mode needs ");
76             output.shouldContain("to work correctly");
77         }
78     }
79 
shouldPassAll(String h, String[] barriers)80     private static void shouldPassAll(String h, String[] barriers) throws Exception {
81         for (String b : barriers) {
82             ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
83                     "-Xmx128m",
84                     "-XX:+UnlockDiagnosticVMOptions",
85                     "-XX:+UnlockExperimentalVMOptions",
86                     "-XX:+UseShenandoahGC",
87                     h,
88                     "-XX:-" + b,
89                     "-version"
90             );
91             OutputAnalyzer output = new OutputAnalyzer(pb.start());
92             output.shouldHaveExitValue(0);
93         }
94     }
95 
96 }
97