8066153: JEP-JDK-8046155: Test task: cover existing
authorppunegov
Tue, 20 Oct 2015 21:09:57 +0300
changeset 33452 04815c29859c
parent 33451 0712796e4039
child 33453 b62df32d4af8
8066153: JEP-JDK-8046155: Test task: cover existing Summary: Tests for CompilerCommand and CompilerControl's directives Reviewed-by: kvn
hotspot/test/compiler/compilercontrol/commandfile/CompileOnlyTest.java
hotspot/test/compiler/compilercontrol/commandfile/ExcludeTest.java
hotspot/test/compiler/compilercontrol/commandfile/LogTest.java
hotspot/test/compiler/compilercontrol/commandfile/PrintTest.java
hotspot/test/compiler/compilercontrol/commands/CompileOnlyTest.java
hotspot/test/compiler/compilercontrol/commands/ExcludeTest.java
hotspot/test/compiler/compilercontrol/commands/LogTest.java
hotspot/test/compiler/compilercontrol/commands/PrintTest.java
hotspot/test/compiler/compilercontrol/directives/CompileOnlyTest.java
hotspot/test/compiler/compilercontrol/directives/ExcludeTest.java
hotspot/test/compiler/compilercontrol/directives/LogTest.java
hotspot/test/compiler/compilercontrol/directives/PrintTest.java
hotspot/test/compiler/compilercontrol/mixed/RandomCommandsTest.java
hotspot/test/compiler/compilercontrol/mixed/RandomValidCommandsTest.java
hotspot/test/compiler/compilercontrol/share/AbstractTestBase.java
hotspot/test/compiler/compilercontrol/share/JSONFile.java
hotspot/test/compiler/compilercontrol/share/MultiCommand.java
hotspot/test/compiler/compilercontrol/share/SingleCommand.java
hotspot/test/compiler/compilercontrol/share/actions/BaseAction.java
hotspot/test/compiler/compilercontrol/share/actions/CompileAction.java
hotspot/test/compiler/compilercontrol/share/method/MethodGenerator.java
hotspot/test/compiler/compilercontrol/share/method/SignatureType.java
hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java
hotspot/test/compiler/compilercontrol/share/processors/LogProcessor.java
hotspot/test/compiler/compilercontrol/share/processors/PrintProcessor.java
hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java
hotspot/test/compiler/compilercontrol/share/scenario/AbstractCommandBuilder.java
hotspot/test/compiler/compilercontrol/share/scenario/Command.java
hotspot/test/compiler/compilercontrol/share/scenario/CommandFileBuilder.java
hotspot/test/compiler/compilercontrol/share/scenario/CommandGenerator.java
hotspot/test/compiler/compilercontrol/share/scenario/CommandOptionsBuilder.java
hotspot/test/compiler/compilercontrol/share/scenario/CompileCommand.java
hotspot/test/compiler/compilercontrol/share/scenario/DirectiveBuilder.java
hotspot/test/compiler/compilercontrol/share/scenario/DirectiveWriter.java
hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commandfile/CompileOnlyTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=compileonly
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build CompileOnlyTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commandfile.CompileOnlyTest
+ */
+
+package compiler.compilercontrol.commandfile;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class CompileOnlyTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.COMPILEONLY, Scenario.Type.FILE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commandfile/ExcludeTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=exclude
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build ExcludeTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commands.ExcludeTest
+ */
+
+package compiler.compilercontrol.commandfile;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class ExcludeTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.EXCLUDE, Scenario.Type.FILE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commandfile/LogTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=log
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build LogTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commandfile.LogTest
+ */
+
+package compiler.compilercontrol.commandfile;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class LogTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.LOG, Scenario.Type.FILE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commandfile/PrintTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=print
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build PrintTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commandfile.PrintTest
+ */
+
+package compiler.compilercontrol.commandfile;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class PrintTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.PRINT, Scenario.Type.FILE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commands/CompileOnlyTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=compileonly
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build CompileOnlyTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commands.CompileOnlyTest
+ */
+
+package compiler.compilercontrol.commands;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class CompileOnlyTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.COMPILEONLY, Scenario.Type.OPTION).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commands/ExcludeTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=exclude
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build ExcludeTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commands.ExcludeTest
+ */
+
+package compiler.compilercontrol.commands;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class ExcludeTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.EXCLUDE, Scenario.Type.OPTION).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commands/LogTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=log
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build LogTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commands.LogTest
+ */
+
+package compiler.compilercontrol.commands;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class LogTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.LOG, Scenario.Type.OPTION).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/commands/PrintTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests CompileCommand=print
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build PrintTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.commands.PrintTest
+ */
+
+package compiler.compilercontrol.commands;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class PrintTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.PRINT, Scenario.Type.OPTION).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/directives/CompileOnlyTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests directives to be able to compile only specified  methods
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build CompileOnlyTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.directives.CompileOnlyTest
+ */
+
+package compiler.compilercontrol.directives;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class CompileOnlyTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.COMPILEONLY, Scenario.Type.DIRECTIVE)
+                .test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/directives/ExcludeTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests directives to be able to exclude methods from compilation
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build ExcludeTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.directives.ExcludeTest
+ */
+
+package compiler.compilercontrol.directives;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class ExcludeTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.EXCLUDE, Scenario.Type.DIRECTIVE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/directives/LogTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests directives to be able to turn on LogCompilation
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build LogTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.directives.LogTest
+ */
+
+package compiler.compilercontrol.directives;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class LogTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.LOG, Scenario.Type.DIRECTIVE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/directives/PrintTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Tests directives to be able to turn on print_assembly
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build PrintTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm compiler.compilercontrol.directives.PrintTest
+ */
+
+package compiler.compilercontrol.directives;
+
+import compiler.compilercontrol.share.SingleCommand;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.Scenario;
+
+public class PrintTest {
+    public static void main(String[] args) {
+        new SingleCommand(Command.PRINT, Scenario.Type.DIRECTIVE).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/mixed/RandomCommandsTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Randomly generates commands with random types
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build RandomCommandsTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm/timeout=600 compiler.compilercontrol.mixed.RandomCommandsTest
+ */
+
+package compiler.compilercontrol.mixed;
+
+import compiler.compilercontrol.share.MultiCommand;
+
+public class RandomCommandsTest {
+    public static void main(String[] args) {
+        MultiCommand.generateRandomTest(false).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/mixed/RandomValidCommandsTest.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8137167
+ * @summary Randomly generates valid commands with random types
+ * @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
+ * @build RandomValidCommandsTest pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
+ *        compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *                              sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm/timeout=600 compiler.compilercontrol.mixed.RandomValidCommandsTest
+ */
+
+package compiler.compilercontrol.mixed;
+
+import compiler.compilercontrol.share.MultiCommand;
+
+public class RandomValidCommandsTest {
+    public static void main(String[] args) {
+        MultiCommand.generateRandomTest(true).test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/AbstractTestBase.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.method.MethodGenerator;
+import jdk.test.lib.Pair;
+import pool.PoolHelper;
+
+import java.lang.reflect.Executable;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public abstract class AbstractTestBase {
+    protected static final MethodGenerator METHOD_GEN = new MethodGenerator();
+    protected static final int ATTEMPTS = 25;
+    protected static final List<Pair<Executable, Callable<?>>> METHODS
+            = new PoolHelper().getAllMethods(PoolHelper.METHOD_FILTER);
+
+    public abstract void test();
+
+    /**
+     * Generate random valid method descriptor
+     *
+     * @param exec method to make descriptor for
+     * @return a valid {@link MethodDescriptor#isValid()} descriptor instance
+     */
+    public static MethodDescriptor getValidMethodDescriptor(Executable exec) {
+        MethodDescriptor md = METHOD_GEN.generateRandomDescriptor(exec);
+        for (int i = 0; !md.isValid() && i < ATTEMPTS; i++) {
+            md = METHOD_GEN.generateRandomDescriptor(exec);
+        }
+        if (!md.isValid()) {
+            System.out.println("WARN: Using predefined pattern");
+            md = MethodGenerator.commandDescriptor(exec);
+        }
+        return md;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/JSONFile.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share;
+
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+import java.util.Objects;
+import java.util.Stack;
+
+/**
+ * Simple JSON file writer
+ */
+public class JSONFile implements AutoCloseable {
+    private final Stack<Element> stack;
+    private final String fileName;
+    private final PrintStream out;
+    private int spaces;
+
+    /**
+     * JSON element
+     */
+    public enum Element {
+        OBJECT,
+        ARRAY,
+        PAIR,
+        VALUE
+    }
+
+    /**
+     * Constructor. Creates file with default name
+     */
+    public JSONFile() {
+        this("directives_file.json");
+    }
+
+    /**
+     * Constructor
+     *
+     * @param fileName file name
+     */
+    public JSONFile(String fileName) {
+        this.spaces = 0;
+        this.stack = new Stack<>();
+        this.fileName = fileName;
+        try {
+            out = new PrintStream(fileName);
+        } catch (FileNotFoundException e) {
+            throw new Error("TESTBUG: can't open/create file " + fileName, e);
+        }
+    }
+
+    /**
+     * Gets file name
+     *
+     * @return file name string
+     */
+    public String getFileName() {
+        return fileName;
+    }
+
+    /**
+     * Gets current JSON element in the file.
+     * The element is a current {@linkplain Element}
+     * that was written into a file.
+     *
+     * @return the type of the current element,
+     * or null if there are nothing written
+     */
+    public Element getElement() {
+        if (stack.empty()) {
+            return null;
+        }
+        return stack.peek();
+    }
+
+    /**
+     * Writes given type with a value to file.
+     * Note that only PAIR and VALUE types accept a single value parameter.
+     * OBJECT and ARRAY do not have a value
+     *
+     * @param element  JSON element type
+     * @param value element's value
+     * @return this file instance
+     */
+    public JSONFile write(Element element, String... value) {
+        if (value.length > 1) {
+            throw new Error("TESTBUG: Unexpected value length: "
+                    + value.length);
+        }
+        if (!stack.empty()) {
+            if (stack.peek() == Element.VALUE) {
+                out.print(", ");
+                stack.pop();
+            }
+        }
+        switch (element) {
+            case OBJECT:
+                out.print("{");
+                spaces++;
+                stack.push(Element.VALUE);
+                break;
+            case ARRAY:
+                out.print("[");
+                stack.push(Element.VALUE);
+                break;
+            case PAIR:
+                fillSpaces();
+                Objects.requireNonNull(value, "TESTBUG: " + element
+                        + "requires a value to be set");
+                out.print(value[0] + ": ");
+                break;
+            case VALUE:
+                Objects.requireNonNull(value, "TESTBUG: " + element
+                        + "requires a value to be set");
+                out.print(value[0]);
+                break;
+        }
+        stack.push(element);
+        return this;
+    }
+
+    private void fillSpaces() {
+        out.println();
+        for (int i = 0; i < spaces; i++) {
+            // Fill with spaces to be more readable
+            out.print("  ");
+        }
+    }
+
+    /**
+     * Ends current object or array of {@linkplain Element}
+     *
+     * @return this file instance
+     */
+    public JSONFile end() {
+        if (!stack.empty()) {
+            Element prev = stack.pop();
+            while (prev != Element.OBJECT && prev != Element.ARRAY
+                    && !stack.empty()) {
+                prev = stack.pop();
+            }
+            switch (prev) {
+                case OBJECT:
+                    spaces--;
+                    fillSpaces();
+                    out.print("}");
+                    break;
+                case ARRAY:
+                    out.print("]");
+                    break;
+                default:
+                    throw new Error("TESTBUG: Incorrect end. " +
+                            "Wrong type found: " + prev);
+            }
+        } else {
+            throw new Error("TESTBUG: Incorrect end. Empty stack");
+        }
+        return this;
+    }
+
+    /**
+     * Closes this file
+     */
+    @Override
+    public void close() {
+        out.close();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/MultiCommand.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.CommandGenerator;
+import compiler.compilercontrol.share.scenario.CompileCommand;
+import compiler.compilercontrol.share.scenario.Scenario;
+import jdk.test.lib.Utils;
+
+import java.lang.reflect.Executable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MultiCommand extends AbstractTestBase {
+    private final List<CompileCommand> testCases;
+
+    public MultiCommand(List<CompileCommand> testCases) {
+        this.testCases = testCases;
+    }
+
+    /**
+     * Generates a test containing multiple random commands
+     *
+     * @param validOnly shows that all commands should be valid
+     * @return test instance to run
+     */
+    public static AbstractTestBase generateRandomTest(boolean validOnly) {
+        CommandGenerator cmdGen = new CommandGenerator();
+        List<Command> commands = cmdGen.generateCommands();
+        List<CompileCommand> testCases = new ArrayList<>();
+        for (Command cmd : commands) {
+            if (validOnly && cmd == Command.NONEXISTENT) {
+                // skip invalid command
+                continue;
+            }
+            Executable exec = Utils.getRandomElement(METHODS).first;
+            MethodDescriptor md;
+            if (validOnly) {
+                md = AbstractTestBase.getValidMethodDescriptor(exec);
+            } else {
+                md = AbstractTestBase.METHOD_GEN.generateRandomDescriptor(exec);
+            }
+            CompileCommand cc = cmdGen.generateCompileCommand(cmd, md, null);
+            testCases.add(cc);
+        }
+        return new MultiCommand(testCases);
+    }
+
+    @Override
+    public void test() {
+        Scenario.Builder builder = Scenario.getBuilder();
+        for (CompileCommand cc : testCases) {
+            cc.print();
+            builder.add(cc);
+        }
+        Scenario scenario = builder.build();
+        scenario.execute();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/SingleCommand.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.CommandGenerator;
+import compiler.compilercontrol.share.scenario.CompileCommand;
+import compiler.compilercontrol.share.scenario.Scenario;
+import jdk.test.lib.Utils;
+
+import java.lang.reflect.Executable;
+
+public class SingleCommand extends AbstractTestBase {
+    private final Command command;
+    private final Scenario.Type type;
+
+    public SingleCommand(Command command, Scenario.Type type) {
+        this.command = command;
+        this.type = type;
+    }
+
+    @Override
+    public void test() {
+        Scenario.Builder builder = Scenario.getBuilder();
+        Executable exec = Utils.getRandomElement(METHODS).first;
+        MethodDescriptor md = getValidMethodDescriptor(exec);
+        CommandGenerator cmdGen = new CommandGenerator();
+        CompileCommand compileCommand = cmdGen.generateCompileCommand(command,
+                md, type);
+        compileCommand.print();
+        builder.add(compileCommand);
+        Scenario scenario = builder.build();
+        scenario.execute();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/actions/BaseAction.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.actions;
+
+import compiler.compilercontrol.share.scenario.State;
+import jdk.test.lib.Pair;
+import jdk.test.lib.ProcessTools;
+import pool.PoolHelper;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.OutputStreamWriter;
+import java.io.IOException;
+import java.lang.reflect.Executable;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
+
+public class BaseAction {
+    private static final List<Pair<Executable, Callable<?>>> METHODS;
+    private static final Map<String, Executable> METHODS_NAMES;
+
+    static {
+        METHODS = new PoolHelper().getAllMethods();
+        METHODS_NAMES = METHODS.stream().collect(Collectors.toMap(
+                pair -> pair.first.toGenericString(),
+                pair -> pair.first));
+    }
+
+    public static void main(String[] args) {
+        if (args.length < 1) {
+            throw new Error("TESTBUG: requires port as parameter: "
+                    + Arrays.toString(args));
+        }
+        int pid;
+        try {
+            pid = ProcessTools.getProcessId();
+        } catch (Exception e) {
+            throw new Error("Could not determine own pid", e);
+        }
+        int port = Integer.parseInt(args[0]);
+        System.out.println("INFO: Client connection port = " + port);
+        List<String> lines;
+        try (
+                Socket socket = new Socket(InetAddress.getLocalHost(), port);
+                BufferedReader in = new BufferedReader(
+                        new InputStreamReader(socket.getInputStream()));
+                PrintWriter out = new PrintWriter(
+                        new OutputStreamWriter(socket.getOutputStream()))) {
+            // send own pid to execute jcmd if needed
+            out.println(String.valueOf(pid));
+            out.flush();
+            lines = in.lines().collect(Collectors.toList());
+        } catch (IOException e) {
+            throw new Error("Error on performing network operation", e);
+        }
+        check(decodeMap(lines));
+    }
+
+    private static Map<Executable, State> decodeMap(List<String> lines) {
+        if (lines == null || lines.size() == 0) {
+            throw new Error("TESTBUG: unexpected lines list");
+        }
+        Map<Executable, State> stateMap = new HashMap<>();
+        int startIndex = 0;
+        ListIterator<String> iterator = lines.listIterator();
+        while (iterator.hasNext()) {
+            int index = iterator.nextIndex();
+            String next = iterator.next();
+            switch (next) {
+                case "{" :
+                    startIndex = index;
+                    break;
+                case "}" :
+                    // method name goes after {
+                    Executable executable = METHODS_NAMES.get(lines.get(
+                            ++startIndex));
+                    // state description starts after method
+                    State state = State.fromString(lines.subList(++startIndex,
+                            index).toArray(new String[index - startIndex]));
+                    stateMap.put(executable, state);
+                    break;
+            }
+        }
+        return stateMap;
+    }
+
+    protected static void check(Map<Executable, State> methodStates) {
+        // Check each method from the pool
+        METHODS.forEach(pair -> {
+            Executable x = pair.first;
+            CompileAction.checkCompiled(x, methodStates.get(x));
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/actions/CompileAction.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.actions;
+
+import compiler.compilercontrol.share.scenario.State;
+import compiler.testlibrary.CompilerUtils;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.Pair;
+import jdk.test.lib.Utils;
+import pool.PoolHelper;
+import sun.hotspot.WhiteBox;
+
+import java.lang.reflect.Executable;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class CompileAction {
+    private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+    private static final int[] COMP_LEVELS;
+    private static final List<Pair<Executable, Callable<?>>> METHODS
+            = new PoolHelper().getAllMethods();
+    private static final int EXEC_AMOUNT = 100;
+
+    static {
+        COMP_LEVELS = CompilerUtils.getAvailableCompilationLevels();
+        if (COMP_LEVELS.length == 0) {
+            throw new Error("TESTBUG: test requires JIT " +
+                    "compiler to be available");
+        }
+    }
+
+    /**
+     * Checks executable if it could be compiled
+     *
+     * @param executable given executable to check
+     * @param state method compilation state
+     */
+    public static void checkCompiled(Executable executable,
+                                     State state) {
+        int first = COMP_LEVELS[0];
+        if (first < 4) {
+            checkCompilation(executable, first, state.isC1Compilable());
+        }
+        int last = COMP_LEVELS[COMP_LEVELS.length - 1];
+        if (last == 4) {
+            checkCompilation(executable, last, state.isC2Compilable());
+        }
+    }
+
+    private static void checkCompilation(Executable executable,
+                                         int level,
+                                         boolean expectedCompiled) {
+        execute(executable);
+        WHITE_BOX.enqueueMethodForCompilation(executable, level);
+        Utils.waitForCondition(
+                () -> {
+                    execute(executable);
+                    return !WHITE_BOX.isMethodQueuedForCompilation(executable);
+                }, 100L);
+        execute(executable);
+        boolean isCompiled = WHITE_BOX.isMethodCompiled(executable);
+        Asserts.assertEQ(isCompiled, expectedCompiled,
+                String.format("FAILED: method %s compiled: %b, but should: %b"
+                        + " on required level: %d", executable, isCompiled,
+                        expectedCompiled, level));
+    }
+
+    private static void execute(Executable executable) {
+        Callable<?> callable = getCallableFor(executable);
+        try {
+            for (int i = 0; i < EXEC_AMOUNT; i++) {
+                callable.call();
+            }
+        } catch (Exception e) {
+            throw new Error("Got exception during execution", e);
+        }
+    }
+
+    private static Callable<?> getCallableFor(Executable executable) {
+        for (Pair<Executable, Callable<?>> pair : METHODS) {
+            if (pair.first == executable) {
+                return pair.second;
+            }
+        }
+        throw new Error("TESTBUG: wrong executable: " + executable);
+    }
+}
--- a/hotspot/test/compiler/compilercontrol/share/method/MethodGenerator.java	Tue Oct 20 18:07:28 2015 +0200
+++ b/hotspot/test/compiler/compilercontrol/share/method/MethodGenerator.java	Tue Oct 20 21:09:57 2015 +0300
@@ -124,6 +124,23 @@
     }
 
     /**
+     * Method descriptor that matches any method. Its full signature is *.*
+     *
+     * @param executable executable used to generate descriptor
+     * @return MethodDescriptor instance
+     */
+    public static MethodDescriptor anyMatchDescriptor(Executable executable) {
+        MethodDescriptor md = new MethodDescriptor(executable);
+        Combination<PatternType> patterns = new Combination<>(PatternType.ANY,
+                PatternType.ANY, PatternType.ANY);
+        md.aClass.setSeparator(Separator.SLASH);
+        md.aMethod.setSeparator(Separator.DOT);
+        md.aSignature.setSeparator(Separator.NONE);
+        md.setPatterns(patterns);
+        return md;
+    }
+
+    /**
      * Generates a list of method patterns from the pool of methods
      *
      * @return a list of test cases
--- a/hotspot/test/compiler/compilercontrol/share/method/SignatureType.java	Tue Oct 20 18:07:28 2015 +0200
+++ b/hotspot/test/compiler/compilercontrol/share/method/SignatureType.java	Tue Oct 20 21:09:57 2015 +0300
@@ -29,6 +29,7 @@
 import java.lang.reflect.Executable;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.regex.Pattern;
 
 /**
  * This class represents a signature of the method
@@ -66,7 +67,8 @@
         if (element.isEmpty()) {
             setPattern(MethodDescriptor.PatternType.ANY);
         } else {
-            super.setElement(element);
+            this.element = element;
+            this.regexp = element;
         }
     }
 
@@ -148,4 +150,12 @@
                         + patternType);
         }
     }
+
+    @Override
+    public String getRegexp() {
+        if ("\\(.*\\).*".equals(regexp)) {
+            return regexp;
+        }
+        return Pattern.quote(regexp);
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.processors;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.CompileCommand;
+import jdk.test.lib.OutputAnalyzer;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * Checks that output contains a string with commands and full method pattern
+ */
+public class CommandProcessor implements Consumer<OutputAnalyzer> {
+    protected final List<CompileCommand> commands;
+
+    public CommandProcessor(List<CompileCommand> commands) {
+        this.commands = commands;
+    }
+
+    @Override
+    public void accept(OutputAnalyzer outputAnalyzer) {
+        for (CompileCommand command : commands) {
+            MethodDescriptor methodDescriptor = command.methodDescriptor;
+            if (methodDescriptor.isValid()) {
+                Command cmd = command.command;
+                String method = methodDescriptor.getCanonicalString();
+                outputAnalyzer.shouldContain("CompileCommand: " + cmd.name
+                        + " " + method);
+                outputAnalyzer.shouldNotContain("CompileCommand: An error "
+                        + "occurred during parsing");
+            } else {
+                outputAnalyzer.shouldMatch("(CompileCommand: )"
+                        + "(unrecognized command)|(Bad pattern)|"
+                        + "(An error occurred during parsing)");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/processors/LogProcessor.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.processors;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.method.MethodGenerator;
+import compiler.compilercontrol.share.scenario.State;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.Pair;
+import pool.PoolHelper;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.lang.reflect.Executable;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.function.Consumer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * Log compilation file processor
+ */
+public class LogProcessor implements Consumer<OutputAnalyzer> {
+    public static final String LOG_FILE = "compilation.log";
+    private static final String TASK_ELEMENT = "<task [^>]*>";
+    private static final String TASK_DONE_ELEMENT = "<task_done [^>]*>";
+    private static final String TASK_END_ELEMENT = "</task>";
+    private static final String ANY_ELEMENT = "<[^>]*>";
+    private static final Pattern METHOD_PATTERN = Pattern.compile(
+            "method='([^']+)'");
+    private final List<String> loggedMethods;
+    private final List<String> testMethods;
+    private Scanner scanner = null;
+
+    public LogProcessor(Map<Executable, State> states) {
+        loggedMethods = states.keySet().stream()
+                .filter(x -> states.get(x).isLog())
+                .map(MethodGenerator::logDescriptor)
+                .map(MethodDescriptor::getString)
+                .collect(Collectors.toList());
+        testMethods = new PoolHelper().getAllMethods()
+                .stream()
+                .map(pair -> pair.first)
+                .map(MethodGenerator::logDescriptor)
+                .map(MethodDescriptor::getString)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void accept(OutputAnalyzer outputAnalyzer) {
+        if (loggedMethods.isEmpty()) {
+            return;
+        }
+        getScanner();
+        matchTasks();
+    }
+
+    /*
+     * Gets scanner for log file of the test case
+     */
+    private Scanner getScanner() {
+        File logFile = new File(LOG_FILE);
+        try {
+            scanner = new Scanner(logFile);
+        } catch (FileNotFoundException e) {
+            throw new Error("TESTBUG: file not found: " + logFile, e);
+        }
+        return scanner;
+    }
+
+    /*
+     * Parses for &lt;task method='java.lang.String indexOf (I)I' &gt;
+     * and finds if there is a compilation log for this task
+     */
+    private void matchTasks() {
+        String task = scanner.findWithinHorizon(TASK_ELEMENT, 0);
+        while (task != null) {
+            String element = scanner.findWithinHorizon(ANY_ELEMENT, 0);
+            if (Pattern.matches(TASK_DONE_ELEMENT, element)
+                    || Pattern.matches(TASK_END_ELEMENT, element)) {
+                /* If there is nothing between <task> and </task>
+                   except <task done /> then compilation log is empty */
+                Asserts.assertTrue(matchMethod(task), "Compilation log "
+                        + "expected. Met: " + element);
+            }
+            task = scanner.findWithinHorizon(TASK_ELEMENT, 0);
+        }
+    }
+
+    // Matches given string to regular expression
+    private boolean matchMethod(String input) {
+        Matcher matcher = METHOD_PATTERN.matcher(input);
+        Asserts.assertTrue(matcher.find(), "Wrong matcher or input");
+        // Get method and normalize it
+        String method = normalize(matcher.group(1));
+        // Check that this method matches regexp
+        return loggedMethods.contains(method) || !testMethods.contains(method);
+    }
+
+    // Normalize given signature to conform regular expression used in tests
+    private String normalize(String method) {
+        return method.replaceAll("\\.", "/") // replace dots in a class string
+                .replaceFirst(" ", ".")      // replace space between class and method
+                .replaceFirst(" ", "")       // remove space between method and signature
+                .replace("&lt;", "<")
+                .replace("&gt;", ">");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/processors/PrintProcessor.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.processors;
+
+import com.sun.management.HotSpotDiagnosticMXBean;
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.method.MethodGenerator;
+import compiler.compilercontrol.share.scenario.State;
+import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.Pair;
+import pool.PoolHelper;
+
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Executable;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * Process output to find compiled methods assemblies printed by print command
+ */
+public class PrintProcessor implements Consumer<OutputAnalyzer> {
+    /**
+     * Compiled method string pattern.
+     * Capturing groups are
+     * 1. Compiler used to compile this method
+     * 2. Time stamp
+     * 3. Compile ID
+     * 4. Method attributes
+     * 5. Compilation level
+     * 6. Method name
+     */
+    private static final Pattern COMPILED_METHOD
+            = Pattern.compile("Compiled method (?<compiler>\\(.*\\))[ ]+"
+            + "(?<time>[0-9]+)[ ]+(?<id>[0-9]+) (?<attr>[ !%sbn]{6})"
+            + "(?<level>[0-9]+)[ ]+(?<name>[^ ]+).*");
+    private final List<String> printMethods;
+    private final List<String> testMethods;
+
+    public PrintProcessor(Map<Executable, State> states) {
+        printMethods = states.keySet().stream()
+                .filter(x -> states.get(x).isPrintAssembly())
+                .map(MethodGenerator::logDescriptor)
+                .map(MethodDescriptor::getString)
+                .map(s -> s.replaceFirst("\\(.*", "")) // remove signature
+                .collect(Collectors.toList());
+        testMethods = new PoolHelper().getAllMethods()
+                .stream()
+                .map(pair -> pair.first)
+                .map(MethodGenerator::logDescriptor)
+                .map(MethodDescriptor::getString)
+                .map(s -> s.replaceFirst("\\(.*", "")) // remove signature
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void accept(OutputAnalyzer outputAnalyzer) {
+        boolean wizardMode = false;
+        try {
+            wizardMode = Boolean.parseBoolean(ManagementFactory
+                    .getPlatformMXBean(HotSpotDiagnosticMXBean.class)
+                    .getVMOption("WizardMode").getValue());
+        } catch (IllegalArgumentException e) {
+            // ignore exception because WizardMode exists in debug only builds
+        }
+        if (wizardMode) {
+            System.out.println("SKIP: WizardMode's output are not supported");
+            return;
+        }
+        for (String line : outputAnalyzer.asLines()) {
+            Matcher matcher = COMPILED_METHOD.matcher(line);
+            if (matcher.matches()) {
+                String method = normalize(matcher.group("name"));
+                if (!printMethods.contains(normalize(method))
+                        && testMethods.contains(method)) {
+                    System.out.println(outputAnalyzer.getOutput());
+                    throw new AssertionError("FAILED: wrong method "
+                            + "was printed: " + method + " LINE: " + line);
+                }
+            }
+        }
+    }
+
+    // Normalize given signature to conform regular expression used in tests
+    private String normalize(String method) {
+        return method.replaceAll("\\.", "/") // replace dots in a class string
+                .replaceFirst("::", ".")     // replace :: between class and method
+                .replace("&lt;", "<")
+                .replace("&gt;", ">");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.processors;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.scenario.Command;
+import compiler.compilercontrol.share.scenario.CompileCommand;
+import jdk.test.lib.OutputAnalyzer;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+public class QuietProcessor implements Consumer<OutputAnalyzer> {
+    private final List<CompileCommand> commands;
+
+    public QuietProcessor(List<CompileCommand> compileCommands) {
+        commands = compileCommands;
+    }
+
+    @Override
+    public void accept(OutputAnalyzer outputAnalyzer) {
+        for (CompileCommand command : commands) {
+            MethodDescriptor methodDescriptor = command.methodDescriptor;
+            if (methodDescriptor.isValid()) {
+                Command cmd = command.command;
+                String method = methodDescriptor.getCanonicalString();
+                outputAnalyzer.shouldNotContain("CompileCommand: "
+                        + cmd.name + " " + method);
+                outputAnalyzer.shouldNotContain("CompileCommand: An error "
+                        + "occurred during parsing");
+            } else {
+                outputAnalyzer.shouldMatch("(CompileCommand: )"
+                        + "(unrecognized command)|(Bad pattern)|"
+                        + "(An error occurred during parsing)");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/AbstractCommandBuilder.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import jdk.test.lib.Pair;
+import pool.PoolHelper;
+
+import java.lang.reflect.Executable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+/**
+ * An abstract class that builds states by applying
+ * commands one after another
+ */
+public abstract class AbstractCommandBuilder
+        implements StateBuilder<CompileCommand> {
+    protected static final List<Pair<Executable, Callable<?>>> METHODS
+            = new PoolHelper().getAllMethods();
+    protected final List<CompileCommand> compileCommands = new ArrayList<>();
+
+    @Override
+    public void add(CompileCommand command) {
+        compileCommands.add(command);
+    }
+
+    @Override
+    public Map<Executable, State> getStates() {
+        Map<Executable, State> states = new HashMap<>();
+        for (CompileCommand compileCommand : compileCommands) {
+            if (compileCommand.isValid()) {
+                CompileCommand cc = new CompileCommand(compileCommand.command,
+                        compileCommand.methodDescriptor,
+                        /* CompileCommand option and file doesn't support
+                           compiler setting */
+                        null,
+                        compileCommand.type);
+                MethodDescriptor md = cc.methodDescriptor;
+                for (Pair<Executable, Callable<?>> pair: METHODS) {
+                    Executable exec = pair.first;
+                    State state = states.getOrDefault(exec, new State());
+                    MethodDescriptor execDesc = new MethodDescriptor(exec);
+                    // if executable matches regex then apply the state
+                    if (execDesc.getCanonicalString().matches(md.getRegexp())) {
+                        state.apply(cc);
+                    } else {
+                        if (cc.command == Command.COMPILEONLY) {
+                            state.setC1Compilable(false);
+                            state.setC2Compilable(false);
+                        }
+                    }
+                    states.put(exec, state);
+                }
+            }
+        }
+        return states;
+    }
+
+    @Override
+    public List<CompileCommand> getCompileCommands() {
+        return Collections.unmodifiableList(compileCommands);
+    }
+
+    @Override
+    public boolean isValid() {
+        // CompileCommand ignores invalid items
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/Command.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.processors.LogProcessor;
+import java.util.Arrays;
+
+/**
+ * Represents a CompileCommand command set
+ */
+public enum Command {
+    COMPILEONLY("compileonly", ".*", "-Xbatch"),
+    EXCLUDE("exclude", "", "-Xbatch"),
+    INLINE("inline", ".*"),
+    DONTINLINE("dontinline", ""),
+    LOG("log", "", "-XX:+UnlockDiagnosticVMOptions",
+            "-XX:+LogCompilation", "-XX:LogFile=" + LogProcessor.LOG_FILE),
+    PRINT("print", ""),
+    QUIET("quiet", ""),
+    NONEXISTENT("nonexistent", ""); // wrong command for a negative case
+
+    /**
+     * Command name
+     */
+    public final String name;
+
+    /**
+     * Base regular expression
+     */
+    public final String regex;
+
+    /**
+     * Additional VM options for this command
+     */
+    public final String[] vmOpts;
+
+    private Command(String name, String regex, String... vmOptions) {
+        this.name = name;
+        this.regex = regex;
+        String[] wbOpts = new String[] { "-Xbootclasspath/a:.",
+                "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI" };
+        int length = (vmOptions != null) ? vmOptions.length : 0;
+        this.vmOpts = Arrays.copyOf(wbOpts, wbOpts.length + length);
+        if (vmOptions != null) {
+            System.arraycopy(vmOptions, 0, vmOpts, wbOpts.length, length);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/CommandFileBuilder.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Creates CompileCommandFile from the given array of commands
+ */
+public class CommandFileBuilder extends AbstractCommandBuilder {
+    private final String fileName;
+
+    public CommandFileBuilder(String fileName) {
+        this.fileName = fileName;
+    }
+
+    @Override
+    public List<String> getOptions() {
+        // Create CommandFile
+        try (PrintWriter pw = new PrintWriter(fileName)) {
+            compileCommands.stream()
+                    .map(cc -> cc.command.name + " "
+                            + cc.methodDescriptor.getString())
+                    .forEach(pw::println);
+            if (pw.checkError()) {
+                throw new Error("TESTBUG: write error");
+            }
+        } catch (IOException e) {
+            throw new Error("TESTBUG: can't write a file", e);
+        }
+        List<String> opt = new ArrayList<>();
+        opt.add("-XX:CompileCommandFile=" + fileName);
+        return opt;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/CommandGenerator.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import jdk.test.lib.Utils;
+
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Generates random commands
+ */
+public class CommandGenerator {
+    private static final int MAX_COMMANDS = Integer.getInteger(
+            "compiler.compilercontrol.share.scenario.CommandGenerator.commands",
+            100);
+    private static final Random RANDOM = Utils.getRandomInstance();
+
+    /**
+     * Generates random command
+     *
+     * @return command
+     */
+    public Command generateCommand() {
+        return Utils.getRandomElement(Command.values());
+    }
+
+    /**
+     * Generates random number of random command
+     *
+     * @return a list of random commands
+     */
+    public List<Command> generateCommands() {
+        int amount = 1 + RANDOM.nextInt(MAX_COMMANDS - 1);
+        return generateCommands(amount);
+    }
+
+    /**
+     * Generates specified amount of random command
+     *
+     * @param amount amount of commands to generate
+     * @return a list of random commands
+     */
+    public List<Command> generateCommands(int amount) {
+        return Stream.generate(this::generateCommand)
+                .limit(amount)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Generates random compile command {@link CompileCommand} with specified
+     * command and method descriptor
+     *
+     * @param command a command type
+     * @param md      a method descriptor
+     * @param type    a type of the command, or null to generate any
+     * @return the generated compile command
+     */
+    public CompileCommand generateCompileCommand(Command command,
+            MethodDescriptor md, Scenario.Type type) {
+        if (type == null) {
+            type = Utils.getRandomElement(Scenario.Type.values());
+        }
+        return type.createCompileCommand(command, md, generateCompiler());
+    }
+
+    /**
+     * Generates type of compiler that should be used for the command, or null
+     * if any or all compilers should be used
+     *
+     * @return Compiler value, or null
+     */
+    public Scenario.Compiler generateCompiler() {
+        Scenario.Compiler[] compilers = Scenario.Compiler.values();
+        int compiler = RANDOM.nextInt(compilers.length + 1) - 1;
+        return (compiler != -1) ? compilers[compiler] : null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/CommandOptionsBuilder.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Creates VM options by adding CompileCommand prefix to commands
+ */
+public class CommandOptionsBuilder extends AbstractCommandBuilder {
+    @Override
+    public List<String> getOptions() {
+        return compileCommands.stream()
+                .map(cc -> "-XX:CompileCommand="
+                        + cc.command.name
+                        + MethodDescriptor.Separator.COMMA.symbol
+                        + cc.methodDescriptor.getString())
+                .collect(Collectors.toList());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/CompileCommand.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.method.MethodDescriptor;
+
+/**
+ * Compile Command description interface
+ */
+public class CompileCommand {
+    public final Command command;
+    public final MethodDescriptor methodDescriptor;
+    public final Scenario.Compiler compiler;
+    public final Scenario.Type type;
+
+    public CompileCommand(Command command,
+                          MethodDescriptor methodDescriptor,
+                          Scenario.Compiler compiler,
+                          Scenario.Type type) {
+        this.command = command;
+        this.methodDescriptor = methodDescriptor;
+        this.compiler = compiler;
+        this.type = type;
+    }
+
+    /**
+     * Shows that this compile command is valid
+     *
+     * @return true if this is a valid command
+     */
+    public boolean isValid() {
+        if (command == Command.NONEXISTENT) {
+            return false;
+        }
+        return methodDescriptor.isValid();
+    }
+
+    /**
+     * Prints compile command to the system output
+     */
+    public void print() {
+        System.out.printf("%s (type: %s): %s (valid: %b)%n", command.name(),
+                type.name(), methodDescriptor.getString(), isValid());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/DirectiveBuilder.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.JSONFile;
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.method.MethodGenerator;
+import jdk.test.lib.Pair;
+import pool.PoolHelper;
+
+import java.lang.reflect.Executable;
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.concurrent.Callable;
+
+/**
+ * Directive file and state builder class
+ */
+public class DirectiveBuilder implements StateBuilder<CompileCommand> {
+    private static final List<Pair<Executable, Callable<?>>> METHODS
+            = new PoolHelper().getAllMethods();
+    private final Map<Executable, State> stateMap = new HashMap<>();
+    private final String fileName;
+    private Map<MethodDescriptor, List<CompileCommand>> matchBlocks
+            = new LinkedHashMap<>();
+    private List<String> inlineMatch = new ArrayList<>();
+    private boolean isFileValid = true;
+
+    public DirectiveBuilder(String fileName) {
+        this.fileName = fileName;
+    }
+
+    @Override
+    public List<String> getOptions() {
+        List<String> options = new ArrayList<>();
+        if (!matchBlocks.isEmpty()) {
+            // add option only if there are any directive available
+            options.add("-XX:CompilerDirectivesFile=" + fileName);
+        }
+        return options;
+    }
+
+    @Override
+    public List<CompileCommand> getCompileCommands() {
+        throw new Error("TESTBUG: isn't applicable for directives");
+    }
+
+    @Override
+    public boolean isValid() {
+        // Invalid directives file makes VM exit with error code
+        return isFileValid;
+    }
+
+    @Override
+    public Map<Executable, State> getStates() {
+        try (DirectiveWriter dirFile = new DirectiveWriter(fileName)) {
+            for (MethodDescriptor matchDescriptor : matchBlocks.keySet()) {
+                // Write match block with all options converted from commands
+                dirFile.match(matchDescriptor);
+                for (CompileCommand compileCommand :
+                        matchBlocks.get(matchDescriptor)) {
+                    isFileValid &= compileCommand.isValid();
+                    handleCommand(dirFile, compileCommand);
+                }
+                if ("Inlinee.caller".matches((matchDescriptor.getRegexp()))) {
+                    // Got a *.* match block, where inline would be written
+                    dirFile.inline(inlineMatch.toArray(
+                            new String[inlineMatch.size()]));
+                    inlineMatch.clear();
+                }
+                dirFile.end(); // ends match block
+            }
+
+            /*
+             * Write inline directive in the end to the latest match block
+             * if we didn't do this before
+             * Inlinee caller methods should match this block only
+             */
+            if (!inlineMatch.isEmpty()) {
+                Pair<Executable, Callable<?>> pair = METHODS.get(0);
+                MethodDescriptor md = MethodGenerator.anyMatchDescriptor(
+                        pair.first);
+                CompileCommand cc = new CompileCommand(Command.QUIET, md, null,
+                        Scenario.Type.DIRECTIVE);
+                List<CompileCommand> commands = new ArrayList<>();
+
+                // Add appropriate "*.*" match block
+                commands.add(cc);
+                matchBlocks.put(md, commands);
+                // Add match block for this descriptor with inlines
+                dirFile.match(md);
+                dirFile.inline(inlineMatch.toArray(
+                        new String[inlineMatch.size()]));
+                dirFile.end();
+            }
+            if (!matchBlocks.isEmpty()) {
+                // terminates file
+                dirFile.end();
+            }
+
+            // Build states for each method according to match blocks
+            for (Pair<Executable, Callable<?>> pair : METHODS) {
+                State state = getState(pair);
+                if (state != null) {
+                    stateMap.put(pair.first, state);
+                }
+            }
+        }
+        if (isFileValid) {
+            return stateMap;
+        } else {
+            // return empty map because invalid file doesn't change states
+            return new HashMap<>();
+        }
+    }
+
+    private State getState(Pair<Executable, Callable<?>> pair) {
+        State state = null;
+        MethodDescriptor execDesc = MethodGenerator.commandDescriptor(
+                pair.first);
+        boolean isMatchFound = false;
+
+        if (stateMap.containsKey(pair.first)) {
+            state = stateMap.get(pair.first);
+        }
+        for (MethodDescriptor matchDesc : matchBlocks.keySet()) {
+            if (execDesc.getCanonicalString().matches(matchDesc.getRegexp())) {
+                /*
+                 * if executable matches regex
+                 * then apply commands from this match to the state
+                 */
+                for (CompileCommand cc : matchBlocks.get(matchDesc)) {
+                    state = new State();
+                    if (!isMatchFound) {
+                        // this is a first found match, apply all commands
+                        state.apply(cc);
+                    } else {
+                        // apply only inline directives
+                        switch (cc.command) {
+                            case INLINE:
+                            case DONTINLINE:
+                                state.apply(cc);
+                                break;
+                        }
+                    }
+                }
+                isMatchFound = true;
+            }
+        }
+        return state;
+    }
+
+    private void handleCommand(DirectiveWriter dirFile, CompileCommand cmd) {
+        Command command = cmd.command;
+
+        switch (command) {
+            case COMPILEONLY:
+                dirFile.excludeCompile(cmd.compiler, false);
+                break;
+            case EXCLUDE:
+                dirFile.excludeCompile(cmd.compiler, true);
+                break;
+            case INLINE:
+            case DONTINLINE:
+                // Inline commands will be written later
+                break;
+            case LOG:
+                dirFile.option(DirectiveWriter.Option.LOG, true);
+                break;
+            case QUIET:
+                // there are no appropriate directive for this
+                break;
+            case PRINT:
+                dirFile.option(DirectiveWriter.Option.PRINT_ASSEMBLY, true);
+                break;
+            case NONEXISTENT:
+                dirFile.write(JSONFile.Element.PAIR, command.name);
+                dirFile.write(JSONFile.Element.OBJECT);
+                dirFile.write(JSONFile.Element.PAIR, command.name);
+                dirFile.write(JSONFile.Element.VALUE,
+                        cmd.methodDescriptor.getString());
+                dirFile.end(); // ends object
+                break;
+            default:
+                throw new Error("TESTBUG: wrong command: " + command);
+        }
+    }
+
+    @Override
+    public void add(CompileCommand compileCommand) {
+        MethodDescriptor methodDescriptor = compileCommand.methodDescriptor;
+
+        switch (compileCommand.command) {
+            case INLINE:
+                inlineMatch.add("+" + methodDescriptor.getString());
+                break;
+            case DONTINLINE:
+                inlineMatch.add("-" + methodDescriptor.getString());
+                break;
+        }
+        for (MethodDescriptor md: matchBlocks.keySet()) {
+            if (methodDescriptor.getCanonicalString().matches(md.getRegexp())) {
+                matchBlocks.get(md).add(compileCommand);
+            }
+        }
+        if (!matchBlocks.containsKey(compileCommand.methodDescriptor)) {
+            List<CompileCommand> commands = new ArrayList<>();
+            commands.add(compileCommand);
+            matchBlocks.put(compileCommand.methodDescriptor, commands);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/DirectiveWriter.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.JSONFile;
+import compiler.compilercontrol.share.method.MethodDescriptor;
+
+/**
+ * Simple directive file writer.
+ */
+public class DirectiveWriter implements AutoCloseable {
+    private final JSONFile jsonFile;
+
+    /**
+     * Builds directive file for the given name
+     *
+     * @param fileName name the file to be created
+     */
+    public DirectiveWriter(String fileName) {
+        jsonFile = new JSONFile(fileName);
+    }
+
+    /**
+     * Emits match block with a given methods
+     *
+     * @param methods methods used for the match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter match(String... methods) {
+        if (jsonFile.getElement() == null) {
+            write(JSONFile.Element.ARRAY);
+        }
+        write(JSONFile.Element.OBJECT);
+        write(JSONFile.Element.PAIR, "match");
+        writeMethods(methods);
+        return this;
+    }
+
+    /**
+     * Emits match block with a given methods
+     *
+     * @param methodDescriptors method descriptors used for the match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter match(MethodDescriptor... methodDescriptors) {
+        String[] methods = new String[methodDescriptors.length];
+        for (int i = 0; i < methodDescriptors.length; i++) {
+            methods[i] = methodDescriptors[i].getString();
+        }
+        match(methods);
+        return this;
+    }
+
+    /**
+     * Emits inline block with a given methods to be inlined or not.
+     * Each method should be prepended with + or - to show if it should be
+     * inlined or not.
+     *
+     * @param methods methods used for the inline
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter inline(String... methods) {
+        write(JSONFile.Element.PAIR, "inline");
+        writeMethods(methods);
+        return this;
+    }
+
+    private void writeMethods(String[] methods) {
+        if (methods.length == 0) {
+            throw new IllegalArgumentException("ERROR: empty methods array");
+        }
+        if (methods.length > 1) {
+            write(JSONFile.Element.ARRAY);
+            for (String method : methods) {
+                write(JSONFile.Element.VALUE, "\"" + method + "\"");
+            }
+            end(); // ends array
+        } else {
+            write(JSONFile.Element.VALUE, "\"" + methods[0] + "\"");
+        }
+    }
+
+    /**
+     * Emits compiler blocks that makes current match to be excluded or not
+     * from compilation with specified compiler
+     *
+     * @param compiler compiler to be excluded or null, for all
+     * @param exclude  shows if compiler should be disabled for this match
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter excludeCompile(Scenario.Compiler compiler,
+                                          boolean exclude) {
+        if (compiler != null) {
+            emitCompiler(compiler);
+            option(Option.EXCLUDE, exclude);
+            end();
+        } else {
+            for (Scenario.Compiler comp : Scenario.Compiler.values()) {
+                emitCompiler(comp);
+                option(Option.EXCLUDE, exclude);
+                end(); // end compiler block
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Emits compiler directive block
+     *
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter emitCompiler(Scenario.Compiler compiler) {
+        write(JSONFile.Element.PAIR, compiler.name);
+        write(JSONFile.Element.OBJECT);
+        return this;
+    }
+
+    @Override
+    public void close() {
+        jsonFile.close();
+    }
+
+    /**
+     * Ends current object element. It could be either a
+     * c1 or c2 block, or a whole match block
+     *
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter end() {
+        jsonFile.end();
+        return this;
+    }
+
+    public DirectiveWriter write(JSONFile.Element element, String... value) {
+        jsonFile.write(element, value);
+        return this;
+    }
+
+    /**
+     * Emits directive option with a given value
+     *
+     * @param option directive to be set
+     * @param value value of the directive
+     * @return this DirectiveWriter instance
+     */
+    public DirectiveWriter option(Option option, Object value) {
+        write(JSONFile.Element.PAIR, option.string);
+        write(JSONFile.Element.VALUE, String.valueOf(value));
+        return this;
+    }
+
+    /**
+     * Directive option list
+     */
+    public enum Option {
+        PRINT_ASSEMBLY("PrintAssembly"),
+        LOG("Log"),
+        EXCLUDE("Exclude");
+
+        public final String string;
+
+        private Option(String directive) {
+            this.string = directive;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java	Tue Oct 20 21:09:57 2015 +0300
@@ -0,0 +1,272 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.compilercontrol.share.scenario;
+
+import compiler.compilercontrol.share.actions.BaseAction;
+import compiler.compilercontrol.share.method.MethodDescriptor;
+import compiler.compilercontrol.share.processors.CommandProcessor;
+import compiler.compilercontrol.share.processors.LogProcessor;
+import compiler.compilercontrol.share.processors.PrintProcessor;
+import compiler.compilercontrol.share.processors.QuietProcessor;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.Pair;
+import jdk.test.lib.ProcessTools;
+import pool.PoolHelper;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.lang.reflect.Executable;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.function.Consumer;
+
+/**
+ * Test scenario
+ */
+public final class Scenario {
+    private final boolean isValid;
+    private final List<String> vmopts;
+    private final Map<Executable, State> states;
+    private final List<Consumer<OutputAnalyzer>> processors;
+
+    private Scenario(boolean isValid,
+                     List<String> vmopts,
+                     Map<Executable, State> states,
+                     List<CompileCommand> compileCommands) {
+        this.isValid = isValid;
+        this.vmopts = vmopts;
+        this.states = states;
+        processors = new ArrayList<>();
+        processors.add(new LogProcessor(states));
+        processors.add(new PrintProcessor(states));
+        List<CompileCommand> nonQuieted = new ArrayList<>();
+        List<CompileCommand> quieted = new ArrayList<>();
+        boolean metQuiet = false;
+        for (CompileCommand cc : compileCommands) {
+            metQuiet |= cc.command == Command.QUIET;
+            if (metQuiet) {
+                quieted.add(cc);
+            } else {
+                nonQuieted.add(cc);
+            }
+        }
+        processors.add(new CommandProcessor(nonQuieted));
+        processors.add(new QuietProcessor(quieted));
+    }
+
+    /**
+     * Executes scenario
+     */
+    public void execute() {
+        // Construct execution command with CompileCommand and class
+        List<String> argsList = new ArrayList<>();
+        // Add VM options
+        argsList.addAll(vmopts);
+        // Add class name that would be executed in a separate VM
+        String classCmd = BaseAction.class.getName();
+        argsList.add(classCmd);
+        OutputAnalyzer output;
+        try (ServerSocket serverSocket = new ServerSocket(0)) {
+            if (isValid) {
+                // Get port test VM will connect to
+                int port = serverSocket.getLocalPort();
+                if (port == -1) {
+                    throw new Error("Socket is not bound: " + port);
+                }
+                argsList.add(String.valueOf(port));
+                // Start separate thread to connect with test VM
+                new Thread(() -> connectTestVM(serverSocket)).start();
+            }
+            // Start test VM
+            output = ProcessTools.executeTestJvmAllArgs(
+                    argsList.toArray(new String[argsList.size()]));
+        } catch (Throwable thr) {
+            throw new Error("Execution failed", thr);
+        }
+        if (isValid) {
+            output.shouldHaveExitValue(0);
+            for (Consumer<OutputAnalyzer> processor : processors) {
+                processor.accept(output);
+            }
+        } else {
+            Asserts.assertNE(output.getExitValue(), 0, "VM should exit with "
+                    + "error for incorrect directives");
+            output.shouldContain("Parsing of compiler directives failed");
+        }
+    }
+
+    /*
+     * Performs connection with a test VM, sends method states
+     */
+    private void connectTestVM(ServerSocket serverSocket) {
+        /*
+         * There are no way to prove that accept was invoked before we started
+         * test VM that connects to this serverSocket. Connection timeout is
+         * enough
+         */
+        try (
+                Socket socket = serverSocket.accept();
+                PrintWriter pw = new PrintWriter(socket.getOutputStream(),
+                        true);
+                BufferedReader in = new BufferedReader(new InputStreamReader(
+                        socket.getInputStream()))) {
+            // Get pid of the executed process
+            int pid = Integer.parseInt(in.readLine());
+            Asserts.assertNE(pid, 0, "Got incorrect pid");
+            // serialize and send state map
+            for (Executable x : states.keySet()) {
+                pw.println("{");
+                pw.println(x.toGenericString());
+                pw.println(states.get(x).toString());
+                pw.println("}");
+            }
+        } catch (IOException e) {
+            throw new Error("Failed to write data", e);
+        }
+    }
+
+    /**
+     * Gets states of methods for this scenario
+     *
+     * @return pairs of executable and its state
+     */
+    public Map<Executable, State> getStates() {
+        return states;
+    }
+
+    public static enum Compiler {
+        C1("c1"),
+        C2("c2");
+
+        public final String name;
+
+        Compiler(String name) {
+            this.name = name;
+        }
+    }
+
+    /**
+     * Type of the compile command
+     */
+    public static enum Type {
+        OPTION(""),
+        FILE("command_file"),
+        DIRECTIVE("directives.json");
+
+        public final String fileName;
+
+        public CompileCommand createCompileCommand(Command command,
+                MethodDescriptor md, Compiler compiler) {
+            return new CompileCommand(command, md, compiler, this);
+        }
+
+        private Type(String fileName) {
+            this.fileName = fileName;
+        }
+    }
+
+    public static Builder getBuilder() {
+        return new Builder();
+    }
+
+    public static class Builder {
+        private final Set<String> vmopts = new LinkedHashSet<>();
+        private final Map<Type, StateBuilder<CompileCommand>> builders
+                = new HashMap<>();
+
+        public Builder() {
+            builders.put(Type.FILE, new CommandFileBuilder(Type.FILE.fileName));
+            builders.put(Type.OPTION, new CommandOptionsBuilder());
+            builders.put(Type.DIRECTIVE, new DirectiveBuilder(
+                    Type.DIRECTIVE.fileName));
+        }
+
+        public void add(CompileCommand compileCommand) {
+            String[] vmOptions = compileCommand.command.vmOpts;
+            Collections.addAll(vmopts, vmOptions);
+            StateBuilder builder = builders.get(compileCommand.type);
+            if (builder == null) {
+                throw new Error("TESTBUG: Missing builder for the type: "
+                        + compileCommand.type);
+            }
+            builder.add(compileCommand);
+        }
+
+        public Scenario build() {
+            boolean isValid = true;
+
+            // Get states from each of the state builders
+            Map<Executable, State> commandFileStates
+                    = builders.get(Type.FILE).getStates();
+            Map<Executable, State> commandOptionStates
+                    = builders.get(Type.OPTION).getStates();
+            Map<Executable, State> directiveFileStates
+                    = builders.get(Type.DIRECTIVE).getStates();
+
+            // Merge states
+            List<Pair<Executable, Callable<?>>> methods = new PoolHelper()
+                    .getAllMethods();
+            Map<Executable, State> finalStates = new HashMap<>();
+            for (Pair<Executable, Callable<?>> pair : methods) {
+                Executable x = pair.first;
+                State commandOptionState = commandOptionStates.get(x);
+                State commandFileState = commandFileStates.get(x);
+                State st = State.merge(commandOptionState, commandFileState);
+                State directiveState = directiveFileStates.get(x);
+                if (directiveState != null) {
+                    st = directiveState;
+                }
+                finalStates.put(x, st);
+            }
+
+            /*
+             * Create a list of commands from options and file
+             * to handle quiet command
+             */
+            List<CompileCommand> ccList = new ArrayList<>();
+            ccList.addAll(builders.get(Type.OPTION).getCompileCommands());
+            ccList.addAll(builders.get(Type.FILE).getCompileCommands());
+
+            // Get all VM options after we build all states and files
+            List<String> options = new ArrayList<>();
+            options.addAll(vmopts);
+            for (StateBuilder<?> builder : builders.values()) {
+                options.addAll(builder.getOptions());
+                isValid &= builder.isValid();
+            }
+            return new Scenario(isValid, options, finalStates, ccList);
+        }
+    }
+}