/*
 * Copyright 2005 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.
 */

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.rmi.ssl.SslRMIClientSocketFactory;

public class RmiRegistrySslTest {

    static final String ok = "OK: Found jmxrmi entry in RMIRegistry!";
    static final String ko = "KO: Did not find jmxrmi entry in RMIRegistry!";
    static final String ko2 = "KO: Did not get expected exception!";
    static final String okException = "OK: Got expected exception!";
    static final String koException = "KO: Got unexpected exception!";

    public static void main(String args[]) throws Exception {

        System.out.println("RmiRegistry lookup...");

        String testID = System.getProperty("testID");

        if ("Test1".equals(testID)) {
            try {
                Registry registry = LocateRegistry.getRegistry(4444);
                String[] list = registry.list();
                if ("jmxrmi".equals(list[0])) {
                    System.out.println(ok);
                } else {
                    System.out.println(ko);
                    throw new IllegalArgumentException(ko);
                }
            } catch (Exception e) {
                System.out.println(koException);
                e.printStackTrace(System.out);
                throw e;
            }
        }

        if ("Test2".equals(testID)) {
            try {
                Registry registry = LocateRegistry.getRegistry(4444);
                String[] list = registry.list();
                throw new IllegalArgumentException(ko2);
            } catch (Exception e) {
                System.out.println(okException);
                e.printStackTrace(System.out);
                return;
            }
        }

        if ("Test3".equals(testID)) {
            try {
                Registry registry = LocateRegistry.getRegistry(
                    null, 4444, new SslRMIClientSocketFactory());
                String[] list = registry.list();
                if ("jmxrmi".equals(list[0])) {
                    System.out.println(ok);
                } else {
                    System.out.println(ko);
                    throw new IllegalArgumentException(ko);
                }
            } catch (Exception e) {
                System.out.println(koException);
                e.printStackTrace(System.out);
                throw e;
            }
        }
    }
}
