diff --git a/proto/src/server/client.rs b/proto/src/server/client.rs index 2ba3b71..3deb61d 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: // - // - read error // - write error // - stream closed @@ -253,6 +252,41 @@ mod tests { server_task.await.expect("joining server"); } + #[tokio::test] + async fn login_read_error() { + 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("garbage").await.expect("writing garbage"); + }); + + let stream = TcpStream::connect(address).await.expect("connecting"); + + let err = Client::new(stream) + .login(credentials()) + .await + .expect_err("logging in"); + + match err { + ClientLoginError::ReadError(_) => {} + _ => panic!("wrong error: {:?}", err), + } + + server_task.await.expect("joining server"); + } + #[tokio::test] async fn login_success() { init();