1/*
2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. 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 * @bug 8137167
27 * @summary Tests jcmd to be able to add a directive to compile only specified methods
28 * @modules java.base/jdk.internal.misc
29 * @library /test/lib /
30 * @requires vm.flavor != "minimal"
31 *
32 * @build sun.hotspot.WhiteBox
33 * @run driver ClassFileInstaller sun.hotspot.WhiteBox
34 *                                sun.hotspot.WhiteBox$WhiteBoxPermission
35 * @run driver compiler.compilercontrol.jcmd.PrintDirectivesTest
36 */
37
38package compiler.compilercontrol.jcmd;
39
40import compiler.compilercontrol.share.AbstractTestBase;
41import compiler.compilercontrol.share.method.MethodDescriptor;
42import compiler.compilercontrol.share.scenario.Command;
43import compiler.compilercontrol.share.scenario.CommandGenerator;
44import compiler.compilercontrol.share.scenario.CompileCommand;
45import compiler.compilercontrol.share.scenario.JcmdCommand;
46import compiler.compilercontrol.share.scenario.Scenario;
47import jdk.test.lib.Utils;
48
49import java.lang.reflect.Executable;
50
51public class PrintDirectivesTest extends AbstractTestBase {
52    private static final int AMOUNT = Utils.getRandomInstance().nextInt(
53            Integer.getInteger("compiler.compilercontrol.jcmd."
54                    + "PrintDirectivesTest.amount", 20));
55    private final CommandGenerator cmdGen = new CommandGenerator();
56
57    public static void main(String[] args) {
58        new PrintDirectivesTest().test();
59    }
60
61    @Override
62    public void test() {
63        Scenario.Builder builder = Scenario.getBuilder();
64        // Add some commands with directives file
65        for (int i = 0; i < AMOUNT; i++) {
66            Executable exec = Utils.getRandomElement(METHODS).first;
67            MethodDescriptor methodDescriptor = getValidMethodDescriptor(exec);
68            Command command = cmdGen.generateCommand();
69            if (command == Command.NONEXISTENT) {
70                // skip invalid command
71                command = Command.COMPILEONLY;
72            }
73            CompileCommand compileCommand = new CompileCommand(command,
74                    methodDescriptor, cmdGen.generateCompiler(),
75                    Scenario.Type.DIRECTIVE);
76            compileCommand.print();
77            builder.add(compileCommand);
78        }
79        // print all directives
80        builder.add(new JcmdCommand(Command.NONEXISTENT, null, null,
81                Scenario.Type.JCMD, Scenario.JcmdType.PRINT));
82        Scenario scenario = builder.build();
83        scenario.execute();
84    }
85}
86