changeset 22777:7ffade01e1ff

Utility methods for spawning subprocesses in unit tests.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 08 Oct 2015 14:29:02 +0200
parents 4899ae79cf25
children 60d59d17d419
files graal/com.oracle.graal.test/src/com/oracle/graal/test/SubprocessUtil.java
diffstat 1 files changed, 85 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/SubprocessUtil.java	Thu Oct 08 14:29:02 2015 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015, 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 com.oracle.graal.test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+
+/**
+ * Utility methods for spawning a VM in a subprocess during unit tests.
+ */
+public final class SubprocessUtil {
+
+    private SubprocessUtil() {
+    }
+
+    /**
+     * Gets the command line for the current process.
+     *
+     * @return the command line arguments for the current process or {@code null} if they are not
+     *         available
+     */
+    public static List<String> getProcessCommandLine() {
+        String processArgsFile = System.getenv().get("MX_SUBPROCESS_COMMAND_FILE");
+        if (processArgsFile != null) {
+            try {
+                return Files.readAllLines(new File(processArgsFile).toPath());
+            } catch (IOException e) {
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Gets the command line used to start the current Java VM, including all VM arguments, but not
+     * including the main class or any Java arguments. This can be used to spawn an identical VM,
+     * but running different Java code.
+     */
+    public static List<String> getVMCommandLine() {
+        List<String> args = getProcessCommandLine();
+        if (args == null) {
+            return null;
+        } else {
+            int index = findMainClassIndex(args);
+            return args.subList(0, index);
+        }
+    }
+
+    private static int findMainClassIndex(List<String> commandLine) {
+        int i = 1; // Skip the java executable
+        while (i < commandLine.size()) {
+            String s = commandLine.get(i);
+            if (s.charAt(0) != '-') {
+                return i;
+            } else if (s.equals("-cp") || s.equals("-classpath")) {
+                i += 2;
+            } else {
+                i++;
+            }
+        }
+        throw new InternalError();
+    }
+
+}