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 + 3);
43         cmds[args.length] = "-Xmx128m";
44         cmds[args.length + 1] = "-XX:+PrintFlagsFinal";
45         cmds[args.length + 2] = "-version";
46         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(cmds);
47         OutputAnalyzer output = new OutputAnalyzer(pb.start());
48         output.shouldHaveExitValue(0);
49         output.shouldContain("ClassUnloading");
50         output.shouldContain("ClassUnloadingWithConcurrentMark");
51 
52         Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloading.+?= (.+?) (.+?)", 2),
53                 Boolean.toString(cu),
54                 msg + ", but got wrong ClassUnloading");
55         Asserts.assertEQ(output.firstMatch("(.+?) ClassUnloadingWithConcurrentMark.+?= (.+?) (.+?)", 2),
56                 Boolean.toString(cuConc),
57                 msg + ", but got wrong ClassUnloadingWithConcurrentMark");
58     }
59 
main(String[] args)60     public static void main(String[] args) throws Exception {
61         testDefaultGC();
62         testShenandoah();
63     }
64 
testDefaultGC()65     public static void testDefaultGC() throws Exception {
66         testWith("Default GC should have class unloading enabled",
67                 true, true);
68 
69         testWith("Default GC should disable everything",
70                 false, false,
71                 "-XX:-ClassUnloading");
72 
73         testWith("Default GC should disable conc unload",
74                 true, false,
75                 "-XX:-ClassUnloadingWithConcurrentMark");
76 
77         testWith("Default GC should not let conc unload to be enabled separately",
78                 false, false,
79                 "-XX:-ClassUnloading",
80                 "-XX:+ClassUnloadingWithConcurrentMark");
81     }
82 
testShenandoah()83     public static void testShenandoah() throws Exception {
84         testWith("Shenandoah GC should have class unloading enabled",
85                 true, true,
86                 "-XX:+UnlockExperimentalVMOptions",
87                 "-XX:+UseShenandoahGC");
88 
89         testWith("Shenandoah GC should disable everything",
90                 false, false,
91                 "-XX:+UnlockExperimentalVMOptions",
92                 "-XX:+UseShenandoahGC",
93                 "-XX:-ClassUnloading");
94 
95         testWith("Shenandoah GC should enable conc unload",
96                 true, true,
97                 "-XX:+UnlockExperimentalVMOptions",
98                 "-XX:+UseShenandoahGC",
99                 "-XX:+ClassUnloadingWithConcurrentMark");
100 
101         testWith("Shenandoah GC should not let conc unload to be enabled separately",
102                 false, false,
103                 "-XX:+UnlockExperimentalVMOptions",
104                 "-XX:+UseShenandoahGC",
105                 "-XX:-ClassUnloading",
106                 "-XX:+ClassUnloadingWithConcurrentMark");
107     }
108 
109 }
110