diff --git a/proto/src/server/client.rs b/proto/src/server/client.rs index 2771ef9..2ba3b71 100644 --- a/proto/src/server/client.rs +++ b/proto/src/server/client.rs @@ -156,7 +156,6 @@ mod tests { // TODO: Tests for all login error conditions: // - // - unexpected response // - read error // - write error // - stream closed @@ -203,6 +202,57 @@ mod tests { server_task.await.expect("joining server"); } + #[tokio::test] + async fn login_unexpected_response() { + 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::UserStatusResponse(UserStatusResponse { + user_name: "shruti".to_string(), + status: UserStatus::Online, + is_privileged: false, + })) + .await + .expect("writing user status response"); + }); + + let stream = TcpStream::connect(address).await.expect("connecting"); + + let err = Client::new(stream) + .login(credentials()) + .await + .expect_err("logging in"); + + match err { + ClientLoginError::UnexpectedResponse(response) => { + assert_eq!( + response, + ServerResponse::UserStatusResponse(UserStatusResponse { + user_name: "shruti".to_string(), + status: UserStatus::Online, + is_privileged: false, + }) + ); + } + _ => panic!("wrong error: {:?}", err), + } + + server_task.await.expect("joining server"); + } + #[tokio::test] async fn login_success() { init();