jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java
changeset 2 90ce3da70b43
child 309 bda219d843f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/rmi/registry/altSecurityManager/AltSecurityManager.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,127 @@
+/* 
+ * Copyright 1999-2007 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.
+ */
+
+/* @test
+ * @bug 4183202
+ * @summary rmid and rmiregistry could allow alternate security manager
+ * @author Laird Dornin
+ *
+ * @library ../../testlibrary 
+ * @build StreamPipe TestParams TestLibrary JavaVM 
+ * @build AltSecurityManager TestSecurityManager
+ * @run main/othervm AltSecurityManager
+ */
+
+/**
+ * Ensure that a user is able to specify alternate security managers to
+ * be used in rmiregistry and rmid.  Test specifies a security manager
+ * that throws a runtime exception in its checkListen method, this
+ * will cause rmiregistry and rmid to exit early because those
+ * utilities will be unable to export any remote objects; test fails
+ * if registry and rmid take too long to exit. 
+ */
+public class AltSecurityManager implements Runnable {
+
+    // variable to hold registry and rmid children
+    static JavaVM vm = null;
+
+    // names of utilities
+    static String utilityToStart = null;
+    static String registry = "sun.rmi.registry.RegistryImpl";
+    static String rmid = "sun.rmi.server.Activation";
+
+    // children should exit in at least this time.
+    static long TIME_OUT = 15000;
+
+    public void run() {
+	try {
+	    vm = new JavaVM(utilityToStart,
+			    " -Djava.security.manager=TestSecurityManager",
+			    "");
+	    System.err.println("starting " + utilityToStart);
+	    vm.start();
+	    vm.getVM().waitFor();
+
+	} catch (Exception e) {
+	    TestLibrary.bomb(e);
+	}
+    }
+    
+    /**
+     * Wait to make sure that the registry and rmid exit after
+     * their security manager is set.
+     */
+    public static void ensureExit(String utility) throws Exception {
+	utilityToStart = utility;
+	
+	try {
+	    Thread thread = new Thread(new AltSecurityManager());
+	    System.err.println("expecting RuntimeException for " + 
+			       "checkListen in child process");
+	    long start = System.currentTimeMillis();
+	    thread.start();
+	    thread.join(TIME_OUT);
+	    
+	    long time = System.currentTimeMillis() - start;
+	    System.err.println("waited " + time + " millis for " + 
+			       utilityToStart + " to die");
+
+	    if (time >= TIME_OUT) {
+		
+		// dont pollute other tests; increase the likelihood 
+                // that rmid will go away if it did not exit already.
+		if (utility.equals(rmid)) {
+		    RMID.shutdown();
+		}
+		
+		TestLibrary.bomb(utilityToStart + 
+				 " took too long to die...");
+	    } else {
+		System.err.println(utilityToStart + 
+				   " terminated on time");
+	    }
+	} finally {
+	    vm.destroy();
+	    vm = null;
+	}
+    }
+    
+    public static void main(String[] args) {
+	try {
+	    System.err.println("\nRegression test for bug 4183202\n");
+
+	    // make sure the registry exits early.
+	    ensureExit(registry);
+
+	    // make sure rmid exits early
+	    ensureExit(rmid);
+
+	    System.err.println("test passed");
+
+	} catch (Exception e) {
+	    TestLibrary.bomb(e);
+	} finally {
+	    RMID.removeLog();
+	}
+    }
+}