jdk/test/java/rmi/testlibrary/RMID.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/rmi/testlibrary/RMID.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,324 @@
+/*
+ * Copyright 1998-2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ *
+ */
+
+import java.io.*;
+import java.rmi.*;
+import java.rmi.activation.*;
+import java.util.Properties;
+
+/**
+ * Utility class that creates an instance of rmid with a policy
+ * file of name <code>TestParams.defaultPolicy</code>.
+ *
+ * Activation groups should run with the same security manager as the
+ * test.
+ */
+public class RMID extends JavaVM {
+
+    public static String MANAGER_OPTION="-Djava.security.manager=";
+
+    /** Test port for rmid */
+    private final int port;
+
+    /** Initial log name */
+    protected static String log = "log";
+    /** rmid's logfile directory; currently must be "." */
+    protected static String LOGDIR = ".";
+
+    private static void mesg(Object mesg) {
+        System.err.println("RMID: " + mesg.toString());
+    }
+
+    /** make test options and arguments */
+    private static String makeOptions(boolean debugExec) {
+
+        String options = " -Dsun.rmi.server.activation.debugExec=" +
+            debugExec;
+        // +
+        //" -Djava.compiler= ";
+
+        // if test params set, want to propagate them
+        if (!TestParams.testSrc.equals("")) {
+            options += " -Dtest.src=" + TestParams.testSrc + " ";
+        }
+        //if (!TestParams.testClasses.equals("")) {
+        //    options += " -Dtest.classes=" + TestParams.testClasses + " ";
+        //}
+        options += " -Dtest.classes=" + TestParams.testClasses //;
+         +
+         " -Djava.rmi.server.logLevel=v ";
+
+        // +
+        // " -Djava.security.debug=all ";
+
+        return options;
+    }
+
+    private static String makeArgs(boolean includePortArg, int port) {
+        String propagateManager = null;
+
+        // rmid will run with a security manager set, but no policy
+        // file - it should not need one.
+        if (System.getSecurityManager() == null) {
+            propagateManager = MANAGER_OPTION +
+                TestParams.defaultSecurityManager;
+        } else {
+            propagateManager = MANAGER_OPTION +
+                System.getSecurityManager().getClass().getName();
+        }
+
+        // getAbsolutePath requires permission to read user.dir
+        String args =
+            " -log " + (new File(LOGDIR, log)).getAbsolutePath();
+
+        if (includePortArg) {
+            args += " -port " + port;
+        }
+
+        // +
+        //      " -C-Djava.compiler= ";
+
+        // if test params set, want to propagate them
+        if (!TestParams.testSrc.equals("")) {
+            args += " -C-Dtest.src=" + TestParams.testSrc;
+        }
+        if (!TestParams.testClasses.equals("")) {
+            args += " -C-Dtest.classes=" + TestParams.testClasses;
+        }
+        args += " " + getCodeCoverageArgs();
+        return args;
+    }
+
+    /**
+     * Routine that creates an rmid that will run with or without a
+     * policy file.
+     */
+    public static RMID createRMID() {
+        return createRMID(System.out, System.err, true);
+    }
+
+    public static RMID createRMID(boolean debugExec) {
+        return createRMID(System.out, System.err, debugExec);
+    }
+
+    public static RMID createRMID(OutputStream out, OutputStream err) {
+        return createRMID(out, err, true);
+    }
+
+    public static RMID createRMID(OutputStream out, OutputStream err,
+                                  boolean debugExec)
+    {
+        return createRMID(out, err, debugExec, true,
+                          TestLibrary.RMID_PORT);
+    }
+
+    public static RMID createRMID(OutputStream out, OutputStream err,
+                                  boolean debugExec, boolean includePortArg,
+                                  int port)
+    {
+        String options = makeOptions(debugExec);
+        String args = makeArgs(includePortArg, port);
+        RMID rmid = new RMID("sun.rmi.server.Activation", options, args,
+                             out, err, port);
+        rmid.setPolicyFile(TestParams.defaultRmidPolicy);
+
+        return rmid;
+    }
+
+
+    /**
+     * Test RMID should be created with the createRMID method.
+     */
+    protected RMID(String classname, String options, String args,
+                   OutputStream out, OutputStream err, int port)
+    {
+        super(classname, options, args, out, err);
+        this.port = port;
+    }
+
+    public static void removeLog() {
+        /*
+         * Remove previous log file directory before
+         * starting up rmid.
+         */
+        File f = new File(LOGDIR, log);
+
+        if (f.exists()) {
+            mesg("removing rmid's old log file...");
+            String[] files = f.list();
+
+            if (files != null) {
+                for (int i=0; i<files.length; i++) {
+                    (new File(f, files[i])).delete();
+                }
+            }
+
+            if (f.delete() != true) {
+                mesg("\t" + " unable to delete old log file.");
+            }
+        }
+    }
+
+    /**
+     * This method is used for adding arguments to rmid (not its VM)
+     * for passing as VM options to its child group VMs.
+     * Returns the extra command line arguments required
+     * to turn on jcov code coverage analysis for rmid child VMs.
+     */
+    protected static String getCodeCoverageArgs() {
+        return TestLibrary.getExtraProperty("rmid.jcov.args","");
+    }
+
+    public void start() throws IOException {
+        start(10000);
+    }
+
+    public void slowStart() throws IOException {
+        start(60000);
+    }
+
+    public void start(long waitTime) throws IOException {
+
+        if (getVM() != null) return;
+
+        // if rmid is already running, then the test will fail with
+        // a well recognized exception (port already in use...).
+
+        mesg("starting rmid...");
+        super.start();
+
+        int slopFactor = 1;
+        try {
+            slopFactor = Integer.valueOf(
+                TestLibrary.getExtraProperty("jcov.sleep.multiplier","1"));
+        } catch (NumberFormatException ignore) {}
+        waitTime = waitTime * slopFactor;
+
+        // give rmid time to come up
+        do {
+            try {
+                Thread.sleep(Math.min(waitTime, 10000));
+            } catch (InterruptedException ie) {
+                Thread.currentThread().interrupt();
+            }
+            waitTime -= 10000;
+
+            // is rmid present?
+            if (ActivationLibrary.rmidRunning(port)) {
+                mesg("finished starting rmid.");
+                return;
+            }
+        } while (waitTime > 0);
+        TestLibrary.bomb("start rmid failed... giving up", null);
+    }
+
+    public void restart() throws IOException {
+        destroy();
+        start();
+    }
+
+    /**
+     * Ask rmid to shutdown gracefully using a remote method call.
+     * catch any errors that might occur from rmid not being present
+     * at time of shutdown invocation.
+     *
+     * Shutdown does not nullify possible references to the rmid
+     * process object (destroy does though).
+     */
+    public static void shutdown() {
+        shutdown(TestLibrary.RMID_PORT);
+    }
+
+    public static void shutdown(int port) {
+
+        try {
+            ActivationSystem system = null;
+
+            try {
+                mesg("getting a reference to the activation system");
+                system = (ActivationSystem) Naming.lookup("//:" +
+                    port +
+                    "/java.rmi.activation.ActivationSystem");
+                mesg("obtained a reference to the activation system");
+            } catch (java.net.MalformedURLException mue) {
+            }
+
+            if (system == null) {
+                TestLibrary.bomb("reference to the activation system was null");
+            }
+            system.shutdown();
+
+        } catch (Exception e) {
+            mesg("caught exception trying to shutdown rmid");
+            mesg(e.getMessage());
+            e.printStackTrace();
+        }
+
+        try {
+            // wait for the shutdown to happen
+            Thread.sleep(5000);
+        } catch (InterruptedException ie) {
+            Thread.currentThread().interrupt();
+        }
+
+        mesg("testlibrary finished shutting down rmid");
+    }
+
+    /**
+     * Ask rmid to shutdown gracefully but then destroy the rmid
+     * process if it does not exit by itself.  This method only works
+     * if rmid is a child process of the current VM.
+     */
+    public void destroy() {
+
+        // attempt graceful shutdown of the activation system on
+        // TestLibrary.RMID_PORT
+        shutdown(port);
+
+        if (vm != null) {
+            try {
+                // destroy rmid if it is still running...
+                try {
+                    vm.exitValue();
+                    mesg("rmid exited on shutdown request");
+                } catch (IllegalThreadStateException illegal) {
+                    mesg("Had to destroy RMID's process " +
+                         "using Process.destroy()");
+                    super.destroy();
+                }
+
+            } catch (Exception e) {
+                mesg("caught exception trying to destroy rmid: " +
+                     e.getMessage());
+                e.printStackTrace();
+            }
+
+            // rmid will not restart if its process is not null
+            vm = null;
+        }
+    }
+}