|
|
|
@ -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();
|
|
|
|
|