/*
 * Copyright (c) 2002, 2012, 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 4672609 5076965 4739238
 * @summary Test getLocalAddress getLocalPort
 * @library ..
 */

import java.net.*;
import java.nio.channels.*;

public class LocalAddress {
    public static void main(String[] args) throws Exception {
        try (TestServers.EchoServer echoServer
                = TestServers.EchoServer.startNewServer()) {
            test1(echoServer);
        }
    }

    static void test1(TestServers.AbstractServer server) throws Exception {
        InetAddress bogus = InetAddress.getByName("0.0.0.0");
        InetSocketAddress saddr = new InetSocketAddress(
            server.getAddress(), server.getPort());

        //Test1: connect only
        SocketChannel sc = SocketChannel.open();
        try {
            sc.connect(saddr);
            InetAddress ia = sc.socket().getLocalAddress();
            if (ia == null || ia.equals(bogus))
                throw new RuntimeException("test failed");
        } finally {
            sc.close();
        }

        //Test2: bind and connect
        sc = SocketChannel.open();
        try {
            sc.socket().bind(new InetSocketAddress(0));
            if (sc.socket().getLocalPort() == 0)
                throw new RuntimeException("test failed");
            sc.socket().connect(saddr);
            InetAddress ia = sc.socket().getLocalAddress();
            if (ia == null || ia.isAnyLocalAddress())
                throw new RuntimeException("test failed");
        } finally {
            sc.close();
        }

    }
}
