

import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.WebSocket;
import java.net.http.WebSocket.MessagePart;
import java.net.http.WebSocket.Text;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

import org.testng.annotations.Test;
/**
 * @test
 * @bug 8129566
 * @summary Test onError behaviors
 * @run testng OnErrorTest
 * 
 */
public class OnErrorTest {
    private static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final Random rnd = new Random();

    private static String randomString( int len ){
        long seed = System.currentTimeMillis();
        System.out.println("Random seed" + seed);
        rnd.setSeed(seed);
        StringBuilder sb = new StringBuilder( len );
        for( int i = 0; i < len; i++ ) 
            sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
        return sb.toString();
    }

    /*
     * Test send message after onError invoked
     */
    @Test
    public void testSendAfterOnError() throws URISyntaxException, InterruptedException, ExecutionException {
        String text = randomString(100);
        CountDownLatch latch = new CountDownLatch(1);
        CompletableFuture<WebSocket> future = WebSocket.newBuilder(
                new URI("ws://sc11136070.us.oracle.com:8080/websocket/textEchoEndpoint"),
                new MyListener(latch)).buildAsync();
        WebSocket ws = future.get();
        ws.sendText(text).get();
        System.out.println("Send #1!");
        latch.await();
        // By the time onError is invoked, no more messages can be sent on this WebSocket
        System.out.println("isClosed:" + ws.isClosed());
        ws.sendText("Message after On Error!").get();
        throw new RuntimeException("No message should be sent after onError!");
    }

    static class MyListener implements WebSocket.Listener {
        private CountDownLatch latch;
        
        MyListener(CountDownLatch latch) {
            this.latch = latch;
        }

        @Override
        public void onOpen(WebSocket webSocket) {
            System.out.println("onOpen!");
            webSocket.request(Long.MAX_VALUE);
        }

        @Override
        public CompletionStage<?> onText(WebSocket webSocket, Text message, MessagePart part) {
            System.out.println("onText!");
            throw new NullPointerException();
        }

        @Override
        public void onError(WebSocket webSocket, Throwable error) {
            System.out.println("onError!");
            latch.countDown();
        }
    }
}

