hotspot/test/compiler/aot/verification/vmflags/BasicFlagsChange.java
changeset 42650 1f304d0c888b
child 43464 f38fde4a6b52
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/aot/verification/vmflags/BasicFlagsChange.java	Sun Dec 11 19:07:04 2016 -0800
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2016, 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.aot.verification.vmflags;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.Utils;
+import compiler.aot.HelloWorldPrinter;
+import compiler.aot.AotCompiler;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A class with common launch and check logic for testing vm flags change
+ */
+public class BasicFlagsChange {
+    private static final boolean CAN_LOAD = true;
+    /**
+     * A main method which parse arguments, expecting vm option name to
+     *     be present, launch java process with combinations of provided flag
+     *     enabled/disable in aot library and vm flag expecting different flag
+     *     values in library and vm to be negative cases
+     * @param args should have true/false treated as "loadAlways" for
+     *     tracked/non-tracked options and vm option name
+     */
+    public static void main(String args[]) {
+        if (args.length != 2) {
+            throw new Error("TESTBUG: Unexpected number of arguments: "
+                    + args.length);
+        }
+        if (!"false".equals(args[0]) && !"true".equals(args[0])) {
+            throw new Error("TESTBUG: unexpected value of 1st parameter: "
+                    + args[0]);
+        }
+        boolean loadAlways = Boolean.parseBoolean(args[0]);
+        String optName = args[1];
+        String optEnabled = "-XX:+" + optName;
+        String optDisabled = "-XX:-" + optName;
+        String enabledLibName = "libEnabled.so";
+        String disabledLibName = "libDisabled.so";
+        // compile libraries
+        compileLibrary(optEnabled, enabledLibName);
+        compileLibrary(optDisabled, disabledLibName);
+        // run 4 combinations
+        runAndCheck(optEnabled, enabledLibName, CAN_LOAD || loadAlways);
+        runAndCheck(optDisabled, enabledLibName, !CAN_LOAD || loadAlways);
+        runAndCheck(optEnabled, disabledLibName, !CAN_LOAD || loadAlways);
+        runAndCheck(optDisabled, disabledLibName, CAN_LOAD || loadAlways);
+    }
+
+    private static void compileLibrary(String option, String libName) {
+        String className = BasicFlagsChange.class.getName();
+        List<String> extraOpts = new ArrayList<>();
+        extraOpts.add(option);
+        extraOpts.add("-classpath");
+        extraOpts.add(Utils.TEST_CLASS_PATH + File.pathSeparator + Utils.TEST_SRC);
+        AotCompiler.launchCompiler(libName, className + ".class", extraOpts, null);
+    }
+
+    private static void runAndCheck(String option, String libName,
+            boolean positiveCase) {
+        ProcessBuilder pb;
+        try {
+            /* using +PrintAOT to check if library has been loaded or skipped,
+               so, a message like "skipped $pathTolibrary aot library" or
+               "loaded    $pathToLibrary  aot library" is present for cases of
+               incompatible or compatible flags respectively */
+            pb = ProcessTools.createJavaProcessBuilder(true, "-XX:+UseAOT",
+                    "-XX:+PrintAOT", "-XX:AOTLibrary=./" + libName, option,
+                    HelloWorldPrinter.class.getName());
+        } catch (Exception ex) {
+            throw new Error("Problems creating ProcessBuilder using " + option
+                    + " Caused by: " + ex, ex);
+        }
+        OutputAnalyzer oa;
+        try {
+            oa = ProcessTools.executeProcess(pb);
+        } catch (Exception ex) {
+            throw new Error("Problems execution child process using case "
+                    + option + " Caused by: " + ex, ex);
+        }
+        oa.shouldHaveExitValue(0);
+        oa.shouldContain(HelloWorldPrinter.MESSAGE);
+        if (positiveCase) {
+            oa.shouldContain("loaded    ./" + libName + "  aot library");
+        } else {
+            oa.shouldContain("skipped ./" + libName + "  aot library");
+        }
+    }
+}