From 6afced7d2ed34d7fecfa72364376fd2a8f69dc61 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Sun, 24 Jan 2021 16:28:49 +0100 Subject: [PATCH] Add small integration tests for proto::Client. --- tests/connect.rs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 tests/connect.rs diff --git a/tests/connect.rs b/tests/connect.rs new file mode 100644 index 0000000..399810d --- /dev/null +++ b/tests/connect.rs @@ -0,0 +1,84 @@ +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::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!(); +}