use futures::stream::{self, StreamExt};
|
|
use tokio::io;
|
|
use tokio::net;
|
|
use tokio::sync::mpsc;
|
|
|
|
use solstice::proto::server::{
|
|
Client, ClientOptions, Credentials, ServerRequest, ServerResponse,
|
|
UserStatusRequest, Version,
|
|
};
|
|
|
|
// Enable capturing logs in tests.
|
|
fn init() {
|
|
let _ = env_logger::builder().is_test(true).try_init();
|
|
}
|
|
|
|
async fn connect() -> io::Result<net::TcpStream> {
|
|
net::TcpStream::connect("server.slsknet.org:2242").await
|
|
}
|
|
|
|
fn make_user_name(test_name: &str) -> String {
|
|
format!("st_{}", test_name)
|
|
}
|
|
|
|
fn client_options(user_name: String) -> ClientOptions {
|
|
let password = "abcdefgh".to_string();
|
|
let credentials = Credentials::new(user_name, password).unwrap();
|
|
|
|
ClientOptions {
|
|
credentials,
|
|
version: Version::default(),
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn integration_connect() {
|
|
init();
|
|
|
|
let stream = connect().await.unwrap();
|
|
|
|
let options = client_options(make_user_name("connect"));
|
|
let client = Client::login(stream, options).await.unwrap();
|
|
|
|
let mut inbound = client.run(stream::pending());
|
|
|
|
assert!(inbound.next().await.is_some());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn integration_check_user_status() {
|
|
init();
|
|
|
|
let stream = connect().await.unwrap();
|
|
|
|
let user_name = make_user_name("check_user_status");
|
|
let options = client_options(user_name.clone());
|
|
let client = Client::login(stream, options).await.unwrap();
|
|
|
|
let (request_tx, mut request_rx) = mpsc::channel(1);
|
|
|
|
let outbound = Box::pin(async_stream::stream! {
|
|
while let Some(request) = request_rx.recv().await {
|
|
yield request;
|
|
}
|
|
});
|
|
|
|
let mut inbound = client.run(outbound);
|
|
|
|
request_tx
|
|
.send(ServerRequest::UserStatusRequest(UserStatusRequest {
|
|
user_name: user_name.clone(),
|
|
}))
|
|
.await
|
|
.unwrap();
|
|
|
|
while let Some(result) = inbound.next().await {
|
|
let response = result.unwrap();
|
|
if let ServerResponse::UserStatusResponse(response) = response {
|
|
assert_eq!(response.user_name, user_name);
|
|
return;
|
|
}
|
|
}
|
|
|
|
unreachable!();
|
|
}
|