From 087fc9629047f9a8523053e1f02d95fd5721e1f7 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Thu, 11 Nov 2021 23:37:15 +0100 Subject: [PATCH] Add test for failed login. --- proto/src/server/client.rs | 52 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/proto/src/server/client.rs b/proto/src/server/client.rs index 2a89bef..2771ef9 100644 --- a/proto/src/server/client.rs +++ b/proto/src/server/client.rs @@ -133,7 +133,7 @@ mod tests { }; use crate::UserStatus; - use super::{Client, LoginInfo}; + use super::{Client, ClientLoginError, LoginInfo}; // Enable capturing logs in tests. fn init() { @@ -147,14 +147,62 @@ mod tests { Credentials::new(user_name, password).expect("building credentials") } + fn is_login_request(request: &ServerRequest) -> bool { + match request { + &ServerRequest::LoginRequest(_) => true, + _ => false, + } + } + // TODO: Tests for all login error conditions: // - // - login failed // - unexpected response // - read error // - write error // - stream closed + #[tokio::test] + async fn login_failed() { + init(); + + let listener = TcpListener::bind("localhost:0").await.expect("binding"); + let address = listener.local_addr().expect("getting local address"); + + let server_task = tokio::spawn(async move { + let (mut stream, _) = listener.accept().await.expect("accepting"); + let (read_half, write_half) = stream.split(); + let mut reader = FrameReader::new(read_half); + let mut writer = FrameWriter::new(write_half); + + let frame = reader.read().await.expect("reading login request"); + let request = frame.expect("unwrapping login request"); + assert!(is_login_request(&request)); + + writer + .write(&ServerResponse::LoginResponse(LoginResponse::LoginFail { + reason: "go away".to_string(), + })) + .await + .expect("writing login response"); + }); + + let stream = TcpStream::connect(address).await.expect("connecting"); + + let err = Client::new(stream) + .login(credentials()) + .await + .expect_err("logging in"); + + match err { + ClientLoginError::LoginFailed(reason, _worker) => { + assert_eq!(reason, "go away") + } + _ => panic!("wrong error: {:?}", err), + } + + server_task.await.expect("joining server"); + } + #[tokio::test] async fn login_success() { init();