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