use tokio::io; use tokio::net; use tokio::sync::mpsc; use solstice_proto::server::{ Client, Credentials, ServerResponse, UserStatusRequest, }; // 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 make_credentials(user_name: String) -> Credentials { let password = "abcdefgh".to_string(); Credentials::new(user_name, password).unwrap() } #[tokio::test] async fn integration_connect() { init(); let stream = connect().await.expect("connecting"); let credentials = make_credentials(make_user_name("connect")); let (_info, mut worker) = Client::new(stream) .login(credentials) .await .expect("logging in"); let (request_tx, request_rx) = mpsc::channel(100); let (response_tx, _response_rx) = mpsc::channel(100); let worker_task = tokio::spawn(async move { worker.run(response_tx, request_rx).await }); drop(request_tx); worker_task .await .expect("joining worker") .expect("running worker"); } #[tokio::test] async fn integration_check_user_status() { init(); let stream = connect().await.expect("connecting"); let user_name = make_user_name("check_user_status"); let credentials = make_credentials(user_name.clone()); let (_, mut worker) = Client::new(stream) .login(credentials) .await .expect("logging in"); let (request_tx, request_rx) = mpsc::channel(100); let (response_tx, mut response_rx) = mpsc::channel(100); request_tx .send( UserStatusRequest { user_name: user_name.clone(), } .into(), ) .await .expect("sending request"); let worker_task = tokio::spawn(async move { worker.run(response_tx, request_rx).await }); log::info!("Waiting for responses."); while let Some(response) = response_rx.recv().await { if let ServerResponse::UserStatusResponse(response) = response { assert_eq!(response.user_name, user_name); return; } } worker_task .await .expect("joining worker") .expect("running worker"); unreachable!(); }