use fastwebsockets::{Role, WebSocket};
use fastwebsockets_stream::{PayloadType, WebSocketStream};
use std::time::Duration;
use tokio::io::{AsyncReadExt, AsyncWriteExt, DuplexStream};
fn connected_pair() -> (WebSocket<DuplexStream>, WebSocket<DuplexStream>) {
let (client_io, server_io) = tokio::io::duplex(64 * 1024);
let client = WebSocket::after_handshake(client_io, Role::Client);
let server = WebSocket::after_handshake(server_io, Role::Server);
(client, server)
}
#[tokio::test]
async fn flush_after_write_succeeds() {
let (client, server) = connected_pair();
let mut client_stream = WebSocketStream::new(client, PayloadType::Binary);
let mut server_stream = WebSocketStream::new(server, PayloadType::Binary);
let n = client_stream.write(b"Hello!").await.unwrap();
assert_eq!(n, 6);
client_stream.flush().await.unwrap();
let mut buf = [0u8; 6];
server_stream.read_exact(&mut buf).await.unwrap();
assert_eq!(&buf, b"Hello!");
client_stream.flush().await.unwrap();
}
#[tokio::test]
async fn empty_frame_does_not_signal_eof() {
let (client, server) = connected_pair();
let mut client_stream = WebSocketStream::new(client, PayloadType::Binary);
let mut server_stream = WebSocketStream::new(server, PayloadType::Binary);
client_stream.write(b"").await.unwrap();
client_stream.write(b"Hello!").await.unwrap();
let mut buf = [0u8; 6];
let n = tokio::time::timeout(Duration::from_secs(5), server_stream.read(&mut buf))
.await
.expect("timed out - an empty frame may be incorrectly signalling EOF")
.unwrap();
assert_eq!(n, 6);
assert_eq!(&buf, b"Hello!");
assert!(!server_stream.is_closed());
}
#[tokio::test]
async fn into_inner_returns_websocket_when_idle() {
let (client, _server) = connected_pair();
let stream = WebSocketStream::new(client, PayloadType::Binary);
assert!(!stream.is_closed());
assert!(stream.into_inner().is_some());
}