/*
 * Copyright 2006 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 6442073
 * @summary Check getXXX methods for local/remote port/address/socketaddress
 *          match socket spec for unbound case
 */
import java.net.*;
import java.nio.channels.*;

public class UnboundSocketTests {

    static int failures = 0;

    static void check(String msg, Object actual, Object expected) {
        System.out.format("%s expected: %s, actual: %s", msg, expected, actual);
        if (actual == expected) {
            System.out.println(" [PASS]");
        } else {
            System.out.println(" [FAIL]");
            failures++;
        }
    }

    static void checkIsAnyLocalAddress(String msg, InetAddress actual) {
        System.out.format("%s actual: %s", msg, actual);
        if (actual.isAnyLocalAddress()) {
            System.out.println(" [PASS]");
        } else {
            System.out.println(" [FAIL]");
            failures++;
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println("\n-- SocketChannel --");

        SocketChannel sc = SocketChannel.open();

        check("getLocalPort()", sc.socket().getLocalPort(), -1);
        checkIsAnyLocalAddress("getLocalAddress()",
            sc.socket().getLocalAddress());
        check("getLocalSocketAddress()", sc.socket().getLocalSocketAddress(), null);

        check("getPort()", sc.socket().getPort(), 0);
        check("getInetAddress()", sc.socket().getInetAddress(), null);
        check("getRemoteSocketAddress()", sc.socket().getRemoteSocketAddress(), null);


        System.out.println("\n-- ServerSocketChannel --");

        ServerSocketChannel ssc = ServerSocketChannel.open();

        check("getLocalPort()", ssc.socket().getLocalPort(), -1);
        check("getInetAddress()", ssc.socket().getInetAddress(), null);
        check("getLocalSocketAddress()", ssc.socket().getLocalSocketAddress(), null);

        System.out.println("\n-- DatagramChannel --");

        DatagramChannel dc = DatagramChannel.open();

        // not specified
        check("getLocalPort()", dc.socket().getLocalPort(), 0);

        checkIsAnyLocalAddress("getLocalAddress()",
            dc.socket().getLocalAddress());
        check("getLocalSocketAddress()", dc.socket().getLocalSocketAddress(), null);

        check("getPort()", dc.socket().getPort(), -1);
        check("getInetAddress()", dc.socket().getInetAddress(), null);
        check("getRemoteSocketAddress()", dc.socket().getRemoteSocketAddress(), null);

        if (failures > 0) {
            throw new RuntimeException(failures + " sub-tests(s) failed.");
        }

    }
}
