use fastwebsockets::{Role, WebSocket};
use fastwebsockets_stream::{PayloadType, WebSocketStream};
use std::time::Duration;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::test]
async fn write_flush_shutdown_error_after_fatal_read_error() {
let (mut client_io, server_io) = tokio::io::duplex(1024);
let server = WebSocket::after_handshake(server_io, Role::Server);
let mut server_stream = WebSocketStream::new(server, PayloadType::Binary);
client_io.write_all(&[0x82]).await.unwrap();
drop(client_io);
let mut buf = [0u8; 16];
tokio::time::timeout(Duration::from_secs(5), server_stream.read(&mut buf))
.await
.expect("timed out - a mid-frame disconnect should error, not hang")
.unwrap_err();
let write_err = server_stream.write(b"x").await.unwrap_err();
assert_eq!(write_err.to_string(), "Websocket not available");
let flush_err = server_stream.flush().await.unwrap_err();
assert_eq!(flush_err.to_string(), "Websocket not available");
let shutdown_err = server_stream.shutdown().await.unwrap_err();
assert_eq!(shutdown_err.to_string(), "Websocket not available");
let second_read_err = server_stream.read(&mut buf).await.unwrap_err();
assert_eq!(second_read_err.to_string(), "Websocket not available");
}