import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.WebSocket;
import java.net.http.WebSocket.CloseCode;
import java.net.http.WebSocket.Listener;
import java.net.http.WebSocket.MessagePart;
import java.net.http.WebSocket.Text;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ExecutionException;

/**
 * @test
 * @bug 8129566
 */
public class CloseNegativeTest {

    public static void main(String[] args) 
            throws InterruptedException, ExecutionException, URISyntaxException {
        CompletableFuture<WebSocket> future = WebSocket
                .newBuilder(
                        new URI("ws://sc11136070.us.oracle.com:8080/websocket/textEchoEndpoint"),
                        new MyWsListener())
                .buildAsync();
        WebSocket ws = future.get();
        ws.sendText("Greeting from client!");
        ws.sendClose(CloseCode.NORMAL_CLOSURE, "Bye!").get();
        System.out.println("close sent");
        // wait until the underlying HTTPClient close by default time out (60s)
        Thread.sleep(100000);
        if (!ws.isClosed()) throw new RuntimeException("isClosed is unexpected false");
    }

    static class MyWsListener implements WebSocket.Listener {

        @Override
        public void onOpen(WebSocket ws) {
            System.out.println("on open");
            ws.request(1);
        }

        @Override
        public CompletionStage<?> onText(WebSocket ws, Text message, MessagePart part) {
            
            System.out.println("on text:" + message);
            return null;
        }

        @Override
        public void onClose(WebSocket ws, Optional<CloseCode> code, String reason) {
            System.out.println("on close");
        }
        
    }
}

