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 /*
25  * @test TestClassUnloadingArguments
26  * @summary Test that loop mining arguments are sane
27  * @key gc
28  * @requires vm.gc.Shenandoah & !vm.graal.enabled
29  * @library /test/lib
30  * @run driver TestClassUnloadingArguments
31  */
32 
33 import java.util.*;
34 
35 import jdk.test.lib.Asserts;
36 import jdk.test.lib.process.ProcessTools;
37 import jdk.test.lib.process.OutputAnalyzer;
38 
39 public class TestClassUnloadingArguments {
40 
testWith(String msg, boolean cu, boolean cuConc, String... args)41     public static void testWith(String msg, boolean cu, boolean cuConc, String... args) throws Exception {
42         String[] cmds = Arrays.copyOf(args, args.length + 2);
43         cmds[args.length] = "-XX:+PrintFlagsFinal";
44         cmds[args.length + 1] = "-version";
45         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmds);
46         OutputAnalyzer output = new OutputAnalyzer(pb.start());
47         output.shouldHaveExitValue(0);
48         output.shouldContain("ClassUnloading");
49         output.shouldContain("ClassUnloadingWithConcurrentMark");
50 
51         Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloading.+?= (.+?) (.+?)", 2),
52                 Boolean.toString(cu),
53                 msg + ", but got wrong ClassUnloading");
54         Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloadingWithConcurrentMark.+?= (.+?) (.+?)", 2),
55                 Boolean.toString(cuConc),
56                 msg + ", but got wrong ClassUnloadingWithConcurrentMark");
57     }
58 
main(String[] args)59     public static void main(String[] args) throws Exception {
60         testDefaultGC();
61         testShenandoah();
62     }
63 
testDefaultGC()64     public static void testDefaultGC() throws Exception {
65         testWith("Default GC should have class unloading enabled",
66                 true, true);
67 
68         testWith("Default GC should disable everything",
69                 false, false,
70                 "-XX:-ClassUnloading");
71 
72         testWith("Default GC should disable conc unload",
73                 true, false,
74                 "-XX:-ClassUnloadingWithConcurrentMark");
75 
76         testWith("Default GC should not let conc unload to be enabled separately",
77                 false, false,
78                 "-XX:-ClassUnloading",
79                 "-XX:+ClassUnloadingWithConcurrentMark");
80     }
81 
testShenandoah()82     public static void testShenandoah() throws Exception {
83         testWith("Shenandoah GC should have class unloading enabled",
84                 true, false,
85                 "-XX:+UnlockExperimentalVMOptions",
86                 "-XX:+UseShenandoahGC");
87 
88         testWith("Shenandoah GC should disable everything",
89                 false, false,
90                 "-XX:+UnlockExperimentalVMOptions",
91                 "-XX:+UseShenandoahGC",
92                 "-XX:-ClassUnloading");
93 
94         testWith("Shenandoah GC should enable conc unload",
95                 true, true,
96                 "-XX:+UnlockExperimentalVMOptions",
97                 "-XX:+UseShenandoahGC",
98                 "-XX:+ClassUnloadingWithConcurrentMark");
99 
100         testWith("Shenandoah GC should not let conc unload to be enabled separately",
101                 false, false,
102                 "-XX:+UnlockExperimentalVMOptions",
103                 "-XX:+UseShenandoahGC",
104                 "-XX:-ClassUnloading",
105                 "-XX:+ClassUnloadingWithConcurrentMark");
106     }
107 
108 }
109