-
Notifications
You must be signed in to change notification settings - Fork 209
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #66 from snapview/fix-close
Fix error `ConnectionClosed` never returned to server when server initiated close
- Loading branch information
Showing
3 changed files
with
72 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
//! Verifies that the server returns a `ConnectionClosed` error when the connection | ||
//! is closedd from the server's point of view and drop the underlying tcp socket. | ||
|
||
extern crate env_logger; | ||
extern crate tungstenite; | ||
extern crate url; | ||
|
||
use std::net::TcpListener; | ||
use std::process::exit; | ||
use std::thread::{spawn, sleep}; | ||
use std::time::Duration; | ||
|
||
use tungstenite::{accept, connect, Error, Message}; | ||
use url::Url; | ||
|
||
#[test] | ||
fn test_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:3012").unwrap(); | ||
|
||
let client_thread = spawn(move || { | ||
let (mut client, _) = connect(Url::parse("ws://localhost:3012/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(); | ||
|
||
let message = client_handler.read_message().unwrap(); | ||
assert_eq!(message.into_data(), b"Hello WebSocket"); | ||
|
||
client_handler.close(None).unwrap(); // send close to client | ||
|
||
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(); | ||
} |