/*
 * Copyright (c) 2000, 2018, 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
 * @summary Unit test for socket channels
 * @library .. /test/lib
 * @build jdk.test.lib.Utils TestServers
 * @run main Basic
 */

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


public class Basic {

    static java.io.PrintStream out = System.out;

    static void test(TestServers.DayTimeServer daytimeServer) throws Exception {
        InetSocketAddress isa
            = new InetSocketAddress(daytimeServer.getAddress(),
                                    daytimeServer.getPort());
        SocketChannel sc = SocketChannel.open(isa);
        out.println("opened: " + sc);
        /*
        out.println("opts:   " + sc.options());
        ((SocketOpts.IP.TCP)sc.options())
            .noDelay(true)
            .typeOfService(SocketOpts.IP.TOS_THROUGHPUT)
            .broadcast(true)
            .keepAlive(true)
            .linger(42)
            .outOfBandInline(true)
            .receiveBufferSize(128)
            .sendBufferSize(128)
            .reuseAddress(true);
        out.println("        " + sc.options());
        */
        // sc.connect(isa);
        out.println("connected: " + sc);
        ByteBuffer bb = ByteBuffer.allocateDirect(100);
        int n = sc.read(bb);
        bb.position(bb.position() - 2);         // Drop CRLF
        bb.flip();
        CharBuffer cb = Charset.forName("US-ASCII").newDecoder().decode(bb);
        out.println(isa + " says: \"" + cb + "\"");
        sc.socket().shutdownInput();
        out.println("ishut: " + sc);
        sc.socket().shutdownOutput();
        out.println("oshut: " + sc);
        sc.close();
        out.println("closed: " + sc);
    }

    public static void main(String[] args) throws Exception {
        try (TestServers.DayTimeServer dayTimeServer
                = TestServers.DayTimeServer.startNewServer(100)) {
            test(dayTimeServer);
        }
    }

}
