35 import java.nio.CharBuffer; |
35 import java.nio.CharBuffer; |
36 import java.nio.channels.SocketChannel; |
36 import java.nio.channels.SocketChannel; |
37 import java.nio.charset.StandardCharsets; |
37 import java.nio.charset.StandardCharsets; |
38 import java.util.concurrent.CompletableFuture; |
38 import java.util.concurrent.CompletableFuture; |
39 import java.util.concurrent.CompletionException; |
39 import java.util.concurrent.CompletionException; |
|
40 import java.util.concurrent.CompletionStage; |
40 import java.util.concurrent.TimeUnit; |
41 import java.util.concurrent.TimeUnit; |
41 import java.util.concurrent.TimeoutException; |
42 import java.util.concurrent.TimeoutException; |
42 |
43 |
43 import static jdk.incubator.http.HttpClient.newHttpClient; |
44 import static jdk.incubator.http.HttpClient.newHttpClient; |
44 import static jdk.incubator.http.WebSocket.NORMAL_CLOSURE; |
45 import static jdk.incubator.http.WebSocket.NORMAL_CLOSURE; |
315 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(124))); |
316 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(124))); |
316 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(1))); |
317 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(1))); |
317 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(0))); |
318 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(0))); |
318 } |
319 } |
319 } |
320 } |
|
321 |
|
322 @Test |
|
323 public void testIllegalStateOnClose() throws Exception { |
|
324 DummyWebSocketServer server = new DummyWebSocketServer() { |
|
325 @Override |
|
326 protected void serve(SocketChannel channel) throws IOException { |
|
327 ByteBuffer closeMessage = ByteBuffer.wrap(new byte[]{(byte) 0x88, 0x00}); |
|
328 int wrote = channel.write(closeMessage); |
|
329 System.out.println("Wrote bytes: " + wrote); |
|
330 super.serve(channel); |
|
331 } |
|
332 }; |
|
333 try (server) { |
|
334 server.open(); |
|
335 CompletableFuture<Void> onCloseCalled = new CompletableFuture<>(); |
|
336 CompletableFuture<Void> canClose = new CompletableFuture<>(); |
|
337 |
|
338 WebSocket ws = newHttpClient() |
|
339 .newWebSocketBuilder() |
|
340 .buildAsync(server.getURI(), new WebSocket.Listener() { |
|
341 @Override |
|
342 public CompletionStage<?> onClose(WebSocket webSocket, |
|
343 int statusCode, |
|
344 String reason) { |
|
345 System.out.println("onClose(" + statusCode + ")"); |
|
346 onCloseCalled.complete(null); |
|
347 return canClose; |
|
348 } |
|
349 |
|
350 @Override |
|
351 public void onError(WebSocket webSocket, Throwable error) { |
|
352 System.out.println("onError(" + error + ")"); |
|
353 error.printStackTrace(); |
|
354 } |
|
355 }) |
|
356 .join(); |
|
357 |
|
358 onCloseCalled.join(); // Wait for onClose to be called |
|
359 TimeUnit.SECONDS.sleep(5); // Give canClose some time to reach the WebSocket |
|
360 canClose.complete(null); // Signal to the WebSocket it can close the output |
|
361 |
|
362 assertCompletesExceptionally(ISE, ws.sendText("", true)); |
|
363 assertCompletesExceptionally(ISE, ws.sendText("", false)); |
|
364 assertCompletesExceptionally(ISE, ws.sendText("abc", true)); |
|
365 assertCompletesExceptionally(ISE, ws.sendText("abc", false)); |
|
366 assertCompletesExceptionally(ISE, ws.sendBinary(ByteBuffer.allocate(0), true)); |
|
367 assertCompletesExceptionally(ISE, ws.sendBinary(ByteBuffer.allocate(0), false)); |
|
368 assertCompletesExceptionally(ISE, ws.sendBinary(ByteBuffer.allocate(1), true)); |
|
369 assertCompletesExceptionally(ISE, ws.sendBinary(ByteBuffer.allocate(1), false)); |
|
370 |
|
371 assertCompletesExceptionally(ISE, ws.sendPing(ByteBuffer.allocate(125))); |
|
372 assertCompletesExceptionally(ISE, ws.sendPing(ByteBuffer.allocate(124))); |
|
373 assertCompletesExceptionally(ISE, ws.sendPing(ByteBuffer.allocate(1))); |
|
374 assertCompletesExceptionally(ISE, ws.sendPing(ByteBuffer.allocate(0))); |
|
375 |
|
376 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(125))); |
|
377 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(124))); |
|
378 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(1))); |
|
379 assertCompletesExceptionally(ISE, ws.sendPong(ByteBuffer.allocate(0))); |
|
380 } |
|
381 } |
320 } |
382 } |