From a3625fbaa95f3a784e9defbb49b0b907620ef15d Mon Sep 17 00:00:00 2001 From: Naja Melan Date: Thu, 12 Sep 2019 01:12:42 +0200 Subject: [PATCH] integration test verifying that we can read messages after initiating close handshake. --- tests/receive_after_init_close.rs | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/receive_after_init_close.rs diff --git a/tests/receive_after_init_close.rs b/tests/receive_after_init_close.rs new file mode 100644 index 0000000..4cea07c --- /dev/null +++ b/tests/receive_after_init_close.rs @@ -0,0 +1,61 @@ +//! Verifies that we can read data messages even if we have initiated a close handshake, +//! but before we got confirmation. + +use std::net::TcpListener; +use std::process::exit; +use std::thread::{sleep, spawn}; +use std::time::Duration; + +use tungstenite::{accept, connect, Error, Message}; +use url::Url; + +#[test] +fn test_receive_after_init_close() { + env_logger::init(); + + spawn(|| { + sleep(Duration::from_secs(5)); + println!("Unit test executed too long, perhaps stuck on WOULDBLOCK..."); + exit(1); + }); + + let server = TcpListener::bind("127.0.0.1:3013").unwrap(); + + let client_thread = spawn(move || { + let (mut client, _) = connect(Url::parse("ws://localhost:3013/socket").unwrap()).unwrap(); + + client + .write_message(Message::Text("Hello WebSocket".into())) + .unwrap(); + + let message = client.read_message().unwrap(); // receive close from server + assert!(message.is_close()); + + let err = client.read_message().unwrap_err(); // now we should get ConnectionClosed + match err { + Error::ConnectionClosed => {} + _ => panic!("unexpected error"), + } + }); + + let client_handler = server.incoming().next().unwrap(); + let mut client_handler = accept(client_handler.unwrap()).unwrap(); + + client_handler.close(None).unwrap(); // send close to client + + // This read should succeed even though we already initiated a close + let message = client_handler.read_message().unwrap(); + assert_eq!(message.into_data(), b"Hello WebSocket"); + + assert!(client_handler.read_message().unwrap().is_close()); // receive acknowledgement + + let err = client_handler.read_message().unwrap_err(); // now we should get ConnectionClosed + match err { + Error::ConnectionClosed => {} + _ => panic!("unexpected error"), + } + + drop(client_handler); + + client_thread.join().unwrap(); +}