/*
 * Copyright (c) 1998, 2008, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/* @test
 * @bug 4148850
 *
 * @summary synopsis: need to obtain remote references securely
 *
 * @author Laird Dornin; code borrowed from Ann Wollrath
 *
 * @library ../../../../testlibrary
 * @build Hello
 * @build HelloImpl
 * @build HelloImpl_Stub
 * @build UseCustomSocketFactory
 * @build Compress
 * @run main/othervm/policy=security.policy/timeout=240 UseCustomSocketFactory
 */

import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;

/**
 * Test ensures that the rmiregistry is capable of running over customx
 * (i.e. compression) client and server socket factories.
 */
public class UseCustomSocketFactory {

    Hello hello = null;

    public static void main(String[] args) {

        Registry registry = null;
        HelloImpl impl = null;

        System.out.println("\nRegression test for bug 4148850\n");

        TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");

        try {
            impl = new HelloImpl();

            /* Make sure that the rmiregistry can communicate over a
             * custom socket.  Ensure that the functionality exists to
             * allow the rmiregistry to be secure.
             */
            registry = LocateRegistry.
                createRegistry(TestLibrary.REGISTRY_PORT,
                               new Compress.CompressRMIClientSocketFactory(),
                               new Compress.CompressRMIServerSocketFactory());
            registry.rebind("/HelloServer", impl);
            checkStub(registry, "RMIServerSocket");

        } catch (Exception e) {
            TestLibrary.bomb("creating registry", e);
        }

        JavaVM serverVM = new JavaVM("HelloImpl", "-Djava.security.policy=" +
                                     TestParams.defaultPolicy, "");

        try {

            /*
             * spawn VM for HelloServer which will download a client socket
             * factory
             */
            serverVM.start();

            synchronized (impl) {

                System.out.println("waiting for remote notification");

                if (!HelloImpl.clientCalledSuccessfully) {
                    impl.wait(75 * 1000);
                }

                if (!HelloImpl.clientCalledSuccessfully) {
                    throw new RuntimeException("Client did not execute call in time...");
                }
            }

            System.err.println("\nRegression test for bug 4148850 passed.\n ");

        } catch (Exception e) {
            TestLibrary.bomb("test failed", e);

        } finally {
            serverVM.destroy();
            try {
                registry.unbind("/HelloServer");
            } catch (Exception e) {
                TestLibrary.bomb("unbinding HelloServer", e);
            }
            TestLibrary.unexport(registry);
            TestLibrary.unexport(impl);
            impl = null;
            registry = null;
        }
    }

    static void checkStub(Object stub, String toCheck) throws RemoteException {
        System.err.println("Ensuring that the stub contains a socket factory string: " +
                           toCheck);
        System.err.println(stub);
        if (stub.toString().indexOf(toCheck) < 0) {
            throw new RemoteException("RemoteStub.toString() did not contain instance of "
                                      + toCheck);
        }
    }
}
