jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup.java
changeset 2 90ce3da70b43
child 309 bda219d843f6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/rmi/activation/ActivationSystem/unregisterGroup/UnregisterGroup.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,261 @@
+/* 
+ * Copyright 1998-2000 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 4134233
+ * @bug 4213186
+ *
+ * @summary synopsis: ActivationSystem.unregisterGroup should unregister objects in group
+ * @author Ann Wollrath
+ *
+ * @library ../../../testlibrary
+ * @build TestLibrary RMID JavaVM StreamPipe
+ * @build ActivateMe CallbackInterface
+ * @build UnregisterGroup
+ * @build UnregisterGroup_Stub
+ * @build Callback_Stub
+ * @run main/othervm/policy=security.policy/timeout=480 UnregisterGroup
+ */
+
+import java.io.*;
+import java.rmi.*;
+import java.rmi.activation.*;
+import java.rmi.server.*;
+import java.rmi.registry.*;
+import java.util.Properties;
+
+class Callback extends UnicastRemoteObject implements CallbackInterface {
+
+  public static int num_deactivated = 0;
+
+  public Callback() throws RemoteException { super(); }
+
+  public void inc() throws RemoteException {
+    incNumDeactivated();
+  }
+
+  public synchronized int getNumDeactivated() throws RemoteException {
+    return(num_deactivated);
+  }
+
+  public synchronized void incNumDeactivated() {
+    num_deactivated++;
+  }
+
+}
+
+public class UnregisterGroup
+	extends Activatable
+	implements ActivateMe, Runnable
+{
+
+    private static Exception exception = null;
+    private static String error = null;
+    private static boolean done = false;
+    private static ActivateMe lastResortExitObj = null;
+    private static final int NUM_OBJECTS = 10;
+    private static int PORT = 2006;
+
+    public UnregisterGroup(ActivationID id, MarshalledObject mobj)
+	throws Exception
+    {
+	super(id, 0);
+    }
+
+    public void ping()
+    {}
+
+    public void unregister() throws Exception {
+	super.unregister(super.getID());
+    }
+    
+    /**
+     * Spawns a thread to deactivate the object.
+     */
+    public void shutdown() throws Exception {
+	(new Thread(this,"UnregisterGroup")).start();
+    }
+
+    /**
+     * To support exiting of group VM as a last resort
+     */
+    public void justGoAway() {
+	System.exit(0);
+    }
+
+    /**
+     * Thread to deactivate object. First attempts to make object
+     * inactive (via the inactive method).  If that fails (the
+     * object may still have pending/executing calls), then
+     * unexport the object forcibly.
+     */
+    public void run() {
+
+	ActivationLibrary.deactivate(this, getID());
+	System.err.println("\tActivationLibrary.deactivate returned");
+
+	try {
+	    CallbackInterface cobj =
+		(CallbackInterface)Naming.lookup("//:" + PORT + "/Callback");
+	    cobj.inc();
+	} catch (Exception e) {
+	    System.err.println("cobj.inc exception");
+	    e.printStackTrace();
+	}
+
+    }
+
+    public static void main(String[] args) {
+
+	Registry registry;
+
+ 	System.err.println("\nRegression test for bug 4134233\n");
+	
+	TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");		
+	RMID rmid = null;
+	
+	try {
+	    RMID.removeLog();
+	    rmid = RMID.createRMID();
+	    rmid.start();
+
+	    /* Cause activation groups to have a security policy that will
+	     * allow security managers to be downloaded and installed
+	     */
+	    final Properties p = new Properties();
+	    // this test must always set policies/managers in its
+	    // activation groups
+	    p.put("java.security.policy", 
+		  TestParams.defaultGroupPolicy);
+	    p.put("java.security.manager", 
+		  TestParams.defaultSecurityManager);
+
+	    //final int NUM_OBJECTS = 10;
+	    
+	    Thread t = new Thread() {
+		public void run () {
+		    try {
+			System.err.println("Creating group descriptor");
+			ActivationGroupDesc groupDesc =
+			    new ActivationGroupDesc(p, null);
+			ActivationSystem system = ActivationGroup.getSystem();
+			ActivationGroupID groupID =
+			    system.registerGroup(groupDesc);
+
+			ActivateMe[] obj = new ActivateMe[NUM_OBJECTS];
+
+			for (int i = 0; i < NUM_OBJECTS; i++) {
+			    System.err.println("Creating descriptor: " + i);
+			    ActivationDesc desc =
+				new ActivationDesc(groupID, "UnregisterGroup",
+						   null, null);
+			    System.err.println("Registering descriptor: " + i);
+			    obj[i] = (ActivateMe) Activatable.register(desc);
+			    System.err.println("Activating object: " + i);
+			    obj[i].ping();
+			}
+			lastResortExitObj = obj[0];
+
+			System.err.println("Unregistering group");
+			system.unregisterGroup(groupID);
+
+			try {
+			    System.err.println("Get the group descriptor");
+			    system.getActivationGroupDesc(groupID);
+			    error = "test failed: group still registered";
+			} catch (UnknownGroupException e) {
+			    System.err.println("Test passed: " +
+					       "group unregistered");
+			}
+
+
+			/*
+			 * Deactivate objects so group VM will exit.
+			 */
+			for (int i = 0; i < NUM_OBJECTS; i++) {
+			    System.err.println("Deactivating object: " + i);
+			    obj[i].shutdown();
+			    obj[i] = null;
+			}
+			lastResortExitObj = null;
+
+		    } catch (Exception e) {
+			exception = e;
+		    }
+
+		    done = true;
+		}
+	    };
+
+	    t.start();
+	    t.join(120000);
+
+	    if (exception != null) {
+		TestLibrary.bomb("test failed", exception);
+	    } else if (error != null) {
+		TestLibrary.bomb(error, null);
+	    } else if (!done) {
+		TestLibrary.bomb("test failed: not completed before timeout", null);
+	    } else {
+		System.err.println("Test passed");
+	    }
+
+	    
+	} catch (Exception e) {
+	    TestLibrary.bomb("test failed", e);
+	} finally {
+	    if (lastResortExitObj != null) {
+		try {
+		    lastResortExitObj.justGoAway();
+		} catch (Exception munch) {
+		}
+	    }
+
+	    // Wait for the object deactivation to take place first
+	    try {
+
+ 		// create reg and export callback object
+ 		registry = LocateRegistry.createRegistry(PORT);
+ 		Callback robj = new Callback();
+ 		registry.bind("Callback", robj);
+
+ 		//get the callback object 
+ 		int maxwait=30;
+ 		int nd = robj.getNumDeactivated();
+ 		while ((nd < NUM_OBJECTS) && (maxwait> 0)) {
+		    System.err.println("num_deactivated="+nd);
+		    try {
+			Thread.sleep(1000);
+		    } catch (InterruptedException ie) {}
+		    maxwait--;
+		    nd = robj.getNumDeactivated();
+ 		}
+	    } catch (Exception ce) {
+ 		System.err.println("E:"+ce);
+ 		ce.printStackTrace();
+	    }
+
+	    ActivationLibrary.rmidCleanup(rmid);
+	}
+    }
+}