test/java/rmi/transport/pinClientSocketFactory/PinClientSocketFactory.java

Print this page

        

*** 29,40 **** * particular, after the stub has become unreachable and all * connections to its endpoint have been closed, then the factory * should become unreachable too (through the RMI implementation). * @author Peter Jones * - * @library ../../testlibrary - * @build TestLibrary * @run main/othervm -Dsun.rmi.transport.connectionTimeout=2000 * PinClientSocketFactory */ import java.io.IOException; --- 29,38 ----
*** 42,66 **** import java.io.Serializable; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.net.ServerSocket; import java.net.Socket; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.RMIClientSocketFactory; import java.rmi.server.RMIServerSocketFactory; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class PinClientSocketFactory { - private static final int PORT = TestLibrary.getUnusedRandomPort(); private static final int SESSIONS = 50; public interface Factory extends Remote { Session getSession() throws RemoteException; } --- 40,65 ---- import java.io.Serializable; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.net.ServerSocket; import java.net.Socket; + import java.rmi.RMISecurityManager; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.RMIClientSocketFactory; import java.rmi.server.RMIServerSocketFactory; + import java.rmi.server.RMISocketFactory; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class PinClientSocketFactory { private static final int SESSIONS = 50; public interface Factory extends Remote { Session getSession() throws RemoteException; }
*** 85,107 **** } public static void main(String[] args) throws Exception { System.err.println("\nRegression test for bug 4486732\n"); Factory factoryImpl = new FactoryImpl(); Factory factoryStub = (Factory) UnicastRemoteObject.exportObject(factoryImpl, 0); for (int i = 0; i < SESSIONS; i++) { Session session = factoryStub.getSession(); session.ping(); } UnicastRemoteObject.unexportObject(factoryImpl, true); - Registry registryImpl = LocateRegistry.createRegistry(PORT); CSF csf = new CSF(); Reference<CSF> registryRef = new WeakReference<CSF>(csf); ! Registry registryStub = LocateRegistry.getRegistry("", PORT, csf); csf = null; registryStub.list(); registryStub = null; UnicastRemoteObject.unexportObject(registryImpl, true); --- 84,111 ---- } public static void main(String[] args) throws Exception { System.err.println("\nRegression test for bug 4486732\n"); + // Delegate to capture the actual port being used by the server socket. + DelegateRMISocketFactory delegateFactory = new DelegateRMISocketFactory(); + RMISocketFactory.setSocketFactory(delegateFactory); + Factory factoryImpl = new FactoryImpl(); Factory factoryStub = (Factory) UnicastRemoteObject.exportObject(factoryImpl, 0); for (int i = 0; i < SESSIONS; i++) { Session session = factoryStub.getSession(); session.ping(); } UnicastRemoteObject.unexportObject(factoryImpl, true); + Registry registryImpl = LocateRegistry.createRegistry(DelegateRMISocketFactory.EPHEMERAL_PORT); + int port = delegateFactory.getServerPort(); CSF csf = new CSF(); Reference<CSF> registryRef = new WeakReference<CSF>(csf); ! Registry registryStub = LocateRegistry.getRegistry("", port, csf); csf = null; registryStub.list(); registryStub = null; UnicastRemoteObject.unexportObject(registryImpl, true);
*** 165,170 **** --- 169,202 ---- SSF() { } public ServerSocket createServerSocket(int port) throws IOException { return new ServerSocket(port); } } + + /** Delegate socket factory to support listening on an ephemeral port. */ + private static class DelegateRMISocketFactory extends RMISocketFactory { + // Map requests for port 9999 to the empemeral port. + public static final int EPHEMERAL_PORT = 9999; + + private static RMISocketFactory factory = RMISocketFactory.getDefaultSocketFactory(); + private int port; + + @Override + public ServerSocket createServerSocket(int p) throws IOException { + if (p == EPHEMERAL_PORT) + p = 0; + ServerSocket ss = new ServerSocket(p); + port = ss.getLocalPort(); + return ss; + } + + @Override + public Socket createSocket(String host, int p) throws IOException { + return factory.createSocket(host, p); + } + + /** Returns the port of the most recently created server socket */ + public int getServerPort() { + return port; + } + } }