1 /*
2  * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /* @test
25  * @bug 4115331
26  * @summary synopsis: activatable object fails to go inactive after
27  * unregister/inactive sequence.
28  * @author Ann Wollrath
29  *
30  * @library ../../../testlibrary
31  * @modules java.rmi/sun.rmi.registry
32  *          java.rmi/sun.rmi.server
33  *          java.rmi/sun.rmi.transport
34  *          java.rmi/sun.rmi.transport.tcp
35  *          java.base/sun.nio.ch
36  * @build TestLibrary RMID RMIDSelectorProvider ActivationLibrary ActivateMe UnregisterInactive_Stub
37  * @run main/othervm/policy=security.policy/timeout=240 UnregisterInactive
38  */
39 
40 import java.io.*;
41 import java.rmi.*;
42 import java.rmi.activation.*;
43 import java.rmi.server.*;
44 import java.rmi.registry.*;
45 import java.util.Properties;
46 
47 public class UnregisterInactive
48         extends Activatable
49         implements ActivateMe, Runnable
50 {
51 
UnregisterInactive(ActivationID id, MarshalledObject obj)52     public UnregisterInactive(ActivationID id, MarshalledObject obj)
53         throws ActivationException, RemoteException
54     {
55         super(id, 0);
56     }
57 
ping()58     public void ping()
59     {}
60 
unregister()61     public void unregister() throws Exception {
62         super.unregister(super.getID());
63     }
64 
65     /**
66      * Spawns a thread to deactivate the object.
67      */
shutdown()68     public void shutdown() throws Exception
69     {
70         (new Thread(this,"UnregisterInactive")).start();
71     }
72 
73     /**
74      * Thread to deactivate object. First attempts to make object
75      * inactive (via the inactive method).  If that fails (the
76      * object may still have pending/executing calls), then
77      * unexport the object forcibly.
78      */
run()79     public void run() {
80         ActivationLibrary.deactivate(this, getID());
81     }
82 
main(String[] args)83     public static void main(String[] args) {
84 
85         System.out.println("\nRegression test for bug 4115331\n");
86 
87         TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
88 
89         RMID rmid = null;
90 
91         try {
92             RMID.removeLog();
93             rmid = RMID.createRMIDOnEphemeralPort();
94             rmid.start();
95             System.err.println("Creating descriptor");
96 
97 
98             /* Cause activation groups to have a security policy that will
99              * allow security managers to be downloaded and installed
100              */
101             Properties p = new Properties();
102             // this test must always set policies/managers in its
103             // activation groups
104             p.put("java.security.policy",
105                   TestParams.defaultGroupPolicy);
106             p.put("java.security.manager",
107                   TestParams.defaultSecurityManager);
108 
109             ActivationGroupDesc groupDesc =
110                 new ActivationGroupDesc(p, null);
111             ActivationSystem system = ActivationGroup.getSystem();
112             ActivationGroupID groupID = system.registerGroup(groupDesc);
113             ActivationGroup.createGroup(groupID, groupDesc, 0);
114 
115             ActivationDesc desc =
116                 new ActivationDesc("UnregisterInactive", null, null);
117 
118             System.err.println("Registering descriptor");
119             ActivateMe obj = (ActivateMe) Activatable.register(desc);
120 
121             System.err.println("Activate object via method call");
122             obj.ping();
123 
124             System.err.println("Unregister object");
125             obj.unregister();
126 
127             System.err.println("Make object inactive");
128             obj.shutdown();
129 
130         } catch (Exception e) {
131             TestLibrary.bomb("test failed", e);
132         } finally {
133             rmid.cleanup();
134         }
135     }
136 }
137