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